微信 JSAPI 支付的流程是:
服务端根据情况,向微信服务器发起“下单”请求。此处需要提供自己维护唯一的订单号,并要求签名加密。
根据“下单”反馈的微信提供的预支付“订单号”,用刚才下单请求参数同样的签名方式,对几个基本数据进行封包签名。
将签名摘要,和这几个基本数据,传输给 JavaScript 端。
JavaScript 通过微信内置对象的方法,唤起支付,并前端返回支付操作结果。
微信服务端会异步通知服务端,支付结果;此处通知地址是之前“下单”时指定的。
如果因故服务端没有收到通知,可以主动发起查询,使用之前向微信服务端“下单”时提供的自己维护唯一的订单号。
.
经过试验,我发现了这么几个有意思的现象。
首先,支付参数里边有时间戳,但哪怕过了 5 分钟,这个时间戳及相关配套参数,依然可以用于支付。
.
其次,在微信预支付订单过期之前,用时间戳生成支付参数,拖到订单过期之后使用,报过期。这意味着微信可能根本就没有去识别微信支付参数里边的时间戳,或许只检查了非常基本的时间顺序性:支付时间戳不得早于预支付下单时间(?未验证)
.
第三,对于重复支付,具备如下现象。
○ 特殊发现:在微信登记订单,是跟微信账号绑定的。一个订单,利用外部系统订单号,换微信去查询,依然是无此订单。
一个微信号 pending ,用另一个微信号再发起支付,报订单与微信号不一致。
一个微信号 cancel ,此微信单,同微信可以再支付,别的微信不能。
一个微信号 ok ,此微信单,同微信报已支付,别的微信报订单与微信号不一致。
.
本文还发表于在其它网站
CSDN : https://blog.csdn.net/ShaneLooLi/article/details/104021907
ITeye : https://www.iteye.com/blog/surmounting-2512113
中国开源社区: https://my.oschina.net/shane1984/blog/3159557