微信支付流程
微信支付业务流程时序图详见官方文档。
- 商户调用统一下单接口,生成预支付交易单,微信支付侧返回prepay_id。
- 商户通过各类方式(js、native、小程序等)调起微信支付,发起支付请求,请求中需带有上步中的prepay_id,微信支付返回的结果包括成功、失败和取消。
- 微信支付回调商户的支付结果通知接口,告知支付结果和transaction_id,商户侧需存储transaction_id,以供查询订单状态
- 商户侧可以通过订单查询接口,以订单号或transaction_id来查询微信支付中订单的状态
支付流程分析
支付是一个流程长、易出错的业务,中间涉及用户、微信、银行、商户等多个主体,因此在架构上不适合或者不可能采用同步接口的流程。采用异步流程,虽然系统架构复杂,但可以带来更高的并发性能,更好的用户体验。
微信支付中的prepay_id和transaction_id,类似于分布式事务中的二阶段提交算法,首先在微信中创建预支付交易单prepay_id(对应prepare阶段),然后再执行复杂的扣款流程,扣款成功后,微信支付回调商户,生成正式交易单transaction_id(对应commit阶段)。同时提供了订单查询接口,以及对账机制,来保证数据的最终一致性。
同时,prepay_id又可以防止用户重复支付,因为用户调用微信支付时使用的是同一个prepay_id,没有必要更换,更换后会造成重复支付。
二阶段提交算法详见这篇文章。