程序开发常见支付功能开发错误总结全攻略

why 80 2024-10-14

微信小程序 支付功能开发错误总结

小程序开发常见支付功能开发错误总结全攻略

微信小程序支付终于踩完坑了,发现里面坑挺大的,现在发个贴,希望以后入坑的同学可以看一下 :

https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=2

业务流程在这里大家看文档的时候可以看到。第一个坑,获取用户的openid,参数一定要拼在url连接上,否则会报{"errcode":40013,"errmsg":"invalid appid, hints: [ req_id: iil1ba0504ns86 ]"}错误

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

onLoad: function () {

 var that = this

 wx.login({

  success: function (res) {

   if (res.code) {

    //发起网络请求

    wx.request({

     url: 'https://api.weixin.qq.com/sns/jscode2session?appid=wxaacf22345345cfc7162fe3&secret=83ebd41c3e6f34a49b3a34578063434548ff3f71&js_code=' + res.code + '&grant_type=authorization_code',

     method: "POST",

     success: function (res) {

      that.setData({

       openid: res.data.openid

      })

     }

    })

   } else {

    console.log('获取用户登录态失败!' + res.errMsg)

   }

  }

 });

}

第二个坑,支付统一下单接口,签名这个坑是比较多人遇到问题的这个是MD5加密经常和签名工具里面的加密签名不一样

签名加密工具地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1

签名加密的时候要转成utf-8,加密我用自己的接口进行加密的 digest.update(data.getBytes("utf-8"));

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

// 统一下单接口获取sign(签名)

paysignjsapi: function (appid, attach, body, mch_id, nonce_str, notify_url, openid, out_trade_no, spbill_create_ip, total_fee, trade_type, key) {

 var self = this;

 //加密签名

 wx.request({

  url: 'http://localhost:8080/XinXingWXApi/wxXcxApi/Md5Encrypt.do',

  method: 'GET',

  data: {

   appid: appid,

   attach: attach,

   body: body,

   mch_id: mch_id,

   nonce_str: nonce_str,

   notify_url: notify_url,

   openid: openid,

   out_trade_no: out_trade_no,

   spbill_create_ip: spbill_create_ip,

   total_fee: total_fee,

   trade_type: trade_type,

   key: key

  },

  //统一下单

  success: function (res) {

   var sign = res.data.strMd5

   var formData = "<xml>"

   formData += "<appid>" + appid + "</appid>" //appid

   formData += "<attach>" + attach + "</attach>" //附加数据

   formData += "<body>" + body + "</body>"    //标题

   formData += "<mch_id>" + mch_id + "</mch_id>" //商户号

   formData += "<nonce_str>" + nonce_str + "</nonce_str>" //随机字符串,不长于32位。

   formData += "<notify_url>" + notify_url + "</notify_url>" //异步接收微信支付结果通知的回调地址

   formData += "<openid>" + openid + "</openid>"  //用户Id

   formData += "<out_trade_no>" + out_trade_no + "</out_trade_no>" //商户订单号

   formData += "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>"

   formData += "<total_fee>" + total_fee + "</total_fee>" //金额

   formData += "<trade_type>" + trade_type + "</trade_type>"  //公共号支付

   formData += "<sign>" + sign + "</sign>"//签名

   formData += "</xml>"

返回数据解析xml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//请求统一下单接口

   wx.request({

    url: "https://api.mch.weixin.qq.com/pay/unifiedorder",

    method: &#39;POST&#39;,

    data: formData,

    success: function (data) {

     wx.request({

      url: "http://localhost:8080/XinXingWXApi/wxXcxApi/xmlAnalyze.do?strXml=" + data.data,

      method: &#39;POST&#39;,

      success: function (res) {

       var pk = &#39;prepay_id=&#39; + res.data.prepayId;

       var timeStamp = self.createTimeStamp();

       //获取支付签名,并支付

       self.getsignType(appid, timeStamp, nonce_str, pk, "MD5", key);

      }

     })

    }

   })

  }

 });

}

第三就是调用支付了,这里也有几个小坑,第一就是appId很多写成appid就不行了,第二个就是preoatid 的参数格式要写对prepay_id=wx2017011711060194dccf725232155886323 第三个就是调用支付的时候报支付签名错误,也需要到签名接口查看签名是否一致,查看参数是否是对的,调用微信支付的时候必须加上appId

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

getsignType: function (appid, timeStamp, nonce_str, pk, signType, key) {

  var that = this;

  wx.request({

   url: "http://localhost:8080/XinXingWXApi/wxXcxApi/getSignType.hn",

   method: &#39;GET&#39;,

   data: {

    appId: appid,

    timeStamp: timeStamp,

    nonceStr: nonce_str,

    pk: pk,

    signType: signType,

    key: key

   },

   success: function (res) {

    console.log(res.data.paySign)

    var paySign = res.data.paySign

    //调用微信支付

    wx.requestPayment({

     &#39;appId&#39;: appid,

     &#39;timeStamp&#39;: timeStamp,

     &#39;nonceStr&#39;: nonce_str,

     &#39;package&#39;: pk,

     &#39;signType&#39;: &#39;MD5&#39;,

     &#39;paySign&#39;: paySign,

     &#39;success&#39;: function (res) {

      console.log(res);

      console.log(&#39;success&#39;);

     },

     &#39;fail&#39;: function (res) {

      console.log(res);

      console.log(&#39;fail&#39;);

     },

     &#39;complete&#39;: function (res) {

      // console.log(res);

      console.log(&#39;complete&#39;);

     }

    });

   }

  })

 }



版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序 UI 与容器组件详细介绍教程指南
下一篇:小程序开发实现点击控件选中反选功能实例全解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~