苍穹外卖订单支付跳过微信支付及解决后续订单取消、拒单等问题
1. 导入订单支付代码
在完成用户下单相关模块任务后,导入黑马资料中提供的订单支付代码(根据课程教学导入)。
注意:不要再配置微信支付相关的application.yml和application-dev.yml文件
2. 跳过微信支付
按照上面文章做即可跳过微信支付模块,但是后续在写用户端和商家端订单取消、商家端拒单等接口时出错,请按照下面的步骤进行修改即可修复
3. 用户端取消订单接口出错
在Service层实现类OrderServiceImpl中注释以下代码(该段代码依然调用了微信支付相关接口,所以要注释掉)
修改后的userCancelById(用户取消订单)方法:
/**
* 用户取消订单
*
* @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语句中
- 然后,把更新语句放在if语句中,如果支付状态是已支付,就更新订单状态等数据
- 此外要把创建的orders对象放到if语句之上
//支付状态
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(拒单)方法
/**
* 拒单
*
* @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中
- 与上面拒单接口出错原因一样,修改的步骤也一样,直接放修改后的代码
/**
* 取消订单
*
* @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方法即可
代码如下:
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));
添加位置如下: