这几天做微信支付Native下单接口调用、签名这块,弄的我焦头烂额,翻了很多网上配置,各有不同,写的不清不楚,只能自己慢慢研究,尝试了无数种解决坑的方案,嚼文咬字看官方的文档调试,文档写得不清不楚,看得人云里雾里。
1、首先登录微信公众平台开通微信支付,开通配置各类信息 ,耗时1天
扫码注册微信支付商户号,开通native支付

设置APIV3秘钥,配置申请API证书并下载
2、下载官方提供的sdk源码进行开发,但是框架不实用,封装的各种类,但是没有示例代码,就没用了,用网上找得实例代码调式,耗时1天

3、生成签名、走了弯路,耗时1天
/**
* 生成签名
* @param string $method 请求方法 POST 或者GET
* @param string $url 请求URL
* @param string $request 请求中的请求报文主体
* @param $wxMerchantId商户号
* @param $certKey商户私钥
* @param $wxApiSerialNo商户API证书序列号
* @return string
*/
function RequestSign($method = "POST", $url = "", $request = "", $wxMerchantId,$certKey, $wxApiSerialNo)
{
#截取获取当前请求地址【去除域名】
$url_parts = parse_url($url);
$path = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
#获取当前时间戳
$timeStamp = time();//echo $timeStamp."-----";
#生成一个随机字符串
$nonceStr = $this->getNonceStr();//echo $nonceStr."-----";
#构造签名串
$requestSign = sprintf("%s\n%s\n%s\n%s\n%s\n", $method, $path, $timeStamp, $nonceStr, $request);
//echo $requestSign."---";
#计算计算签名值
$sign = $this->calculateSignatureValue($requestSign, $certKey);
#设置HTTP头获取Authorization
$token = $this->createToken($wxMerchantId, $nonceStr, $timeStamp, $wxApiSerialNo, $sign);
#返回
return $token;
}
/**
* 计算签名值
* @param $requestSign
* @param $certKey
* @return string
* 使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值
*/
function calculateSignatureValue($requestSign, $certKey)
{
$certKey = file_get_contents($certKey);
openssl_sign($requestSign, $raw_sign, $certKey, 'sha256WithRSAEncryption');
$sign = base64_encode($raw_sign);
return $sign;
}
/**
* 获取token
* @param $merchant_id
* @param $nonce
* @param $timestamp
* @param $serial_no
* @param $sign
* @return string
*/
function createToken($merchant_id, $nonce, $timestamp, $serial_no, $sign)
{
//$schema = 'WECHATPAY2-SHA256-RSA2048';
$token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
$merchant_id, $nonce, $timestamp, $serial_no, $sign);
return $token;
}
/**
* 产生随机字符串,不长于32位
* @param int $length
* @return string
*/
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;
}
弯路:让获取这个调用接口和下载这个平台证书,但是并没有用上,在网上命令下载出现报错,还是用的商户私钥,耗时1天


4、验签,耗时半天

5、Native下单API调用代码
$url ="https://api.mch.weixin.qq.com/v3/pay/transactions/native";
$arr = array(
'appid' =>$appid,
'mchid' =>$mchid,
'description' =>'订单',
'out_trade_no' =>$orderNo,
'attach' =>'pay',
'notify_url' =>$notify_url,
'amount' =>array(
'total' =>floatval($money)*100,
'currency' =>'CNY',
)
);
$paramString = json_encode($arr,JSON_UNESCAPED_UNICODE); //转换为json格式
#获取authorization
$authorization = $this->RequestSign("POST", $url, $paramString, $mchid, $this->wxMerchantApiPrivateKey, $this->wxApiSerialNo);
//print_r($authorization);exit;
#调用curlPost获取下单二维码链接
$result = $this->curlPostWithWx($url,$arr,$authorization);print_r($result);exit;
总结:微信支付v3新版接口的对接难点在于生成签名和验签,解决了这个开发速度就加快了,官方文档写的不清楚,只能自己摸索




















