支付链路全景
小程序支付不是「点一下就扣钱」,而是一段多环节链路:客户端下单 → 服务端创建订单并调微信统一下单 → 客户端拉起支付 → 用户付款 → 微信异步通知服务端 → 服务端发货。任何一环没处理好,都会出现「钱扣了但没发货」或「发了货但钱没来」。
支付的黄金法则:以异步回调为准,前端的支付结果只是提示,不能当发货依据。
链路四要素
- 订单本地先建,状态待支付。
- 预支付服务端换 prepay_id。
- 回调验签后才更新订单。
- 对账每日与微信账单核对。
订单状态机
订单要有明确状态:待支付、已支付、已发货、已退款、已关闭。状态只能按固定路径流转,不能从「待支付」直接跳到「已退款」。用状态机管理,比在代码里到处 if 判断可靠得多。
统一下单与拉起支付
客户端不要直接拿商户密钥下单,而是请求自家服务端。服务端用商户号调微信 V3 统一下单接口,拿到 prepay_id,再把小程序拉起支付所需的时间戳、随机串、签名返回给前端。前端用 wx.requestPayment 拉起收银台。
// 前端伪代码
wx.requestPayment({
timeStamp, nonceStr, package, signType, paySign,
success: () => {}, // 仅用于提示
fail: () => {}
});
回调验签与幂等
微信会把支付结果异步 POST 到你的回调地址。先验签确认是微信发来的、再解密报文,最后按「商户订单号」更新订单。关键是幂等:同一个通知可能重发多次,必须保证重复回调不会发两次货。
退款与对账
退款也走微信 V3 接口,结果同样以异步通知为准。上线后必须做每日对账:下载微信账单,和本地订单逐笔比对,找出「本地有、微信没有」或金额不一致的单子。对账是支付系统的最后一道防线。
支付安全要点
- 密钥不出服务端前端不碰商户私钥。
- 金额服务端算前端传的金额不可信。
- 回调必验签防伪造通知。
常见坑
最常见的坑是把前端 success 当成发货依据——用户杀掉进程、回调丢失,订单就永远停在待支付。正确做法是轮询本地订单状态 + 以回调为准,并加一个主动查询补单的定时任务兜底。
小结与延伸阅读
支付与订单体系的核心是「状态机 + 回调验签 + 幂等 + 对账」四件套。把这四件事做扎实,钱和货就不会对不上。
- 微信支付基础读《微信支付接入全流程指南》。
- 消息触达读《微信小程序订阅消息推送实战》。
- 订单裂变读《小程序分享裂变与社交传播实战》。