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.实现代码
- 小程序获取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) 使用微信的在线签名工具检查签名是否和程序生成的一致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");}}}));复制代码
参数的格式必须严格按照文档要求,参数需要用使用驼峰(之前用下划线app_id这种类型一 直报参数错误...)
var ret = {appId: appid,package:'prepay_id='+prepayid,nonceStr: noncestr,signType:'MD5',timeStamp: timestamp,
};复制代码
5.没有支付权限
检查该小程序账号是否已经获取了支付资格。
转载于:https://juejin.im/post/5c6bd54ff265da2dce1f395d
nodejs实现微信小程序支付功能及相关问题总结相关推荐
- 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解
微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee' ...
- python个人微信支付接口_Python实现微信小程序支付功能
正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...
- python微信小程序抢购_Python实现微信小程序支付功能!Python确实强的一批!
正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...
- 微信小程序支付功能用服务器吗,微信小程序 支付功能 服务器端(TP5.1)实现...
首先下载微信支付SDK ,将整个目录的文件放在 /application/extend/WxPay 目录下 在使用SDK之前我们需要对 WxPay.Config.php 进行配置 namespace ...
- SpringBoot对接微信小程序支付功能开发(一,下单功能)
1,接入前准备: 接入模式选择直连模式: 申请小程序,得到APPID,并开通微信支付: 申请微信商户号,得到mchid,并绑定APPID: 配置商户API key,下载并配置商户证书,根据微信官方文档 ...
- 基于springboot微信小程序支付功能实现
基于springboot微信小程序支付功能实现 简单的封装微信小程序支付功能,支付工具类所依赖的fastjson.lombok.wagegger, 1.添加maven依赖: 版本号可根据自己项目的实际 ...
- 微信小程序 支付功能
微信小程序 支付功能 最近用微信小程序写了一个支付页,感觉与之前上网查的内容有些区别,记下来以供后日查看 1.判断用户登录是否过期 可以直接使用微信提供的API,即wx.checkSession 2. ...
- 十 Node.js实现微信小程序支付功能
十 Node.js实现微信小程序支付功能 一 开发前提 二 支付流程介绍 三 上代码 1.小程序端发起后台请求,完成统一下单 1.1 小程序端发起后台请求 1.2 Node.js后台接收请求,完成统一 ...
- 微信小程序支付功能实现全过程简析
今天小编带大家来分析一下微信小程序支付功能的实现全过程. 先附一张小程序支付时序图: 整体流程: 在所以操作之前,我们得先有微信开发者账号,还得有自己的商户号和商品密匙. 微信端请求下单之后,会调用w ...
最新文章
- CommonJS规范与AMD规范的理解
- LAMP网站架构方案分析
- linux script录屏文件夹,linux下录屏和回放工具script和scriptreplay
- ubuntu 安装pycharm
- 《Oracle达人修炼秘籍:Oracle 11g数据库管理与开发指南 》一3.6 卸载Oracle 11g产品...
- NGINX + TOMCAT7 + MEMCACHED 实现SESSION 共享
- 怎样让VB6程序只能运行一次
- vmware提示虚拟机似乎正在使用中
- 一次失败的做题经历(HDU2112)
- 使用html制作个人简历(新手)
- 科普 | 到底什么是移动边缘计算?
- bzoj1005 [HNOI2008]明明的烦恼(Prufer数列+高精度(wys算法。。。))
- win7计算机时间显示错误,Win7每次重新启动时计算机显示时间都是错误的
- 进位位判别法_判断加减法溢出时,可采用判断进位的方式,如果符号位的进位为C...
- vnc 键盘慢_在基于Web的VNC应用程序中支持多种键盘布局
- 光合作用c3和c5变化语言叙述,浅议光合作用中C3和C5的含量变化
- 专科学历事业单位工资计算机,【事业单位工资标准表】 事业单位学历工资标准...
- 敢创业但不敢上台演讲?
- java ssm野生动物公益保护网站系统
- UltraEdit 21.30.1006.0 繁体中文破解版(功能最强的文本编辑器)