这几天做微信支付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新版接口的对接难点在于生成签名和验签,解决了这个开发速度就加快了,官方文档写的不清楚,只能自己摸索