一、流程
1、用户请求支付,调用我方接口,我方根据订单信息和商品信息构造符合支付宝要求的请求参数(请求参数中具有一个我方的回调地址,当支付成功的时候,支付宝会回调这个接口)去请求一个支付二维码(可设置支付二维码的过期时间)。我方将支付二维码持久化到图片服务器,然后图片地址给前端,让前端展示给用户。
2、剩下这一步就是用户和支付宝的交互了。用户支付成功后,支付宝回调我们的接口,我们的接口开始去更新订单状态,写支付信息到我们的数据库中,如此一个完整的支付场景就完成了。支付宝会根据我们返回的值,判断这次交易是否成功,不成功则不扣钱。
二、难点
1、如何确保是支付宝回调的我们的接口?
如果是被恶意的第三方调用我们的接口,并且通过了将订单状态更新了,那么就相当于我们形成了损失。
支付宝自身提供了一套校验机制(这套校验机制是怎么做的,值得学习),我们可以通过调用支付宝的校验接口去校验回调是否来自支付宝。
2、如何保证幂等性?
如果是因为网络原因、用户多次点击。那么要保证这些操作造成的结果是一致的。
我的处理方案:先去数据库中查询状态,如果状态是订单已支付,那么返回支付已完成的消息,否则去更新订单信息。
缺点:如果正在更新状态,一个请求又过来了,那么还是不能保证幂等性。
改进:使用一个全局分布式锁,每次要进行这个操作(其中还是有查询状态这个操作),去持有这个分布式锁,执行成功之后去释放这个分布式锁(这是为了避免高并发带来的问题)。
网友评论