苍穹外卖-day08

[!IMPORTANT]

用户下单的流程是怎么样的

订单支付过程是怎样的?

由于没有商户认证,跳过微信支付的方法有哪些步骤?

用户下单逻辑步骤

Controller 层
  1. 接收前端传来的下单请求,请求路径为 /user/order/submit,使用 @PostMapping 注解处理该 POST 请求。
  2. 将前端传来的数据封装成 OrdersSubmitDTO 对象,该对象通过 @RequestBody 注解从请求体中获取。
  3. 调用 OrderServicesubmitOrder 方法,将 OrdersSubmitDTO 对象作为参数传入,获取返回的 OrderSubmitVO 对象。
  4. OrderSubmitVO 对象封装到 Result 对象中,返回给前端表示下单结果。
Service 层
  1. 数据检查
    1. 根据 OrdersSubmitDTO 中的 addressBookId,调用 AddressBookMappergetById 方法获取用户的收货地址信息。若收货地址为空,抛出 AddressBookBusinessException 异常。
    2. BaseContext 中获取当前用户的 ID,创建 ShoppingCart 对象并设置用户 ID,调用 ShoppingCartMapperlist 方法查询当前用户的购物车数据。若购物车为空,抛出 ShoppingCartBusinessException 异常。
  2. 构造订单数据
    1. 创建 Orders 对象,使用 BeanUtils.copyProperties 方法将 OrdersSubmitDTO 的属性复制到 Orders 对象中。
    2. 设置 Orders 对象的其他必要属性,如电话号码、收货地址、收货人、订单号、用户 ID、订单状态(待支付)、支付状态(未支付)和订单时间(当前时间)。
    3. Orders 对象保存到全局变量 this.orders 中,方便后续操作使用。
  3. 数据库操作
    1. 调用 OrderMapperinsert 方法,向订单表中插入一条订单数据。
    2. 遍历购物车列表,为每个购物车项创建 OrderDetail 对象,将购物车项的属性复制到 OrderDetail 对象中,并设置订单 ID。将所有 OrderDetail 对象添加到 orderDetailList 列表中。
    3. 调用 OrderDetailMapperinsertBatch 方法,向订单明细表中插入多条订单明细数据。
    4. 调用 ShoppingCartMapperdeleteByUserId 方法,清理当前用户的购物车数据。
  4. 返回结果
    1. 使用 OrderSubmitVO 的构建器构建 OrderSubmitVO 对象,设置订单 ID、订单号、订单金额和订单时间等属性。
    2. 返回 OrderSubmitVO 对象。
客户端 OrderController OrderServiceImpl AddressBookMapper ShoppingCartMapper OrderMapper OrderDetailMapper BaseContext 发送 POST /submit 请求 调用 submitOrder(OrdersSubmitDTO) 调用 getById(ordersSubmitDTO.getAddressBookId()) 返回 AddressBook 抛出 AddressBookBusinessException 返回错误响应 调用 getCurrentId() 返回 userId 调用 list(shoppingCart) 返回 List<ShoppingCart> 抛出 ShoppingCartBusinessException 返回错误响应 构造 Orders 对象 调用 insert(order) 插入成功 构造 OrderDetail 对象 调用 insertBatch(orderDetailList) 插入成功 loop [遍历购物车列表] 调用 deleteByUserId(userId) 删除成功 构造 OrderSubmitVO 对象 返回 OrderSubmitVO 返回 Result<OrderSubmitVO> alt [购物车为空] [购物车不为空] alt [收货地址为空] [收货地址不为空] 客户端 OrderController OrderServiceImpl AddressBookMapper ShoppingCartMapper OrderMapper OrderDetailMapper BaseContext

正常微信支付的流程

微信小程序支付时序图:

请添加图片描述

订单支付逻辑步骤(跳过微信支付情况)

Controller 层

接收前端传来的订单支付请求,请求路径为 /payment,使用 @PutMapping 注解处理该 PUT 请求。

将前端传来的数据封装成 OrdersPaymentDTO 对象,该对象通过 @RequestBody 注解从请求体中获取。

调用 OrderServicepayment 方法,将 OrdersPaymentDTO 对象作为参数传入,获取返回的 OrderPaymentVO 对象。

OrderPaymentVO 对象封装到 Result 对象中,返回给前端表示支付结果。

Service 层
  1. 获取用户信息
    1. BaseContext 中获取当前用户的 ID,调用 UserMappergetById 方法获取用户信息。
  2. 模拟支付结果
    1. 创建 JSONObject 对象,并设置其 code 属性为 "ORDERPAID",模拟订单已支付的情况。
    2. JSONObject 对象转换为 OrderPaymentVO 对象,并设置 packageStr 属性。
  3. 更新订单状态
    1. 设置订单状态为待确认,支付状态为已支付,获取当前时间作为结账时间。
    2. 调用 OrderMapperupdateStatus 方法,更新订单的状态、支付状态和结账时间。
  4. 发送消息通知
    1. 创建一个 Map 对象,设置消息类型、订单 ID 和消息内容。
    2. 调用 WebSocketServersendToAllClient 方法,将消息以 JSON 字符串的形式发送给所有客户端。
  5. 返回结果
    1. 返回 OrderPaymentVO 对象。
客户端 OrderController OrderServiceImpl UserMapper OrderMapper WebSocketServer BaseContext WeChatPayUtil 发送 PUT /payment 请求 调用 payment(OrdersPaymentDTO) 调用 getCurrentId() 返回 userId 调用 getById(userId) 返回 User 调用 pay(订单号, 金额, 商品描述, openid) 返回 JSONObject 抛出 OrderBusinessException 返回错误响应 将 JSONObject 转换为 OrderPaymentVO 调用 updateStatus(订单状态, 支付状态, 时间, 订单 ID) 更新成功 发送消息 消息发送成功 返回 OrderPaymentVO 返回 Result<OrderPaymentVO> alt [订单已支付] [订单未支付] 创建 JSONObject 并设置值 将 JSONObject 转换为 OrderPaymentVO 调用 updateStatus(订单状态, 支付状态, 时间, 订单 ID) 更新成功 发送消息 消息发送成功 返回 OrderPaymentVO 返回 Result<OrderPaymentVO> alt [正常微信支付流程(注释部分)] [跳过微信支付流程] 客户端 OrderController OrderServiceImpl UserMapper OrderMapper WebSocketServer BaseContext WeChatPayUtil

总的来说跳过微信支付的步骤

  1. 前端 JS 注释验证逻辑,直接重定向到支付成功页。
  2. payment 方法注释微信验证代码,手动设置 JSONObject 模拟支付成功数据。
  3. payment 执行后直接更新数据库订单数据。
  4. OrderServiceImpl 中把 orders 设为全局变量,在 submitOrder 插入数据前将 orders 赋值给全局变量,以便后续更新订单数据时获取 orderId
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值