发布时间: 浏览次数:6194次
由于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 = "<xml>"; foreach ( $data as $key => $val ) { if (is_numeric ( $val )) { $xml .= "<" . $key . ">" . $val . "</" . $key . ">"; } else { $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">"; } } $xml .= "</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证书,反之则需要根据安装证书部分的指引,升级证书。(具体升级请查看官方文档)