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

开发文档学习

借图一用,个人认为这张图包含了微信支付的架构理念(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 MBxmlParseOptions: {normalize: true,normalizeTags: true, explicitArray: false},verify: function(req, res, buf, encoding) {if(buf && buf.length) {// Store the raw XMLreq.rawBody = buf.toString(encoding || "utf8");}}}));复制代码
3.二次签名报缺少参数或参数错误

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

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

5.没有支付权限

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

转载于:https://juejin.im/post/5c6bd54ff265da2dce1f395d

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

  1. 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee' ...

  2. python个人微信支付接口_Python实现微信小程序支付功能

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...

  3. python微信小程序抢购_Python实现微信小程序支付功能!Python确实强的一批!

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...

  4. 微信小程序支付功能用服务器吗,微信小程序 支付功能 服务器端(TP5.1)实现...

    首先下载微信支付SDK ,将整个目录的文件放在 /application/extend/WxPay 目录下 在使用SDK之前我们需要对 WxPay.Config.php 进行配置 namespace ...

  5. SpringBoot对接微信小程序支付功能开发(一,下单功能)

    1,接入前准备: 接入模式选择直连模式: 申请小程序,得到APPID,并开通微信支付: 申请微信商户号,得到mchid,并绑定APPID: 配置商户API key,下载并配置商户证书,根据微信官方文档 ...

  6. 基于springboot微信小程序支付功能实现

    基于springboot微信小程序支付功能实现 简单的封装微信小程序支付功能,支付工具类所依赖的fastjson.lombok.wagegger, 1.添加maven依赖: 版本号可根据自己项目的实际 ...

  7. 微信小程序 支付功能

    微信小程序 支付功能 最近用微信小程序写了一个支付页,感觉与之前上网查的内容有些区别,记下来以供后日查看 1.判断用户登录是否过期 可以直接使用微信提供的API,即wx.checkSession 2. ...

  8. 十 Node.js实现微信小程序支付功能

    十 Node.js实现微信小程序支付功能 一 开发前提 二 支付流程介绍 三 上代码 1.小程序端发起后台请求,完成统一下单 1.1 小程序端发起后台请求 1.2 Node.js后台接收请求,完成统一 ...

  9. 微信小程序支付功能实现全过程简析

    今天小编带大家来分析一下微信小程序支付功能的实现全过程. 先附一张小程序支付时序图: 整体流程: 在所以操作之前,我们得先有微信开发者账号,还得有自己的商户号和商品密匙. 微信端请求下单之后,会调用w ...

最新文章

  1. CommonJS规范与AMD规范的理解
  2. LAMP网站架构方案分析
  3. linux script录屏文件夹,linux下录屏和回放工具script和scriptreplay
  4. ubuntu 安装pycharm
  5. 《Oracle达人修炼秘籍:Oracle 11g数据库管理与开发指南 》一3.6 卸载Oracle 11g产品...
  6. NGINX + TOMCAT7 + MEMCACHED 实现SESSION 共享
  7. 怎样让VB6程序只能运行一次
  8. vmware提示虚拟机似乎正在使用中
  9. 一次失败的做题经历(HDU2112)
  10. 使用html制作个人简历(新手)
  11. 科普 | 到底什么是移动边缘计算?
  12. bzoj1005 [HNOI2008]明明的烦恼(Prufer数列+高精度(wys算法。。。))
  13. win7计算机时间显示错误,Win7每次重新启动时计算机显示时间都是错误的
  14. 进位位判别法_判断加减法溢出时,可采用判断进位的方式,如果符号位的进位为C...
  15. vnc 键盘慢_在基于Web的VNC应用程序中支持多种键盘布局
  16. 光合作用c3和c5变化语言叙述,浅议光合作用中C3和C5的含量变化
  17. 专科学历事业单位工资计算机,【事业单位工资标准表】 事业单位学历工资标准...
  18. 敢创业但不敢上台演讲?
  19. java ssm野生动物公益保护网站系统
  20. UltraEdit 21.30.1006.0 繁体中文破解版(功能最强的文本编辑器)

热门文章

  1. 系统服务器是什么意思,什么是服务器
  2. android studio视频教程
  3. 天刀手游服务器注册不了,天涯明月刀手游开服常见问题汇总 天涯明月刀手游10月16日开服...
  4. dyld2 dyld3
  5. 精心推荐8款实用国产软件,非常强大
  6. 人工智能与大数据的应用
  7. 使用有限内存对大型数据文件排序
  8. 微信小程序前端设计,以北京动物园为例
  9. android架构师解压密码,咕泡Java架构师第三期完整版
  10. 手写的汉字评分matlab,基于深度学习的手写汉字美感评分