我一直想总结这个,因为很重要,所以先简单记录一下,之后慢慢详细。
这里的支付处理,我想分成两部分。 一个是订单设计。 一部分是支付设计。
一、先说第一块,下单
1、在订单页面查询用户信息、商品信息、优惠券信息
2、前端用户下单,计算金额
3、将前端提交给后端
4、后端核对金额、商品、
二.支付设计
1、选择支付类型,开始支付
2、制作付款单
3、向第三方申请付款
4、向前端持有支付单和第三方支付号码开始微信或支付宝(Alipay )支付
5、用户输入支付密码
6、系统等待支付回调
7、系统轮询时间表查询支付结果
8、前台同时每3秒查询一次支付结果
9、6、7在获得支付成功的结果后,发送支付成功mq消息
10、对mq消息进行分布式锁定,进行乘幂等处理,最后将支付结果缓存在redis中,用于前端页面查询。
11、在mq消息中,订单取消或订单已支付时,通过邮件通知“取消订单支付成功”或“订单重复支付”
三.呼叫链接
1、web系统接受前端报销申请,制作付款单。 根据支付渠道策略,调用支付系统,将支付单带到支付系统。
2、支付系统调用第三方支付或微信支付宝(Alipay ),传递支付号码,返回第三方支付或微信支付宝(Alipay )支付号码。
3、web系统将支付系统返回的第三方支付号码传递给前端,前端调用jsapi提醒支付。
4、订单与支付的一对多关系可以保证用户消息支付后可以再次支付,并且可以在用户重复支付后保存每次支付的记录。
5、用户在前端支付成功后,在支付成功的页面上,每3秒调用web系统支付结果查询界面,查询支付状态。
6、调度系统执行每分钟计划支付订单支付结果查询任务。 这里,可以将调度、支付预定数据查询、支付成功处理分别放置在调度系统、辅助系统、主系统中。 这样,不仅可以分割系统的功能,还可以以高并发性减轻主系统的压力。 这是因为,如果运行计划在一分钟内支付的订单查询,数量大可能会增加主系统的压力,因此建议进行分割。
7、辅助系统查询待付订单时,调用支付系统查询订单的支付状态,订单支付成功时,将mq发送到主系统,执行订单支付成功的处理任务。
8、支付系统同时定义回叫界面,申请支付第三方或微信支付宝(Alipay )时,将回叫地址传递给第三方或微信支付宝(Alipay )。 成功支付后,第三方或微信支付宝(Alipay )会通知支付系统。 支付系统收到支付成功通知后,将mq发送到主系统,执行订单支付成功处理任务。
9、支付成功后,主系统判断订单是否支付成功。 付款成功时,判断是否重复付款,更新付款单据状态时,不更新订单状态,通过邮件通知; 付款成功时,判断订单是否已取消,更新付款单据状态时,不更新订单状态,通过邮件通知; 获取订单分布式锁定,执行业务处理; 在业务处理中,先更新订单状态(包括订单的支付通道),再更新支付单据状态,更新其他同步处理业务(如果有),然后发送业务处理mq处理异步业务(如果有),最后成功缓存订单的支付
10、前台在支付成功后,跳转到支付成功的等待页面,每3秒在后台查询支付结果。 这里的查询接口不查询数据库。 此外,在第九步中查询redis中缓存的状态。