苍穹外卖订单支付跳过微信支付及解决后续订单取消、拒单等问题

苍穹外卖订单支付跳过微信支付及解决后续订单取消、拒单等问题

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
    /**
* 用户取消订单
*
* @param id
*/
public void userCancelById(Long id) throws Exception {
// 根据id查询订单
Orders ordersDB = orderMapper.getById(id);

// 校验订单是否存在
if (ordersDB == null) {
throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
}

//订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
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)) {
// //调用微信支付退款接口
// weChatPayUtil.refund(
// ordersDB.getNumber(), //商户订单号
// ordersDB.getNumber(), //商户退款单号
// new BigDecimal(0.01),//退款金额,单位 元
// new BigDecimal(0.01));//原订单金额

//支付状态修改为 退款
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语句中

  1. 然后,把更新语句放在if语句中,如果支付状态是已支付,就更新订单状态等数据
  2. 此外要把创建的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) {
// //用户已支付,需要退款
// String refund = weChatPayUtil.refund(
// ordersDB.getNumber(),
// ordersDB.getNumber(),
// new BigDecimal(0.01),
// new BigDecimal(0.01));
// log.info("申请退款:{}", refund);

// 拒单需要退款,根据订单id更新订单状态、拒单原因、取消时间
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
    /**
* 拒单
*
* @param ordersRejectionDTO
*/
public void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception {
// 根据id查询订单
Orders ordersDB = orderMapper.getById(ordersRejectionDTO.getId());

// 订单只有存在且状态为2(待接单)才可以拒单
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) {
// //用户已支付,需要退款
// String refund = weChatPayUtil.refund(
// ordersDB.getNumber(),
// ordersDB.getNumber(),
// new BigDecimal(0.01),
// new BigDecimal(0.01));
// log.info("申请退款:{}", refund);

// 拒单需要退款,根据订单id更新订单状态、拒单原因、取消时间
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
    /**
* 取消订单
*
* @param ordersCancelDTO
*/
public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception {
// 根据id查询订单
Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId());

//支付状态
Integer payStatus = ordersDB.getPayStatus();
Orders orders = new Orders();
if (payStatus == 1) {
// //用户已支付,需要退款
// String refund = weChatPayUtil.refund(
// ordersDB.getNumber(),
// ordersDB.getNumber(),
// new BigDecimal(0.01),
// new BigDecimal(0.01));
// log.info("申请退款:{}", refund);


// 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间
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);// 消息类型,1表示来单提醒
//获取订单id
Orders orders=orderMapper.getByNumberAndUserId(orderNumber, userId);
map.put("orderId", orders.getId());
map.put("content", "订单号:" + orderNumber);

// 通过WebSocket实现来单提醒,向客户端浏览器推送消息
webSocketServer.sendToAllClient(JSON.toJSONString(map));
log.info("来单提醒:{}", JSON.toJSONString(map));

添加位置如下