前言:

虽然CSDN上已经有更改前端代码来解决微信支付功能的例子。但是介于本人现在还不懂前端,所以在这我想通过一种纯后端的一个方式去模拟解决微信支付功能。虽然这样说交互体验会差些,但是功能都是能正常运行的(包括Day10的用户下单和催单)

 

目录

 

1. 代码更改

 

更改订单支付功能

拒单和取消订单功能

订单搜索

2.功能测试

订单支付功能测试

接单/拒单测试

用户下单/催单提醒(Day10内容)

最后:


 

1. 代码更改

更改订单支付功能

 public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {
        // 当前登录用户id
      //  User user = userMapper.getById(userId);
//
//        //调用微信支付接口,生成预支付交易单
//        JSONObject jsonObject = weChatPayUtil.pay(
//                ordersPaymentDTO.getOrderNumber(), //商户订单号
//                new BigDecimal(0.01), //支付金额,单位 元
//                "苍穹外卖订单", //商品描述
//                user.getOpenid() //微信用户的openid
//        );
//
//        if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) {
//            throw new OrderBusinessException("该订单已支付");
//        }
//
//        OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
//        vo.setPackageStr(jsonObject.getString("package"));
        Long userId = BaseContext.getCurrentId();
        String orderNumber = ordersPaymentDTO.getOrderNumber();
        Orders orders = orderMapper.getByOrderNum(orderNumber);
        orders.setStatus(Orders.TO_BE_CONFIRMED);
        orders.setPayMethod(1);
        orders.setPayStatus(Orders.PAID);
        orders.setUserId(userId);
        orders.setOrderTime(LocalDateTime.now());

        orderMapper.update(orders);
        return null;
    }

这里给所有有关微信支付接口的内容注释掉,然后调用orderMapper根据前端所传的订单号获得当前支付订单Order,给它手动设置已下单和已支付状态,update更新数据库,VO返回null值即可

 

接着回到订单支付的Controller层,记得给paySucess()方法加到Controller(后续Day10的WebSocket是写在这个方法里的)

 

PutMapping("/payment")
@ApiOperation("订单支付")
public Result<OrderPaymentVO> payment(@RequestBody OrdersPaymentDTO ordersPaymentDTO) throws Exception {
    log.info("订单支付:{}", ordersPaymentDTO);
    OrderPaymentVO orderPaymentVO = orderService.payment(ordersPaymentDTO);
    orderService.paySuccess(ordersPaymentDTO.getOrderNumber());
    log.info("生成预支付交易单:{}", orderPaymentVO);
    return Result.success(orderPaymentVO);
}

下面是paySucess()方法:

Day10的内容,看看就好

public void paySuccess(String outTradeNo){

    // 根据订单号查询订单
    Orders ordersDB = orderMapper.getByNumber(outTradeNo);

    // 根据订单id更新订单的状态、支付方式、支付状态、结账时间
    Orders orders = Orders.builder()
            .id(ordersDB.getId())
            .status(Orders.TO_BE_CONFIRMED)
            .payStatus(Orders.PAID)
            .checkoutTime(LocalDateTime.now())
            .build();

    orderMapper.update(orders);

    // 通过wenSocket向客户端浏览器推送消息
    Map map = new HashMap();
    map.put("type", 1);
    map.put("orderId", ordersDB.getId());
    map.put("content", "订单号:"+outTradeNo);

    String json = JSON.toJSONString(map);
    webSocketServer.sendToAllClient(json);
}

 

拒单和取消订单功能

支付接口注释掉即可

这里我还加了个判断:如果订单状态不是已支付,则不能拒单,你不加也行

    
    public void reject(OrdersRejectionDTO ordersRejectionDTO) throws Exception{
        Orders orderDB = orderMapper.getByIdL(ordersRejectionDTO.getId());
        if(orderDB == null){
            throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }
        if(orderDB.getStatus() != Orders.TO_BE_CONFIRMED){
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }
        // 支付状态
        Integer payStatus = orderDB.getPayStatus();
        if(payStatus != Orders.PAID){
//            weChatPayUtil.refund(
//                    orderDB.getNumber(),
//                    orderDB.getNumber(),
//                    new BigDecimal(0.01),
//                    new BigDecimal(0.01)
//            );
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }

        Orders orders = Orders.builder()
                .id(ordersRejectionDTO.getId())
                .rejectionReason(ordersRejectionDTO.getRejectionReason())
                .status(Orders.CANCELLED)
                .cancelTime(LocalDateTime.now())
                .build();

        orderMapper.update(orders);
    }

 

然后是取消订单功能

这里也是给微信支付接口注释掉即可

  public void updateStatus(Integer id) throws Exception{
        // 根据id查询订单
        Orders orderDB = orderMapper.getById(id);
        // 校验订单是否存在
        if(orderDB == null){
            throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }
        // 订单状态
        if(orderDB.getStatus() > 2){
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        }
        Orders orders = new Orders();
        orders.setId(orderDB.getId());
//        if(orderDB.getStatus().equals(Orders.TO_BE_CONFIRMED)){
//            // 调用微信支付退款接口
//            weChatPayUtil.refund(
//                    orderDB.getNumber(),
//                    orderDB.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);
    }

 

订单搜索

这边改下mapper层

这里为了能在商家端显示已下单以上的订单,我们需要加个status >= 2

当然,最好在xml文件中写,不然全部订单显示那会有点问题,我这懒得改了

 

 

2.功能测试

将代码更改完后,重新运行

订单支付功能测试

 

这样点击确认支付,如果后端日志输出以下信息,就是支付成功

 

注意,因为没有更改前端的缘故,小程序这是不会显示支付成功的,需要看后端日志,或者看商家端是否出现待接单的订单(没有显示刷新下即可)

这边可以正确显示

 

接单/拒单测试

点击接单,可以看到这边待接单少了一个,带派送多了一个

拒单,填写拒单原因

派送中,带派送等都是一样操作的,这里就不展示了

 

用户下单/催单提醒(Day10内容)

这边也是一样的,你给小程序端点击确认支付,商家端会显示相应的语言播报(没有的话刷新网页)

 

催单

发出催单请求后,会在商家端显示相应内容

 

 

最后:

今天的分享就到这里。如果我的内容对你有帮助,请点赞评论收藏。创作不易,大家的支持就是我坚持下去的动力!(๑`・ᴗ・´๑)

 

 

 

 

 

 

 

 

Logo

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

更多推荐