3-4 小程序支付流程介绍
接口版本说明
本课程使用 APIv3 版本接口,这也是微信当前主推的版本。已使用 V2 版本的项目后续可以迁移到 V3。
业务流程时序图
整个支付流程涉及三方角色:
用户(小程序) ←→ 商户系统后台 ←→ 微信支付系统
text
完整流程(22 步)
| 步骤 | 执行方 | 动作 | 说明 |
|---|---|---|---|
| 1 | 用户 | 点击下单 | 小程序内触发 |
| 2-6 | 商户后台 | 创建订单 + JSAPI 下单 | 调用微信下单接口获取 prepay_id |
| 7 | 商户后台 | 返回签名参数 | 将签名后的支付信息返回小程序 |
| 8 | 小程序 | wx.requestPayment | 调起原生支付界面 |
| 9-12 | 用户 | 选择支付方式 + 输入密码 | 微信原生支付流程 |
| 13-14 | 微信 | 扣款 + 通知商户 | 微信验证并扣款 |
| 15 | 微信 → 商户 | 支付结果通知(POST) | 异步通知商户支付结果 |
| 16 | 商户 | 保存通知 + 返回确认 | 告知微信已收到通知 |
| 17 | 微信 → 用户 | 显示支付成功 | |
| 18 | 小程序 | 查询支付状态 | 主动查询(双保险) |
| 19-22 | 商户 → 微信 | 查单 + 返回结果 | 形成支付闭环 |
核心步骤详解
步骤三:JSAPI 下单
商户后台调用微信的 JSAPI 下单接口,核心参数:
| 参数 | 说明 |
|---|---|
appid | 小程序 APPID |
mchid | 商户号 |
description | 商品描述 |
out_trade_no | 商户订单号(唯一) |
amount.total | 金额(单位:分,1 元 = 100) |
payer.openid | 支付者的 OpenID |
notify_url | 支付结果通知地址(HTTPS) |
成功后返回 prepay_id(预付单标识)。
步骤八:调起支付
小程序使用 wx.requestPayment 调起支付:
wx.requestPayment({
timeStamp: '', // 时间戳
nonceStr: '', // 随机字符串
package: '', // 统一下单接口返回的 prepay_id
signType: 'RSA', // 签名类型
paySign: '', // 签名
});
javascript
所有参数由商户后台在步骤 6-7 生成。
步骤十五:支付结果通知
微信服务器向商户的 notify_url 发送 POST 请求:
- 通知数据为 JSON 格式
- 包含加密的支付结果详情
- 需要使用 APIv3 密钥解密
双保险机制
为什么需要同时有"通知"和"查询"?
| 问题 | 说明 |
|---|---|
| 用户可能切后台 | 服务器不知道用户何时完成支付 |
| 通知可能丢失 | 网络问题导致通知未送达 |
| 不能轮询 | 频繁查询微信接口浪费资源 |
解决方案:
- 被动通知:微信主动通知商户支付结果
- 主动查询:用户确认支付后,商户主动查询一次
三方职责总结
| 角色 | 职责 |
|---|---|
| 小程序(前端) | 发起支付、展示支付结果 |
| 商户后台(我们的 API) | 生成参数、确认并保存订单结果 |
| 微信支付系统 | 通知支付结果、验证支付权限 |
参考资源
- 微信支付开发指引 - 小程序支付开发指引
- wx.requestPayment - 小程序支付 API
↑