聚合支付:支付订单状态的转换

目前在负责一个聚合支付系统,该系统初期通过项目方式开发,由于前期沟通,开发等原因遗留较多问题,近期将通过一系列反思对项目进行梳理重构,首先梳理支付订单的状态变换,

一笔订单的生命

  • 一笔订单生成后首先需要记录在案,这个时候需要记录该订单状态为刚刚创建,还未发起支付
  • 订单创建后就要让客户发起支付了,对于聚合支付系统来说,存在多种方式发起支付

对于银行卡支付交易,必须在发起支付前记录为支付中状态
对于微信支付宝被扫交易,必须在发起支付前记录为支付中状态
对于微信支付宝下单交易,由于纯粹的下单交易并无法让客户发起支付,在调用下单接口前后记录为支付中状态均可
总的来说,对支付结果有影响的接口调用必须在调用前将订单状态置为支付中,如果无影响则均可

  • 接下来就是支付结果了,成功,失败,但还有一个状态未知,其实状态未知可以归到支付中状态,例如银行卡扣款超时
  • 对于通过先下单后支付的订单还存在关闭的可能

订单状态归纳

  • 初始化
  • 处理中
  • 成功
  • 失败
  • 关闭

针对订单有哪些操作


  • 创建一笔订单
  • 对一笔订单发起支付
  • 关闭订单
  • 修改订单状态为支付成功
  • 修改订单状态为支付失败

  • 创建一笔退款订单
  • 发起退款
  • 修改退款订单状态为退款成功
  • 修改退款订单状态为退款失败

  • 创建一笔撤销订单
  • 发起撤销
  • 修改撤销订单状态为撤销成功
  • 修改撤销订单状态为撤销失败

  • 订单查询

订单子系统如何与外围子系统交互

事实上我们发现在聚合支付系统中,除了创建订单以及发起支付外,订单最终状态并不由聚合支付系统决定,而是由第三方支付系统等决定,不能因为支付系统发生其他错误时导致订单状态不正确,所以分布式服务的情况下,可以用最终一致性来解决事务不一致产生的问题;因此我们将支付成功,支付失败,退款成功,退款失败,撤销成功,撤销失败等第三方返回的状态从交易中解耦,通过事件来通知订单子系统


对于正向订单其操作及状态转移图如下:


image.png

正向订单操作业务逻辑

  • 创建一笔订单
    1. 检查输入参数
    2. 将订单状态设置为初始化并持久化订单数据
    3. 可能的业务异常:订单号重复(ERROR)
  • 对一笔订单发起支付
    1. 检查输入参数
    2. 查询订单将订单状态设置为处理中
    3. 补充订单相关数据并持久化
    4. 可能的业务异常:订单已发起支付,不能重复支付(ERROR)
  • 关闭订单(幂等)
    1. 检查输入参数
    2. 查询订单并校验订单状态是否可关闭
    3. 将订单状态设置为已关闭
    4. 可能的业务错误:订单已发起支付不能关闭(INFO)
  • 修改订单状态为支付成功(幂等)
    1. 检查输入参数
    2. 查询订单并校验订单状态
    3. 可能的业务错误:订单未发起支付不能(ERROR)
  • 修改订单状态为支付失败(幂等)
    1. 检查输入参数
    2. 查询订单并校验订单状态
    3. 可能的业务错误:订单已成功或未发起支付(ERROR)
  • 修改订单状态为已关闭(幂等)
    1. 检查输入参数
    2. 查询订单并校验订单状态
    3. 可能的业务错误:订单已成功或失败不能关闭(ERROR)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 夜里归家的路程 一人延伸了两人 静如影相伴而行 头顶只有沉默云朵的图腾 路边石子滚落 霓虹灯火流窜 我见着家中的大...
    着边阅读 190评论 0 1
  • 余生只做两件事,赚钱和健身!写下这个题目,我才发现自己原来这么粗俗和肤浅。当朋友圈都在隐藏眼前的无奈和苟且,...
    一粒珍珠阅读 1,545评论 0 0
  • 天坛印象 天坛,作为古代的一个重要的祭祀场所,它的地位一点也不比紫荆城差,作为一个彰显皇权的地方他其实比紫禁城还要...
    叶小诺阅读 15,021评论 0 7
  • 不知怎么了,最近脾气不好的很,看到不顺心的就急的很!每天总是不想上班,可一想到还有四五十个孩子等着我,就强打精神去...
    汤汤人阅读 257评论 0 0