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

跳转至我的博客

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语句中

  1. 然后,把更新语句放在if语句中,如果支付状态是已支付,就更新订单状态等数据
  2. 此外要把创建的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));

添加位置如下

在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