/** * 构建支付的数据包 * @param $merchantCode * @param $terminalCode * @param $transactionAmount * @param $transactionCurrencyCode * @param $merchantOrderId * @param $merchantRemark * @param $payMode * @param $payCode * @return array */ private function buildPayBody($merchantCode, $terminalCode, $transactionAmount,$transactionCurrencyCode, $merchantOrderId,$merchantRemark, $payMode,$payCode) { $map = [ 'merchantCode' => $merchantCode, 'terminalCode' => $terminalCode, 'transactionAmount' => $transactionAmount, 'transactionCurrencyCode' => $transactionCurrencyCode, 'merchantOrderId' => $merchantOrderId, 'merchantRemark' => $merchantRemark, 'payMode' => $payMode, 'payCode' => $payCode, 'deviceType' => 11, //实体终端传对应设备类型的值,虚拟终端传值“11” 'ip' => OtherHelper::getClientIp() ]; return $map; } /** * 返回Authorization 认证头部 * @param $appid * @param $appkey * @param $timestamp * @param $nonce * @param $body * @return string */ private function getSignHeader($appid, $appKey, $timestamp, $nonce, $body) { $localSignatureStr = $this->getSignString($appid, $appKey, $timestamp, $nonce, $body); $signHeader = "OPEN-BODY-SIG AppId=\"$appid\",Timestamp=\"$timestamp\",Nonce=\"$nonce\",Signature=\"$localSignatureStr\""; return $signHeader; } /** * 数据签名 * @param $appid * @param $appkey * @param $timestamp * @param $nonce * @param $body * @return string */ private function getSignString($appid, $appKey, $timestamp, $nonce, $body) { $cryptData = bin2hex(hash('sha256', json_encode($body), true)); $hashValue = base64_encode(hash_hmac('sha256', $appid . $timestamp . $nonce . $cryptData, $appKey, true)); return $hashValue; } private static function scanPost($url, $data, $authorization) { $postdata = json_encode($data); $headers = [ 'AUTHORIZATION:' . $authorization, "Accept: application/json", "Content-Type:application/json;charset=utf-8", 'Content-Length:' . strlen($postdata) ]; $curl = curl_init(); //初始化 curl_setopt($curl, CURLOPT_URL, $url); //设置url curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在 设为0表示不检查证书 设为1表示检查证书中是否有CN(common name)字段 设为2表示在1的基础上校验当前的域名是否与CN匹配 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); curl_setopt($curl, CURLOPT_TIMEOUT, 60); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 $result = curl_exec($curl); if ($result === false) { return curl_error($curl); } $result = json_decode($result, true); curl_close($curl); return $result; } private static function qrcodePost($url, $data, $headers = []) { $client = new Client(); $url = self::URL_BASE . $url; $headers['Content-Type'] = "application/json"; $ret = $client->post($url, json_encode($data), $headers)->send(); $ret = $ret->getData(); $successCodeList = ['SUCCESS', '0000']; if (!in_array($ret['errCode'], $successCodeList)) { throw new Exception($ret['errInfo'] . $ret['errMsg'], $ret['errCode']); } return $ret; }
/** * 银联静态码回调验签 * * @param $array * @param $md5key * @return bool */ public static function checkSign($array, $md5key) { $array['billPayment'] = json_encode($array['billPayment'], JSON_UNESCAPED_UNICODE); $str =self::buildSignStr($array); $arraylist= explode("&",$str); sort($arraylist); $signData=[]; $strForSign="";//待签串 for($i=0;$i<count($arraylist);$i++) //把它们全部输出来 { $arr=explode("=",$arraylist[$i],2); $signData[$arr[0]]=$arr[1]; if($i<count($arraylist)-1){ if($arr[0]!='sign'){ $strForSign=$strForSign.$arraylist[$i]."&"; }else{ $signbf=$arr[1]; } }else{ $strForSign=$strForSign.$arraylist[$i].$md5key; } } if($array['signType']=='MD5'){ $calSign=strtoupper(md5($strForSign)); }else{ $calSign=strtoupper(bin2hex(hash('sha256', $strForSign, true))); } return $array['sign'] == $calSign ? true : false; }
public static function buildSignStr($params) { $keys = []; foreach($params as $key => $value) { if ($key == 'sign' || empty($value)) { continue; } array_push($keys, $key); } $str = ''; sort($keys); $len = count($keys); for($i = 0; $i < $len; $i++) { $v = $params[$keys[$i]]; if (is_array($v)) { $v = json_encode($v); } $str .= $keys[$i] . '=' . $v . (($i === $len -1) ? '' : "&"); } return $str; }