微信支付Native下单API V3接口开发详解

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值