小程序学习笔记 -- requestPayment

本人介绍小程序支付的流程, 仅为个人理解所做笔记

小程序需要用公司的身份去注册, 才有支付权限

同时需要先准备4个参数 appidsecret, 商户号id, 商户号秘钥

调用wx.requestPayment(OBJECT)发起微信支付, 在调用之前需要先拿到所需参数

官方支付的示例代码:

除了回调函数, 这5个参数都是必须的

timeStamp -- 时间戳, 即当前的时间

nonceStr -- 随机字符串,  长度为32个字符以下, 推荐生成随机数算法: 调用随机数函数生成,将得到的值转换为字符串

package -- 从统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=*

signType -- 签名类型,默认为MD5, 直接写MD5

扫描二维码关注公众号,回复: 3569528 查看本文章

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加上去
<xml>
  <appid>wxd930ea5d5a258f4f</appid>
  <mch_id>10000100</mch_id>
  <device_info>1000<device_info>
  <body>test</body>
  <nonce_str>ibuaiVcKdpRxkhJA</nonce_str>
  <sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>
<xml>
字段名 变量名 必填 描述
小程序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)

这一步是由小程序直接与微信服务器交互:

官方完整支付流程时序图 :

å°ç¨åºæ¯ä»æ¶åºå¾

 最后支付完成后, 开者服务器需要维护更新订单状态, 这样差不多就完成了支付过程

猜你喜欢

转载自blog.csdn.net/lljxk2008/article/details/82722322