当前位置: 首页 > news >正文

eshop订单状态流转详解

前言

与万事言和,

与独处相安,

自行,自醒,自清欢。

1.配置多个启动项目

打开配置启动项目

image-20251203174104334

创建eshop配置文件:

  • 认证服务(Identity.API)和购物车服务(Basket.API)使用的是https协议
  • 移动端HybridAppClientApp没有环境可以不配置,不学习maui也用不上

image-20251203174248008

2.WebApp执行流程

点击右上角登录

image-20251203174556630

登录

image-20251203174637650

授权

image-20251203174705810

登录授权成功

image-20251203212822270

随便选择2个商品到购物车

image-20251203212848302

3.结账

点击Chceck out进行结账image-20251203212933501

默认地址即可,点击Place orderPlace order会创建订单

image-20251203213049414

这个订单状态会刷新,接着我们就了解这个订单状态执行流程

image-20251203214042889

4.订单创建(OrderStartedIntegrationEvent)

查看HandleSubmitAsync实现,调用了BasketStateCheckoutAsync方法

image-20251203214403762

CheckoutAsync

  • 1.构建创建订单参数
  • 2.调用订单服务创建订单
  • 3.删除购物车

image-20251203214607670

CreateOrder

  • 创建x-requestid
  • 调用订单服务创建订单接口

image-20251203214621197

CreateOrderAsync:创建订单接口

image-20251203214810637

CreateOrderCommandHandler:创建订单处理器

  • 订单入库
  • 发布订单开始集成事件(OrderStartedIntegrationEvent)

image-20251203215052624

购物车服务(Basket.API)订阅订单开始集成事件(OrderStartedIntegrationEvent),这里会删除用户购物车

image-20251203215145045

WebApp其实也调用购物车服务删除了用户购物车,这里应该重复了

image-20251203215328043

5.订单已提交(Submitted)

订单流程服务(OrderProcessor)启动了一个后台服务,后台服务每30s检查一次数据库数据库创建的订单,如果当前时间 - 订单创建时间 > 1分钟,遍历这些订单,发布订单超时事件(GracePeriodConfirmedIntegrationEvent)

image-20251203222630166

查询数据库订单,条件:当前时间 - 订单创建时间 > 1分钟

image-20251203222703021

遍历查询订单结果,发布订单超时集成事件(GracePeriodConfirmedIntegrationEvent)

image-20251203222752222

6.订单超时(GracePeriodConfirmedIntegrationEvent)

订单服务(Ordering.API)订阅订单超时集成事件(GracePeriodConfirmedIntegrationEvent)

订单超时集成事件处理器会发送设置订单状态等待验证SetAwaitingValidationOrderStatusCommand命令

image-20251203222938280

设置订单状态等待验证命令处理器(SetAwaitingValidationOrderStatusCommandHandler)会调用SetAwaitingValidationStatus方法

image-20251203223122713

SetAwaitingValidationStatus

  • 发布订单状态为等待验证领域事件(OrderStatusChangedToAwaitingValidationDomainEvent)

  • 设置订单状态为等待验证(AwaitingValidation)

image-20251203223229763

订单状态为等待验证领域事件(OrderStatusChangedToAwaitingValidationDomainEvent)发布订单等待验证集成事件(OrderStatusChangedToAwaitingValidationIntegrationEvent)

image-20251203223512777

7.订单等待验证(AwaitingValidation)

商品服务(Catalog.API)订阅订单等待验证集成事件(OrderStatusChangedToAwaitingValidationIntegrationEvent)

订单等待验证集成事件处理器(OrderStatusChangedToAwaitingValidationIntegrationEventHandler):

  • 检查商品库存
    • 库存充足:发布库存确认集成事件(OrderStockConfirmedIntegrationEvent)
    • 库存不足:发布库存拒绝集成事件(OrderStockRejectedIntegrationEvent)

我们这里主要学习主流层,库存确认集成事件(OrderStockConfirmedIntegrationEvent)

image-20251203223738159

8.订单库存确认(StockConfirmed)

商品服务(Catalog.API)订阅库存确认集成事件(OrderStockConfirmedIntegrationEvent)
库存确认集成事件(OrderStockConfirmedIntegrationEventHandler)发送设置订单状态库存确认命令(SetStockConfirmedOrderStatusCommand)

image-20251203224254669

库存确认命令处理器(SetStockConfirmedOrderStatusCommandHandler)调用SetStockConfirmedStatus方法

image-20251203224321597

SetStockConfirmedStatus

  • 发布订单状态库存确认领域事件
  • 设置订单状态为库存确认

image-20251203224346419

订单状态库存确认领域事件处理器(OrderStatusChangedToStockConfirmedDomainEventHandler)发布库存已确认集成事件(OrderStatusChangedToStockConfirmedIntegrationEvent)

image-20251203224450691

9.订单支付成功(OrderPaymentSucceededIntegrationEvent)

支付流程服务(PaymentProcessor)订阅订单库存确认集成事件(OrderStatusChangedToStockConfirmedIntegrationEvent)

