一直想把这块总结一下,比较重要,先简单记录下,后面慢慢详细。
这里的支付处理,我想分成两块,一块是订单设计;一部分是支付设计。
一、先说第一块,订单
1、下单页查询用户信息,商品信息,优惠券信息
2、前端用户下单,计算金额
3、前端提交到后端
4、后端校验金额,商品,
二、支付设计
1、选择支付类型,发起支付
2、创建支付单
3、申请第三方支付
4、前端带支付单和第三方支付单号发起微信或支付宝支付
5、用户输入支付密码
6、系统等待支付回调
7、系统轮询调度查询支付结果
8、前端页面同时每3秒查询一次支付结果
9、6和7得到支付成功结果后,发送支付成功mq消息
10、mq消息中加分布式锁,做幂等处理,最后缓存支付结果到redis,供前端页面查询使用.
11、mq消息中,如果订单已经取消或者订单已经支付,邮件通知“取消订单支付成功”或“订单重复支付”
三、调用链路
1、web系统接受前端申请支付,并创建支付单。根据支付路由策略,调用支付系统,并把支付单带到支付系统。
2、支付系统调用第三方支付或者微信支付宝,传参支付单号,并返回第三方支付或者微信支付宝的支付单号。
3、web系统将支付系统返回的第三方支付单号给前端,前端调用jsapi唤起支付。
4、订单和支付单一对多的关系,可以保证用户消息支付后可以再次支付,并且用户重复支付后可以将每次支付的记录保存。
5、用户在前端支付成功后,在支付成功页面,每3秒种调用web系统支付结果查询接口,查询支付状态。
6、调度系统每分钟执行待支付订单支付结果查询任务。这里可以将调度、查询待支付数据、支付成功处理分别放在调度系统,辅助系统,和主系统中。这样做的好处,不但可以将系统功能进行拆分,还可以在高并发下减轻主系统的压力,因为每分钟执行待支付订单查询,可能因为数量量大时,导致主系统压力过大,所以建议拆分出去。
7、辅助系统在查询到待支付订单时,调用支付系统查询订单支付状态,如果订单支付成功,发送mq到主系统,执行订单支付成功处理任务。
8、在支付系统同时定义回调接口,在申请第三方或者微信支付宝支付时,将回调地址传递给第三方或微信支付宝。在支付成功后,第三方或微信支付宝通知支付系统。支付系统在收到支付成功通知后,发送mq到主系统,执行订单支付成功处理任务。
9、支付成功后,主系统判断订单是否支付成功。如果支付成功,判断是否重复支付,如果更新支付单状态,不更新订单状态,并邮件通知;如果支付成功,判断订单是否取消,如果是更新支付单状态,不更新订单状态,并邮件通知;获取订单分布式锁,执行业务处理;在业务处理中,先更新订单状态(包括订单的支付渠道),再更新支付单状态,再更新其它同步处理业务(如果有),再发送业务处理mq处理异步业务(如果有),最后将订单支付成功缓存redis。
10、前端页面在支付成功后,跳转支付成功等待页,每3秒调后台查询支付结果,这里的查询接口并不会查询数据库,而且查询第九步缓存到redis的状态。