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


    /**
     * 构建支付的数据包
     * @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;
    }
  • 相关阅读:
    分类预测 | Matlab实现GA-XGBoost遗传算法优化XGBoost的多特征分类预测
    回顾本科毕设内容,用惯了PyTorch环境,结果用tensorflow环境一直出错,没错,本篇博客就是记录用tensorflow的错(自用!)
    【Android安全】Binder解析
    wsl2 ubuntu22.04安装docker
    MCS:离散随机变量——Hyper Geometric分布
    Hive的基本SQL操作(DDL篇)
    Reflex WMS中阶系列3:显示已发货可换组
    【高级交换技术】配置QinQ终结子接口接入VLL示例
    套接字编程
    2022/11/12 json格式转换对象 动态sql
  • 原文地址:https://blog.csdn.net/dengpengquan/article/details/128116503