0

最近在做银行的二维码支付接入,拿到文档后有几个地方不是很理解。
1.下载了签名的证书私钥(.sm2)、公钥(.cer)公钥直接导入,私钥证书不知道该怎么使用
2.由于使用的是php的demo,PHP代码通过调用LAJP来调取了JAVA环境进行签名。在php demo中签名后得到的数据不能通过测试的验签,不知道是哪一步除了错
附上网页端的测试demo:http://wxpay.cmbc.com.cn/cmbc...
提供的本地签名函数:
<?php

require_once("php_java.php");//引用LAJP提供的PHP脚本
   try
    {
       $signAlg = $_REQUEST['signAlg'];
       $base64SourceData = $_REQUEST['base64SourceData'];
       $base64P12Data = $_REQUEST['base64P12Data'];
       $p12Password = $_REQUEST['p12Password'];
       $ret = lajp_call("cfca.sadk.api.SignatureKit::P1SignMessage",  $signAlg,$base64SourceData, $base64P12Data,$p12Password);
       echo "{$ret}<br>";
    }
catch(Exception $e)
{
  echo "Err:{$e}<br>";
}
?><a href="index.html">return</a>
2017-05-06 提问
1 个回答
0

已采纳
一、第一个问题,带证书,应该使用curl
 /**
     *     作用:使用证书,以post方式提交xml到对应的接口url
     */
    function postXmlSSLCurl($xml, $url, $second = 30, $wxpay_config) {
            $ch = curl_init();
            //超时时间
            curl_setopt($ch, CURLOPT_TIMEOUT, $second);
            //这里设置代理,如果有的话
            
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            //设置header
            curl_setopt($ch, CURLOPT_HEADER, FALSE);
            //要求结果为字符串且输出到屏幕上
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            //设置证书
            //使用证书:cert 与 key 分别属于两个.pem文件
            //默认格式为PEM,可以注释
            curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');
            curl_setopt($ch, CURLOPT_SSLCERT, $wxpay_config['SSLCERT_PATH']);
            //默认格式为PEM,可以注释
            curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');
            curl_setopt($ch, CURLOPT_SSLKEY, $wxpay_config['SSLKEY_PATH']);
            //post提交方式
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
            $data = curl_exec($ch);
            //返回结果
            if ($data) {
                curl_close($ch);
                return $data;
            } else {
                $error = curl_errno($ch);
                echo "curl出错,错误码:$error" . "<br>";
                // echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
                curl_close($ch);
                return false;
            }
    }

二、签名的话
你试着用PHP同样的参数自己生产签名跟java环境比对看看。一般来说应该是不能共用的吧。之前遇到过app里面的微信支付通过php生成的签名给过来app用,这个之前好像是行不通的。

撰写答案

推广链接