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


Posted in Javascript onFebruary 21, 2017

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

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

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 ]"}错误

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"));

// 统一下单接口获取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

//请求统一下单接口
    wx.request({
     url: "https://api.mch.weixin.qq.com/pay/unifiedorder",
     method: 'POST',
     data: formData,
     success: function (data) {
      wx.request({
       url: "http://localhost:8080/XinXingWXApi/wxXcxApi/xmlAnalyze.do?strXml=" + data.data,
       method: 'POST',
       success: function (res) {
        var pk = 'prepay_id=' + res.data.prepayId;
        var timeStamp = self.createTimeStamp();
        //获取支付签名,并支付
        self.getsignType(appid, timeStamp, nonce_str, pk, "MD5", key);
       }
      })
     }
    })
   }
  });
 }

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

getsignType: function (appid, timeStamp, nonce_str, pk, signType, key) {
  var that = this;
  wx.request({
   url: "http://localhost:8080/XinXingWXApi/wxXcxApi/getSignType.hn",
   method: 'GET',
   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({
     'appId': appid,
     'timeStamp': timeStamp,
     'nonceStr': nonce_str,
     'package': pk,
     'signType': 'MD5',
     'paySign': paySign,
     'success': function (res) {
      console.log(res);
      console.log('success');
     },
     'fail': function (res) {
      console.log(res);
      console.log('fail');
     },
     'complete': function (res) {
      // console.log(res);
      console.log('complete');
     }
    });
   }
  })
 }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
基于jquery实现的省市区级联无ajax
Sep 24 Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 Javascript
jquery取消事件冒泡的三种方法(推荐)
May 28 Javascript
详解JavaScript中双等号引起的隐性类型转换
May 30 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
Jun 06 Javascript
JavaScript面试题大全(推荐)
Sep 22 Javascript
js实现小窗口拖拽效果
Dec 03 Javascript
Bootstrap导航条鼠标悬停下拉菜单
Jan 04 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
Jan 19 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
May 02 Javascript
js统计页面上每个标签的数量实例代码
May 29 Javascript
国内常用的js类库大全(CDN公共库)
Jun 24 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 #Javascript
jquery实现下拉框左右选择功能
Feb 21 #Javascript
jquery实现页面加载效果
Feb 21 #Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
Feb 21 #Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
Feb 21 #Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 #Javascript
使用get方式提交表单在地址栏里面不显示提交信息
Feb 21 #Javascript
You might like
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
使用PHP接收POST数据,解析json数据
2013/06/28 PHP
分享下PHP register_globals 值为on与off的理解
2013/09/26 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
Python中有趣在__call__函数
2015/06/21 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
python 读入多行数据的实例
2018/04/19 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
python global和nonlocal用法解析
2020/02/03 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
Python 如何批量更新已安装的库
2020/05/26 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
招聘单位介绍信
2014/01/14 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
出差报告怎么写
2014/11/06 职场文书
开学第一周值周总结
2015/07/16 职场文书
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby
css3 选择器
2022/05/11 HTML / CSS