发布时间: 浏览次数:6505次
由于SSL/TLS协议有多种实现版本(OpenSSL, NSS, GnuTLS, JSSE, Schannel等),且在不同实现版本和操作系统中管理权威机构根CA证书的策略不一样,应用程序使用SSL/TLS的方法也存在差异。
为了确保微信支付更换服务证书后,不影响商户的正常交易。下面提供了两种方式供商户提前验证客户端是否支持了DigiCert的证书。
如你的验证结果为无影响,可忽略安装证书部分的内容。
调用微信支付沙箱环境的API接口验证
微信支付已经将新的服务器证书部署到了沙箱域名(apitest.mch.weixin.qq.com), 由于服务器证书是支持多域名的,API域名(api.mch.weixin.qq.com)与沙箱域名(apitest.mch.weixin.qq.com)使用的是同一张证书。如果使用沙箱环境的接口能调用成功,通常表明客户端支持微信支付新的服务器证书。
function postXmlCurl($xml,$url,$second = 30){
$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);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
throw new Exception("curl出错,错误码:$error");
}
}
function getNonceStr($length = 32){
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
function ToXml($data) {
$xml = "";
foreach ( $data as $key => $val ) {
if (is_numeric ( $val )) {
$xml .= "<" . $key . ">" . $val . "";
} else {
$xml .= "<" . $key . ">";
}
}
$xml .= "";
return $xml;
}
function MakeSign($data,$apikey) {
//支付APIkey值
//$apikey = '';
// 签名步骤一:按字典序排序参数
ksort ( $data );
$string = ToUrlParams ( $data );
// 签名步骤二:在string后加入KEY
$string = $string . "&key=" . $apikey;
// 签名步骤三:MD5加密
$string = md5 ( $string );
// 签名步骤四:所有字符转为大写
$result = strtoupper ( $string );
return $result;
}
function ToUrlParams($data) {
$buff = "";
foreach ( $data as $k => $v ) {
if ($k != "sign" && $v != "" && ! is_array ( $v )) {
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim ( $buff, "&" );
return $buff;
}
$apikey = '';//api的key值
$data['mch_id'] = '';//商户号
$url = "https://apitest.mch.weixin.qq.com/sandboxnew/pay/getsignkey";
$data['nonce_str'] = getNonceStr();//随机字符串
//生成签名
$data['sign'] =MakeSign($data,$apikey);
$xml = ToXml($data);
$response = postXmlCurl($xml, $url);
if(!empty($response)){
$response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
}
var_dump($response);
注:执行前需要填写api的key值、商户号,执行后查看
当返回结果return_code为“SUCCESS”,说明当前客服端已支持DigCert证书,反之则需要根据安装证书部分的指引,升级证书。(具体升级请查看官方文档)