订阅订单库存确认集成事件处理器(OrderStatusChangedToStockConfirmedIntegrationEventHandler):

  • 如果PaymentSucceeded配置true,模拟支付成功,发布支付成功集成事件(OrderPaymentSucceededIntegrationEvent)
  • 如果PaymentSucceeded配置false,模拟支付失败,发布支付失败集成事件(OrderPaymentFailedIntegrationEvent)

主流程是支付成功集成事件(OrderPaymentSucceededIntegrationEvent)

image-20251203224749051

10.订单已支付(Paid)

订单服务(Ordering.API)订阅订单支付成功集成事件(OrderPaymentSucceededIntegrationEvent)

订单支付成功集成事件处理器(OrderPaymentSucceededIntegrationEventHandler)发送设置订单状态为已支付命令(SetPaidOrderStatusCommand)

image-20251203225041703

设置订单状态为已支付命令处理器(SetPaidOrderStatusCommandHandler)调用SetPaidStatus方法

image-20251203225153207

SetPaidStatus

  • 发布订单已支付领域事件(OrderStatusChangedToPaidDomainEvent)
  • 设置订单状态为已支付

image-20251203225243134

订单已支付领域处理器(OrderStatusChangedToPaidDomainEventHandler):

  • 构建订单详细信息
  • 发布订单已支付的集成事件(OrderStatusChangedToPaidIntegrationEvent)

image-20251203225357924

商品服务(Catalog.API)订阅订单已支付的集成事件(OrderStatusChangedToPaidIntegrationEvent),扣除库存

image-20251203225704506

11.Webhooks.API

Webhooks.API 是 eShop 的内部服务,用于将系统内部微服务发布的集成事件可靠地推送给外部第三方系统。它负责管理外部订阅、监听内部事件、按规则触发 Webhook 回调,并提供重试等可靠性机制,相当于内部事件面向外部生态的统一出口。

简单理解:Webhooks.API属于eshop的内部服务,但是他的作用是将订阅内部服务的集成事件通知第三方服务

Webhooks.API订阅了:

  • 商品价格变更集成事件
  • 订单已发货集成事件
  • 订单已支付集成事件

image-20251203225905609

这些集成事件会通过WebhooksSender发送给所有用户订阅的客户端

image-20251203231403547

WebhookClient会先调用POST /api/webhooks接口,把自己的回调地址和token发送给Webhooks.API进行保存

  • DestUrlWebhooks.API 收到集成事件后推送的服务地址

  • TokenWebhooks.API 通过HttpClient推送的,会自定义请求头(X-eshop-whtoken)设置这个token

image-20251203230345275

Webhooks.API保存WebhookClient的订阅信息

image-20251203231121800

12.WebhookClient

WebhookClient是模拟第三方服务订阅eshop事件的客户端

WebhooksClient调用Webhooks.API2个接口:

  • POST /api/webhooks:保存自己的订阅信息,用于Webhooks.APIWebhookClient推送消息
  • GET /api/webhooks:查询当前用户的订阅信息,WebhookClient只是模拟了第三方订单管理客户端服务,可能每个第三方服务的订阅都有单独的客户端

image-20251203232424743

然后通过自己定义的/webhook-received接口获取订阅事件

image-20251203232502467

当接收订单已支付或其他集成事件后,会显示在页面,这里没有持久化,保存在内存,重启服务就丢失了

image-20251203232620796

13.总结

eshop订单流程只有

已提交订单(Submitted)
等待验证(AwaitingValidation)
库存已确认(StockConfirmed)
已支付(Paid)	

可能eshop觉得发货什么的都是别的第三方服务了,所以没有实现了

订单流程总结

