/**
* 构建支付的数据包
* @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
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;
}