PHP获取微信支付v2预支付参数prepay_id后在小程序端完成支付

本文介绍了如何在PHP中获取微信支付的prepay_id,并在小程序端完成支付。关键步骤包括从微信返回数据中提取prepay_id,使用MD5或HMAC-SHA256进行二次签名,确保appid的大小写正确,nonce_str一致,以及时间戳参数匹配。在小程序端,通过JS代码拉起微信支付收银台。

PS:在上一篇文章中,通过对主体上传xml数据进行签名获取到了微信返回的数据,将返回的xml数据中的prepay_id提取出来后就可以进行下一步: 对prepay_id以及其他所需参数进行在此签名并将数据返回小程序端
PHP代码:

$timeStamp = time();
$postData = array(                            //再次签名的主体内容
    'appId' => 'appId=此处写你的appid',
    'nonceStr' => 'nonceStr=' . $nonce_str,
    'package' => 'package=prepay_id=' . $prepay_id,
    'signType' => 'signType=MD5',
    'timeStamp' => 'timeStamp=' . $timeStamp,
    'key' => 'key=此处写你的APIv2key',
);

$disposeData = implode('&', $postData);  //将签名主体内容由数组转化为字符串
$getPaySign = MD5($disposeData);  //使用MD5进行签名
$paySign = strtoupper($getPaySign);
$payBody = array(          //返回给小程序的内容
    'timeStamp' => (string)$timeStamp,
    'nonceStr' => $nonce_str,
    'package' => 'prepay_id='.$prepay_id,
    'signType' => 'MD5',
    'paySign' => $paySign,
);
$getpreData = json_encode($payBody);
echo $getpreData;

PS:上方PHP代码中需要注意的是:进行再签名的数据中,appId中的I是大写,在上一篇文章中的appid是小写,在此签名中的nonce_str与上一篇中获取prepay_id所需要的nonce_str是同一个变量,不需要再次生成第二个32位随机字符串,参与签名的时间戳与返回给微信的时间戳做好保持相同

小程序端JS代码:

getxml(){
    var test = this
   wx.getStorage({        //此处openid是从缓存中获取,我在app.js中获取openid,并将其存入本地缓存之中
      key:'openid',
      success(res){
        console.log(res)
        test.setData({
          'openid':res.data
        })
        console.log(test.data.openid)
      }
    })
    wx.request({
      url: 'http://192.168.0.103:2908/wxPayV2/getPrepay_id.php', //此处改为你的PHP文件地址
      method:'POST',
      header:{
        'content-type':'application/x-www-form-urlencoded'
      },
      data:{
        'openid':test.data.openid,
        'description':'0.38mm.pen', //商品描述,这里我写死了,方便后期测试用的,注意修改
        'total':1  //总费用,单位为分,实际使用请乘100使其变为元
      },
      success(res){
        console.log(res)
 //      test.setData({                         //这一段内容看情况可以舍弃
 //        'nonceStr':res.data.nonceStr,
 //        'package':res.data.package,
 //        'paySign': res.data.paySign,
 //        'timeStamp': res.data.timeStamp
 //       })
        wx.requestPayment({
          nonceStr: res.data.nonceStr,
          package: res.data.package,
          paySign: res.data.paySign,
          timeStamp: res.data.timeStamp,
          signType: res.data.signType,
          success(res){
            console.log(res)
          }
        })
      }
    })
  },

以上就是如何在小程序端拉起微信支付收银台,总体来看,完成微信支付v2 JSAPI支付,总计需要两次签名,可以选择使用MD5与HMAC-SHA256进行签名,注意appid参数的大小写,注意两次签名中生成的nonce_str要相同,参与签名的时间戳参数也要与返回小程序端的时间戳保持相同


本文原创为优快云用户:缱绻淡蓝海

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值