[!IMPORTANT]
用户下单的流程是怎么样的
订单支付过程是怎样的?
由于没有商户认证,跳过微信支付的方法有哪些步骤?
用户下单逻辑步骤
Controller 层
- 接收前端传来的下单请求,请求路径为
/user/order/submit
,使用@PostMapping
注解处理该 POST 请求。 - 将前端传来的数据封装成
OrdersSubmitDTO
对象,该对象通过@RequestBody
注解从请求体中获取。 - 调用
OrderService
的submitOrder
方法,将OrdersSubmitDTO
对象作为参数传入,获取返回的OrderSubmitVO
对象。 - 将
OrderSubmitVO
对象封装到Result
对象中,返回给前端表示下单结果。
Service 层
- 数据检查
- 根据
OrdersSubmitDTO
中的addressBookId
,调用AddressBookMapper
的getById
方法获取用户的收货地址信息。若收货地址为空,抛出AddressBookBusinessException
异常。 - 从
BaseContext
中获取当前用户的 ID,创建ShoppingCart
对象并设置用户 ID,调用ShoppingCartMapper
的list
方法查询当前用户的购物车数据。若购物车为空,抛出ShoppingCartBusinessException
异常。
- 根据
- 构造订单数据
- 创建
Orders
对象,使用BeanUtils.copyProperties
方法将OrdersSubmitDTO
的属性复制到Orders
对象中。 - 设置
Orders
对象的其他必要属性,如电话号码、收货地址、收货人、订单号、用户 ID、订单状态(待支付)、支付状态(未支付)和订单时间(当前时间)。 - 将
Orders
对象保存到全局变量this.orders
中,方便后续操作使用。
- 创建
- 数据库操作
- 调用
OrderMapper
的insert
方法,向订单表中插入一条订单数据。 - 遍历购物车列表,为每个购物车项创建
OrderDetail
对象,将购物车项的属性复制到OrderDetail
对象中,并设置订单 ID。将所有OrderDetail
对象添加到orderDetailList
列表中。 - 调用
OrderDetailMapper
的insertBatch
方法,向订单明细表中插入多条订单明细数据。 - 调用
ShoppingCartMapper
的deleteByUserId
方法,清理当前用户的购物车数据。
- 调用
- 返回结果
- 使用
OrderSubmitVO
的构建器构建OrderSubmitVO
对象,设置订单 ID、订单号、订单金额和订单时间等属性。 - 返回
OrderSubmitVO
对象。
- 使用
正常微信支付的流程
微信小程序支付时序图:
订单支付逻辑步骤(跳过微信支付情况)
Controller 层
接收前端传来的订单支付请求,请求路径为 /payment
,使用 @PutMapping
注解处理该 PUT 请求。
将前端传来的数据封装成 OrdersPaymentDTO
对象,该对象通过 @RequestBody
注解从请求体中获取。
调用 OrderService
的 payment
方法,将 OrdersPaymentDTO
对象作为参数传入,获取返回的 OrderPaymentVO
对象。
将 OrderPaymentVO
对象封装到 Result
对象中,返回给前端表示支付结果。
Service 层
- 获取用户信息
- 从
BaseContext
中获取当前用户的 ID,调用UserMapper
的getById
方法获取用户信息。
- 从
- 模拟支付结果
- 创建
JSONObject
对象,并设置其code
属性为"ORDERPAID"
,模拟订单已支付的情况。 - 将
JSONObject
对象转换为OrderPaymentVO
对象,并设置packageStr
属性。
- 创建
- 更新订单状态
- 设置订单状态为待确认,支付状态为已支付,获取当前时间作为结账时间。
- 调用
OrderMapper
的updateStatus
方法,更新订单的状态、支付状态和结账时间。
- 发送消息通知
- 创建一个
Map
对象,设置消息类型、订单 ID 和消息内容。 - 调用
WebSocketServer
的sendToAllClient
方法,将消息以 JSON 字符串的形式发送给所有客户端。
- 创建一个
- 返回结果
- 返回
OrderPaymentVO
对象。
- 返回
总的来说跳过微信支付的步骤
- 前端 JS 注释验证逻辑,直接重定向到支付成功页。
payment
方法注释微信验证代码,手动设置JSONObject
模拟支付成功数据。payment
执行后直接更新数据库订单数据。OrderServiceImpl
中把orders
设为全局变量,在submitOrder
插入数据前将orders
赋值给全局变量,以便后续更新订单数据时获取orderId
。