欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

订单支付异常处理

程序员文章站 2024-03-23 23:08:04
...

场景

最近在做一个陪玩的业务,我是服务端开发,里面牵扯到了订单以及支付,我们接入的非支付宝或微信,而是公司内部专门的经济系统(支付系统),经济系统的同事提供了以下

1.预扣款接口,这时候用户钱被暂时扣掉,此时还没有进入主播口袋
2.确认接口,主播接单后调用此接口会把预扣款接口扣除的钱打给主播
3.退还接口,调用此接口会把预扣款的钱给退回,一般订单超时或者主播拒绝接单以后会这么调用

用户 客户端 服务端 经济系统 ts_id为经济系统交易流水号,全局唯一 浏览商品 立即支付 各种check库存,xxx等 携带 unique_code请求经济系统 根据unique_code做幂等 余额是否充足以及其他条件 用户支付失败 check失败则返回错误码 支付失败,请稍后重试 生成预扣款订单 返回ts_id 创建订单记录 支付成功 用户 客户端 服务端 经济系统 序列图sequence(示例)

业务开发过程中,发现请求经济系统接口有超时的情况,如下图,这时候我们处理方式让经济系统提供一个查询接口,根据uniqid_code去查看订单是否已经生成,如果生成则继续返回

用户 客户端 服务端 经济系统 ts_id为经济系统交易流水号,全局唯一 浏览商品 立即支付 各种check库存,xxx等 携带 unique_code请求经济系统 根据unique_code做幂等 余额是否充足以及其他条件 用户支付失败 请求超时主动断开链接 根据unique_code查询是否订单已经创建完成 根据unique_code查询是否订单已经创建完成 生成预扣款订单 根据unique_code查询是否订单已经创建完成 根据unique_code查询,拿到了ts_id 创建订单记录 支付成功 用户 客户端 服务端 经济系统 序列图sequence(示例)
上述环节我们是处理请求支付系统下单接口超时的时候的逻辑,我增加了轮询,可能我们请求支付系统,支付系统超时了,但是过一段时间支付系统请求完成以后我们通过轮询依然拿到了ts_id,可以保障我们业务继续处理下去
但是这种方法还是有漏洞,假如支付系统正好在我们轮询了几次以后停止轮询以后才创建好订单呢,这种情况如果不处理就会出现漏单的情况,所以我们继续补充流程,如下图
用户 客户端 服务端 经济系统 ts_id为经济系统交易流水号,全局唯一 浏览商品 立即支付 各种check库存,xxx等 携带 unique_code请求经济系统 根据unique_code做幂等 余额是否充足以及其他条件 用户支付失败 请求超时主动断开链接 根据unique_code查询是否订单已经创建完成 根据unique_code查询是否订单已经创建完成 根据unique_code查询是否订单已经创建完成 返回给客户异常,同时把unique_code记录到exception_orders中 系统繁忙,请稍后重试 会有个核查的脚本,假设名为 checkOrderWorker,一直扫描pendding_orders中的订单 根据unique_code查询是否订单已经创建完成 拿到ts_id,认为订单创建成功,此时执行退款,因为已经报给客户失败了,所以这里静默退款即可 根据unique_code查询是否订单已经创建完成 根据unique_code查询是否订单已经创建完成 根据unique_code查询是否订单已经创建完成 根据unique_code查询是否订单已经创建完成 请求一分钟后,依然没有返回,查无ts_id,暂时标记订单为失败 记录到exception_ordersbiao中,进行最后的人工数据核对 用户 客户端 服务端 经济系统 序列图sequence(示例)

订单环节比较重要,牵扯到金钱交易,一定要谨慎再谨慎,切不可完全相信第三方服务,
一定要在我们自己的业务范围内,把各类异常处理好,但即便如此,我们依然无法从技术层面做到100%的保证订单成功(不要杠支付宝的支付,那不是一回事儿),一定是技术+客服+运营 协同处理

原先1W笔订单100笔异常,我们优化后1W笔只有1笔异常,我们就是减轻了运营和客服的100倍的压力,这就是我们所做的贡献

相关标签: 需求