苍穹外卖订单支付跳过微信支付及解决后续订单取消、拒单等问题
1. 导入订单支付代码
在完成用户下单相关模块任务后,导入黑马资料中提供的订单支付代码(根据课程教学导入)。
注意:不要再配置微信支付相关的application.yml和application-dev.yml文件

2. 跳过微信支付
跳过微信支付
按照上面文章做即可跳过微信支付模块,但是后续在写用户端和商家端订单取消、商家端拒单等接口时出错,请按照下面的步骤进行修改即可修复
3. 用户端取消订单接口出错
在Service层实现类OrderServiceImpl中注释以下代码(该段代码依然调用了微信支付相关接口,所以要注释掉)

修改后的userCancelById(用户取消订单)方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
public void userCancelById(Long id) throws Exception { Orders ordersDB = orderMapper.getById(id);
if (ordersDB == null) { throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND); }
if (ordersDB.getStatus() > 2) { throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR); }
Orders orders = new Orders(); orders.setId(ordersDB.getId());
if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
orders.setPayStatus(Orders.REFUND); }
orders.setStatus(Orders.CANCELLED); orders.setCancelReason("用户取消"); orders.setCancelTime(LocalDateTime.now()); orderMapper.update(orders); }
|
4. 商家端拒单接口出错
4.1 注释微信支付相关接口
在Service层实现类OrderServiceImpl中注释以下代码(该段代码依然调用了微信支付相关接口,所以要注释掉)

4.2 更新语句放在if语句中
- 然后,把更新语句放在if语句中,如果支付状态是已支付,就更新订单状态等数据
- 此外要把创建的orders对象放到if语句之上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Integer payStatus = ordersDB.getPayStatus(); Orders orders = new Orders(); if (payStatus == Orders.PAID) {
orders.setId(ordersDB.getId()); orders.setStatus(Orders.CANCELLED); orders.setRejectionReason(ordersRejectionDTO.getRejectionReason()); orders.setCancelTime(LocalDateTime.now()); }
|
4.3 修改后的rejection(拒单)方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
public void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception { Orders ordersDB = orderMapper.getById(ordersRejectionDTO.getId());
if (ordersDB == null || !ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) { throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR); }
Integer payStatus = ordersDB.getPayStatus(); Orders orders = new Orders(); if (payStatus == Orders.PAID) {
orders.setId(ordersDB.getId()); orders.setStatus(Orders.CANCELLED); orders.setRejectionReason(ordersRejectionDTO.getRejectionReason()); orders.setCancelTime(LocalDateTime.now()); }
orderMapper.update(orders); }
|
5. 商家端取消订单接口出错
- 在Service层实现类OrderServiceImpl中
- 与上面拒单接口出错原因一样,修改的步骤也一样,直接放修改后的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception { Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId());
Integer payStatus = ordersDB.getPayStatus(); Orders orders = new Orders(); if (payStatus == 1) {
orders.setId(ordersCancelDTO.getId()); orders.setStatus(Orders.CANCELLED); orders.setCancelReason(ordersCancelDTO.getCancelReason()); orders.setCancelTime(LocalDateTime.now()); } orderMapper.update(orders); }
|
6. 用户下单提醒功能出错
按照视频教学添加的代码无法完成用户下单后,商家端界面提醒的功能
- 原因:我们跳过微信支付功能,导致也跳过了PayNotifyController接口功能,所以在OrderServiceImpl类中的paySuccess方法从始至终都不会被调用,我们添加的代码自然也不会实现。
- 解决方法:将用户下单提醒功能代码添加到OrderServiceImpl类中的payment方法即可
代码如下:
1 2 3 4 5 6 7 8 9 10
| Map map = new HashMap(); map.put("type", 1);
Orders orders=orderMapper.getByNumberAndUserId(orderNumber, userId); map.put("orderId", orders.getId()); map.put("content", "订单号:" + orderNumber);
webSocketServer.sendToAllClient(JSON.toJSONString(map)); log.info("来单提醒:{}", JSON.toJSONString(map));
|
添加位置如下:
