本人介绍小程序支付的流程, 仅为个人理解所做笔记
小程序需要用公司的身份去注册, 才有支付权限
同时需要先准备4个参数 appid, secret, 商户号id, 商户号秘钥
调用wx.requestPayment(OBJECT)发起微信支付, 在调用之前需要先拿到所需参数
官方支付的示例代码:
除了回调函数, 这5个参数都是必须的
timeStamp -- 时间戳, 即当前的时间
nonceStr -- 随机字符串, 长度为32个字符以下, 推荐生成随机数算法: 调用随机数函数生成,将得到的值转换为字符串
package -- 从统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=*
signType -- 签名类型,默认为MD5, 直接写MD5
paySign -- 签名
package参数需要开发者服务器获取
拿到所需参数以后就可以调用wx.requestPayment发起微信支付
开发者服务器主要操作步骤:
1. 得到openid
调用登陆接口先获取用户的openid
openid是用户唯一标识, 用于生成商品订单(下图中可看出openid的作用)
如何得到openid, 可见:https://blog.csdn.net/lljxk2008/article/details/82286031
2. 生成prepay_id, 开发者服务器调用如下接口
接口URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder 这里需要传入大量参数:
如下的参数sign需要通过算法得到:(这是第一次签名)
假设传送的参数如下:
appid: wxd930ea5d5a258f4f
mch_id: 10000100
device_info: 1000
body: test
nonce_str: ibuaiVcKdpRxkhJA
参数按字典顺序先后 appid -> body ->device_info ...
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
拼接完后, 再把key拼接在最后, 再进行加密, 得到参数sign
stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注:key为商户平台设置的密钥key
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5签名方式
最终发送数据时, 再把sign加上去
wxd930ea5d5a258f4f
10000100
1000
test
ibuaiVcKdpRxkhJA
9A0A8659F005D6984697E2CA0A9CF3B7
字段名 | 变量名 | 必填 | 描述 |
---|---|---|---|
小程序ID | appid | 是 | 微信分配的小程序ID |
商户号 | mch_id | 是 | 微信支付分配的商户号 |
随机字符串 | nonce_str | 是 | 随机字符串,长度要求在32位以内 |
签名 | sign | 是 | 通过签名算法计算得出的签名值 |
商品描述 | body | 是 | 商品简单描述,该字段请按照规范传递 |
商户订单号 | out_trade_no | 是 | 商户系统内部订单号,要求32个字符内且在同一个商户号下唯一 |
标价金额 | total_fee | 是 | 订单总金额,单位为分 |
终端IP | spbill_create_ip | 是 | APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。 |
通知地址 | notify_url | 是 | 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 |
交易类型 | trade_type | 是 | 小程序取值如下:JSAPI |
3. 完成上面两步后, 开发者服务器进行组合数据二次签名(如上图)
统一下单成功会返回微信预支付订单号prepay_id,我们需要根据这个prepay_id进行二次签名
二次签名的算法与第一次签名算法相同, 二次签名所用参数有:
appid timeStamp nonceStr package signType key
假设用paySign表示签名结果
签名完成后, 将这appid timeStamp nonceStr package signType 与 paySign一起返回给小程序
小程序拿到支付所需的这些参数后, 发起微信支付(wx.requestPayment)
这一步是由小程序直接与微信服务器交互:
官方完整支付流程时序图 :
最后支付完成后, 开者服务器需要维护更新订单状态, 这样差不多就完成了支付过程