where(['user_id' => $userId])->one(); $signing = Signing::find()->where(['order_no' => $orderNom])->one(); $data = [ 'cusid' => $this->cusid, 'appid' => $this->appid, 'version' => '11', 'trxamt' => $signing->moy * 100, 'reqsn' => $signing->order_no, 'paytype' => 'W06', 'randomstr' => date('dHis') . rand(1000000, 9999999), 'signtype' => 'RSA', 'front_url' => $frontUrl, 'notify_url' => 'http://app.cxgj.dev.1nww.com/api/signing/signing-pay-notify', 'acct' => $userOauth->openid, 'sub_appid' => 'wxbcdac64cf147ee22', ]; $data['sign'] = urlencode($this->sign($data)); $request = $this->ToUrlParams($data); $res = $this->request('https://vsp.allinpay.com/apiweb/unitorder/pay', $request); $result = json_decode($res, true); if ($result['retcode'] !== 'SUCCESS') { return $this->apiReturnError('支付错误', $result); } return $this->apiReturnSuccess('success', $result); } public function notify($data) { if (!$this->ValidSign($data)) { return false; } $signing = Signing::find()->where(['order_no' => $data['outtrxid'], 'status' => 0])->one(); if (!$signing) { return true; } $signing->status = 1; $signing->trxid = $data['trxid']; $signing->pay_time = time(); return $signing->save(); } public function refund($signingId) { $signing = Signing::findOne($signingId); if ($signing && $signing->status == 1) { $data = [ 'cusid' => $this->cusid, 'appid' => $this->appid, 'trxamt' => $signing->moy * 100, 'reqsn' => date('YmdH') . rand(10000, 99999), 'oldtrxid' => $signing->trxid, 'randomstr' => date('YmdH') . rand(10000, 99999), 'signtype' => 'RSA', ]; $data['sign'] = urlencode($this->sign($data)); $request = $this->ToUrlParams($data); $res = $this->request('https://vsp.allinpay.com/apiweb/tranx/refund', $request); $result = json_decode($res, true); if ($result['trxstatus'] == '0000') { $signing->status = 2; $signing->save(); return $this->apiReturnSuccess('操作成功'); } return $this->apiReturnError($result['errmsg']); } return $this->apiReturnError('订单异常'); } //RSA签名 public function sign(array $array) { ksort($array); $bufSignSrc = $this->ToUrlParams($array); $private_key = $this->privateKey; $private_key = chunk_split($private_key, 64, "\n"); $key = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($private_key) . "-----END RSA PRIVATE KEY-----"; // echo $key; if (openssl_sign($bufSignSrc, $signature, $key)) { // echo 'sign success'; } else { echo 'sign fail'; } $sign = base64_encode($signature);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的 return $sign; } public function ToUrlParams(array $array) { $buff = ""; foreach ($array as $k => $v) { if ($v != "" && !is_array($v)) { $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; } /** * 校验签名 * @param array 参数 * @param unknown_type appkey */ public function ValidSign(array $array) { $sign = $array['sign']; unset($array['sign']); ksort($array); $bufSignSrc = $this->ToUrlParams($array); $public_key = $this->publicKey; $public_key = chunk_split($public_key, 64, "\n"); $key = "-----BEGIN PUBLIC KEY-----\n$public_key-----END PUBLIC KEY-----\n"; $result = openssl_verify($bufSignSrc, base64_decode($sign), $key); return $result; } //发送请求操作仅供参考,不为最佳实践 public function request($url, $params) { $ch = curl_init(); $this_header = array("content-type: application/x-www-form-urlencoded;charset=UTF-8"); curl_setopt($ch, CURLOPT_HTTPHEADER, $this_header); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//如果不加验证,就设false,商户自行处理 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $output = curl_exec($ch); curl_close($ch); return $output; } public function apiReturnSuccess($msg = "ok", $data = [], $code = 0) { return [ 'code' => $code, 'msg' => $msg, 'data' => $data ]; } public function apiReturnError($msg = "failed", $data = [], $code = 1) { return [ 'code' => $code, 'msg' => $msg, 'data' => $data ]; } }