银联扫码支付及静态码回调验签

/**
 * 构建支付的数据包
 * @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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值