PHP调用微信支付沙箱环境的API接口验证(近期微信支付将更换根证书为了验证证书)

发布时间: 浏览次数: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证书,反之则需要根据安装证书部分的指引,升级证书。(具体升级请查看官方文档)