最近在做银行的二维码支付接入,拿到文档后有几个地方不是很理解。
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-16 13:04:18
一、第一个问题,带证书,应该使用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用,这个之前好像是行不通的。