nodejs实现微信小程序支付功能及相关问题总结

简介: 最近使用nodejs作为服务器,搭建了一个微信小程序。其中的微信支付功能是比较复杂的一部分。不过只要我们能掌握微信支付的工作流程,那实现这个功能也不会很难的。下面分享此次微信支付的实现经历。

最近使用nodejs作为服务器,搭建了一个微信小程序。其中的微信支付功能是比较复杂的一部分。不过只要我们能掌握微信支付的工作流程,那实现这个功能也不会很难的。下面分享此次微信支付的实现经历。  

1.开发文档学习

借图一用,个人认为这张图包含了微信支付的架构理念(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=3)

商户系统和微信支付系统主要交互:

实现流程:

=> 获取微信用户的openid (小程序端获取传到后台)

=> 预下单获取prepay_id ,sign签名(后台根据相关参数进行签名)

=> 小程序端发送支付请求(根据后台返回的prepay_id和sign)

2.实现代码

  1. 小程序获取openid
//小程序端
wx.login({
  success(res) {
    if (res.code) {
      // 发起网络请求
      wx.request({
        url: 'https://test.com/onLogin',
        data: {
          code: res.code
        },
        success:function(res){
          let openId = res.data.openid//获取后台返回的openid
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})
//nodejs端
 var request = require('request')
 const JSCODE = ''(前端传过来的值)
 let wxUrl = "https://api.weixin.qq.com/sns/jscode2session"//小程序appid,secret等信息存在后台的配置文件中
var url = wxUrl + 'appid=' + Config.wxLogin.appid + '&secret=' + Config.wxLogin.secret
var js_code = req.query.js_code
url = url + '&js_code=' + js_code + '&grant_type=authorization_code'
request(url, function (error, response, body) {
    if (error) {
        var results = Util.formatErrorRes(error);
        res.json(results);
        return    }
    var results = Util.formatRes(body);
    res.json(results);
}

2. 后台根据相关参数获取prepay_id,sign签名

  =>后端格式化参数(根据小程序统一下单文档的需要)

  =>后台带参数请求微信统一下单地址(其中notify_url后端接受支付结果的接口地址)

  =>请求成功解析小程序返回的xml格式数据(引入npm包xmlreader,主要获取prepay_id

  =>根据返回的值进行二次签名生成签名字符串(与prepay_id一起返回给前端)

  =>前端根据返回的签名和prepay_id进行支付请求

  =>微信支付成功,微信服务器将支付结果发到之前设置的notify_url

  =>根据微信后台返回的结果,更新用户信息

   注:此部分代码较多,近期会整理下放在GitHub,如果哪位道友着急需要可在下方评论中说明

3.问题总结

  1. 支付签名错误 (主要看第二条)
微信官方回答
1) 使用微信的在线签名工具检查签名是否和程序生成的一致
    https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1
    签名工具用谷歌打开。选择MD5,XML,然后把请求参数xml放进去,就能校验签名。
2)如果和微信的在线签名工具一致,说明程序没有错误,确定是API密钥错误
   (被别人改动或者记错了)在商户平台的账户信息中更改API密钥(账户设置-安全设置-API安全),
   15分钟后生效
   2.1)统一下单用的是A商户号,也必须是A商户号登陆商户平台设置key才对。
   2.2)要注意统一下单请求参数中total_fee参数的类型是int类型。
3) 如果和微信的在线签名工具不一致,说明程序有错误,
    常见的错误可能是:
    3.1) 编码问题,确保所有的都是utf-8的. 如果有中文, 可以先把中文改成英文重新签名,
    看是否签名错误,如果英文不会错中文才会错,基本肯定是编码问题
    3.2:)消息中字段大小写和文档中完全一致

 按照上述需求进行配置就可以解决支付签名错误的问题了。

2.express微信支付回调值req.body为空{}

    支付返回的格式是xml,查找到原因是express4.x里将body-parser分离出来,变成像其他中间件的使用方式,

所以我们需要在app.js中增加中间件

var bodyParser = require("body-parser");
require("body-parser-xml")(bodyParser);
// 解析支付回调的xml数据
app.use(bodyParser.xml({
    limit: "1MB",
   // Reject payload bigger than 1 MB
    xmlParseOptions: {
        normalize: true,
        normalizeTags: true, 
        explicitArray: false
    },
    verify: function(req, res, buf, encoding) {
        if(buf && buf.length) {
            // Store the raw XML
            req.rawBody = buf.toString(encoding || "utf8");
        }
    }}));

3.二次签名报缺少参数或参数错误

 参数的格式必须严格按照文档要求,参数需要用使用驼峰(之前用下划线app_id这种类型一      直报参数错误...)

var ret = {
    appId: appid,
    package:'prepay_id='+prepayid,
    nonceStr: noncestr,
    signType:'MD5',
    timeStamp: timestamp,
};

5.没有支付权限

检查该小程序账号是否已经获取了支付资格。


相关文章
|
7月前
|
JSON 缓存 小程序
技术笔记:uniapp微信小程序支付
技术笔记:uniapp微信小程序支付
|
小程序 Android开发 iOS开发
微信小程序-虚拟支付:适用场景 / iPhone调试用支付成功,Android调用失败,提示“小程序支付能力已被限制” / “errMsg“.“requestPayment:fail banned”
微信小程序-虚拟支付:适用场景 / iPhone调试用支付成功,Android调用失败,提示“小程序支付能力已被限制” / “errMsg“.“requestPayment:fail banned”
575 0
|
小程序 API
10行代码实现微信小程序支付功能,使用小程序云开发实现小程序支付功能(含源码)
10行代码实现微信小程序支付功能,使用小程序云开发实现小程序支付功能(含源码)
411 0
|
JSON 小程序 安全
微信小程序支付
当下,微信小程序十分火爆,现在无论是购物还是生活服务,都是推荐你使用微信小程序,主要是它无需下载安装就可以使用,让手机变得非常清爽,给用户也带来很大的方便之处。
246 2
微信小程序支付
|
小程序 前端开发 API
微信小程序-支付
微信小程序-支付
239 0
|
小程序 Java
记录一次微信小程序支付调试的坑
记录一次微信小程序支付调试的坑
197 0
|
小程序 开发工具 数据库
借助小程序云开发实现小程序支付功能第4节(代码实现)
借助小程序云开发实现小程序支付功能第4节(代码实现)
197 0
|
小程序 安全 IDE
借助小程序云开发实现小程序支付功能(含源码)
借助小程序云开发实现小程序支付功能(含源码)
164 0
|
XML 小程序 前端开发
mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能
其实微信支付有很多种形式,刷脸,扫码,APP支付,小程序支付等,这边只说明小程序支付的实现,不过原理上都大同小异。 首先,需要注册微信公众号平台[https://mp.weixin.qq.com](https://mp.weixin.qq.com/),并且开通微信支付功能,随后将你的小程序关联一个微信商户:pay.weixin.qq.com,这一系列申请下来之后,你手中需要有微信小程序appid,微信小程序秘钥,商户号,以及商户秘钥,这四个关键的支付配置变量。
mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能
|
小程序 API
uniapp 微信小程序 如何进行支付
uniapp 微信小程序 如何进行支付
446 0

热门文章

最新文章