订单状态流程:***订单创建(`OrderStartedIntegrationEvent`)*******************************************
订单服务(`Ordering.API`)创建订单发布OrderStartedIntegrationEvent集成事件购物车服务(`Basket.API`)订阅OrderStartedIntegrationEvent集成事件:订单创建成功,删除购物车(应该删除已买的商品,但是这里直接根据UserId删除购物车,买没买的商品都删了)***订单已提交(`Submitted`)************************************************************
订单流程服务(`OrderProcessor`)的后台服务每30秒执行一次查询订单创建时间大于1分钟并且订单状态为Submitted的,然后遍历这些订单,发布GracePeriodConfirmedIntegrationEvent集成事件***订单超时(`GracePeriodConfirmedIntegrationEvent`)***********************************
订单服务(`Ordering.API`)订阅GracePeriodConfirmedIntegrationEvent集成事件
GracePeriodConfirmedIntegrationEventHandler集成事件处理器里会发送SetAwaitingValidationOrderStatusCommand命令,然后SetAwaitingValidationOrderStatusCommandHandler命令处理器会把订单状态改为AwaitingValidationStatus,然后发布领域事件OrderStatusChangedToAwaitingValidationDomainEvent,
OrderStatusChangedToAwaitingValidationDomainEventHandler领域事件处理器会发布OrderStatusChangedToAwaitingValidationIntegrationEvent集成事件***订单等待验证(`AwaitingValidation`)************************************************
商品服务(`Catalog.API`)订阅OrderStatusChangedToAwaitingValidationIntegrationEvent集成事件
OrderStatusChangedToAwaitingValidationIntegrationEventHandler集成事件处理器会根据库存发布不同集成事件:
库存不够发布OrderStockRejectedIntegrationEvent集成事件
库存足够发布OrderStockConfirmedIntegrationEvent集成事件,这是主流程***订单库存确认(`StockConfirmed`)******************************************************
商品服务(`Catalog.API`)订阅OrderStockConfirmedIntegrationEvent集成事件
OrderStockConfirmedIntegrationEventHandler集成事件处理器会发送SetStockConfirmedOrderStatusCommand命令,然后SetStockConfirmedOrderStatusCommandHandler命令处理器会把订单状态改为StockConfirmed,然后发布领域事件OrderStatusChangedToStockConfirmedDomainEvent,领域事件处理器OrderStatusChangedToStockConfirmedDomainEventHandler会发布OrderStatusChangedToStockConfirmedIntegrationEvent集成事件***订单支付成功(`OrderPaymentSucceededIntegrationEvent`)********************************
支付流程服务(`PaymentProcessor`)订阅OrderStatusChangedToStockConfirmedIntegrationEvent集成事件,OrderStatusChangedToStockConfirmedIntegrationEventHandler会根据配置文件返回不同的集成事件:
配置支付失败发布OrderPaymentFailedIntegrationEvent集成事件
配置支付成功发布OrderPaymentSucceededIntegrationEvent集成事件,这是主流程***订单已支付(`Paid`)*******************************************************************
订单服务(`Ordering.API`)订阅OrderPaymentSucceededIntegrationEvent集成事件
OrderPaymentSucceededIntegrationEventHandler集成事件处理器会发送SetPaidOrderStatusCommand命令
SetPaidOrderStatusCommandHandler命令处理器会把订单状态改成Paid,然后发布领域事件OrderStatusChangedToPaidDomainEvent,领域事件处理器OrderStatusChangedToPaidDomainEventHandler会发布OrderStatusChangedToPaidIntegrationEvent集成事件***订单超时(`GracePeriodConfirmedIntegrationEvent`)***********************************
商品服务(`Catalog.API`)订阅OrderStatusChangedToPaidIntegrationEvent集成事件,会扣除库存
Webhooks.API订阅OrderStatusChangedToPaidIntegrationEvent集成事件,通知第三方服务# 可能物流一般是第三方服务了,所以ehop的订单状态到这就没了,剩下的物流状态一般由第三方提供OrderStartedIntegrationEventHandlerGracePeriodConfirmedIntegrationEventOrderStatusChangedToAwaitingValidationIntegrationEventOrderStatusChangedToStockConfirmedIntegrationEventHandlerOrderStatusChangedToPaidIntegrationEventHandlerOrderStatusChangedToShippedIntegrationEventHandlerOrderStatusChangedToCancelledIntegrationEvent

📌 创作不易,感谢支持!

每一篇内容都凝聚了心血与热情,如果我的内容对您有帮助,欢迎请我喝杯咖啡☕,您的支持是我持续分享的最大动力!

💬 加入交流群(QQ群):576434538

微信打赏

http://www.jsqmd.com/news/63166/

相关文章:

  • ehop环境搭建
  • Blazor入门
  • 警惕!React服务器组件爆出高危远程代码执行漏洞
  • .NET Core 微服务之Grpc远程调用
  • 用 C++ + OpenCV + Tesseract 实现英文数字验证码识别
  • 用 PHP(Laravel)+ ImageMagick + Tesseract 实现验证码识别
  • 用 TensorFlow 构建深度学习验证码识别系统
  • 20251205 之所思 - 人生如梦
  • 12.5每日总结
  • 永久关闭Windows自动更新
  • git洁癖:如果冲突采用远端
  • 大道至简,仅需三行代码训练YOLOv11
  • 快捷键
  • 球星 C 罗投资 AI 初创 Perplexity;微软开源 VibeVoice-Realtime,低延迟流式输出丨日报
  • 网络学习细节学习
  • 12月5日日记
  • Windows PyTorch安装
  • 日总结 36
  • faster r cnn 用到所有技术和流程
  • FEM/BDC Test Platform for BMW Key Programmer – Test F20 F30 F35 X5 X6 I3 Without Gearbox Plug
  • 春招准备之MyBatis框架篇 - 详解
  • 上海助听器验配哪家好?2025 年12月权威机构推荐报告:从资质核验到场景适配的全维度选择策略
  • 使用fail2ban屏蔽LINUX恶意暴力破解密码
  • 对接墨西哥股票市场 k线图表数据klinechart 数据源API
  • 代码随想录Day28_贪心2
  • 10412_基于Springboot的员工绩效管理系统
  • NFL如何用统一数据平台提升比赛与体验
  • MAF快速入门(1)化繁为简的Agent创建范式
  • CDN 迁移至 EdgeOne 工具使用指南
  • ssh连接错误:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! - Hello