/*** 构建支付的数据包* @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); //设置urlcurl_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); // 自动设置Referercurl_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
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;
}