苍穹外卖-微信支付功能解决

前言:

虽然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内容)

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

 

催单

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

 

 

最后:

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

 

 

 

 

 

 

 

 

### 实现苍穹外卖小程序微信支付功能 为了实现苍穹外卖小程序中的微信支付功能,需按照以下流程操作: #### 获取预支付交易会话标识 `prepay_id` 在服务器端通过调用微信支付统一下单接口来获得`prepay_id`。此过程涉及发送HTTP请求至微信支付后台并解析返回的数据以提取必要的支付参数[^1]。 ```javascript // 假设这是从前端传递给后端的信息对象 const orderInfo = { body: "苍穹外卖订单", out_trade_no: generateOutTradeNo(), // 商户订单号 total_fee: calculateTotalFee(), // 订单金额(分) spbill_create_ip: getClientIp(req), // 客户端IP地址 notify_url: config.notifyUrl, // 支付成功后的回调通知URL trade_type: 'JSAPI', // 交易类型 openid: user.openid // 用户标识 }; function getPrepayId(orderInfo) { const response = await axios.post('https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi', orderInfo); return response.data.prepay_id; } ``` #### 小程序前端发起支付请求 当从小程序页面触发支付行为时,应先向自己的服务端申请获取上述提到的`prepay_id`以及其他必需字段组成的签名包数据结构。之后利用官方提供的`wx.requestPayment()`函数完成实际付款动作。 ```javascript async function payOrder() { try { let res = await wx.cloud.callFunction({ name: 'getPayParams', data: { orderId } }); await wx.requestPayment({ timeStamp: res.result.timeStamp, nonceStr: res.result.nonceStr, package: res.result.packageValue, signType: 'MD5', paySign: res.result.paySign, success(res) {}, fail(err) {} }); } catch (err) { console.error("支付失败", err); } } ``` 以上展示了如何基于RESTful风格设计的服务端逻辑以及客户端的小程序代码片段,共同构成了完整的微信支付集成方案。值得注意的是,在真实环境中还需要处理诸如错误重试机制、安全性验证等问题,并严格参照最新的官方文档指导来进行开发工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值