支付链路全景

小程序支付不是「点一下就扣钱」,而是一段多环节链路:客户端下单 → 服务端创建订单并调微信统一下单 → 客户端拉起支付 → 用户付款 → 微信异步通知服务端 → 服务端发货。任何一环没处理好,都会出现「钱扣了但没发货」或「发了货但钱没来」。

支付的黄金法则:以异步回调为准,前端的支付结果只是提示,不能当发货依据。
链路四要素
  • 订单本地先建,状态待支付。
  • 预支付服务端换 prepay_id。
  • 回调验签后才更新订单。
  • 对账每日与微信账单核对。
小程序支付订单配图:中央圆形收银台轮廓,周围环绕半透明卡片状订单单据与一枚圆形金币图标
收银台周围环绕着一张张订单单据。

订单状态机

订单要有明确状态:待支付、已支付、已发货、已退款、已关闭。状态只能按固定路径流转,不能从「待支付」直接跳到「已退款」。用状态机管理,比在代码里到处 if 判断可靠得多。

统一下单与拉起支付

客户端不要直接拿商户密钥下单,而是请求自家服务端。服务端用商户号调微信 V3 统一下单接口,拿到 prepay_id,再把小程序拉起支付所需的时间戳、随机串、签名返回给前端。前端用 wx.requestPayment 拉起收银台。

// 前端伪代码
wx.requestPayment({
  timeStamp, nonceStr, package, signType, paySign,
  success: () => {},   // 仅用于提示
  fail: () => {}
});

回调验签与幂等

微信会把支付结果异步 POST 到你的回调地址。先验签确认是微信发来的、再解密报文,最后按「商户订单号」更新订单。关键是幂等:同一个通知可能重发多次,必须保证重复回调不会发两次货。

退款与对账

退款也走微信 V3 接口,结果同样以异步通知为准。上线后必须做每日对账:下载微信账单,和本地订单逐笔比对,找出「本地有、微信没有」或金额不一致的单子。对账是支付系统的最后一道防线。

支付安全要点
  • 密钥不出服务端前端不碰商户私钥。
  • 金额服务端算前端传的金额不可信。
  • 回调必验签防伪造通知。