苍穹外卖之跳过微信支付详解

前言

因无法以企业、商家的身份注册小程序,所有导致微信支付这块代码无法正常实现。空指针异常(相关商户号、证书、密钥等参数无法配置)。但是由于后边需要实现该功能才能完成订单支付,对订单数据进行修改,然后管理端展示订单状态,来单提醒等等内容,因此这里需要修改源代码,跳过微信支付的内容。进而继续完成后续学习。

分析

观察下面微信支付的时序图,我们可以看到我们前端和商户系统和微信后台交互的地方存在3个。

  • 后端服务调用微信下单接口,返回预支付交易标识

  • 小程序调起微信支付

  • 微信后台向商户系统推送支付结果

所以,显而易见,如果我们需要跳过微信支付,需要对上面三个部分的代码进行修改。

具体流程:

1.在我们的后端OrderController类中,我们需要把调起微信下单接口的方法注释掉。如下图,这样我们便可以跳过后端服务调起微信接口。

2.在小程序端,因为小程序是调用了wx.requestPayment这个方法,携带了我们上一步对数据进行签名后的参数,调起微信支付。所以这里我们要讲这个方法注释掉。

如下:在开发者模式中,找到下图的位置。我们先对该方法的调用进行注释,然后取消重定向的代码的注释(粉色框里的)。这样当我们后端服务返回数据后,小程序端判断完成后,则直接重定向到成功页面

3.最后一步,因为我们支付成功后,微信后台会向我们后端服务发送请求(这里的参数为订单号、商品支付号),确认支付状态。因为这里我们没有通过cpolar等内网穿透工具暴露我们的公网ip,在设置里面设置我们的参数,如下图,所以这里微信后台无法向我们发送请求。

也就是说`PayNotifyController`并不会执行到对应接口,不会回调、修改订单状态以及来电提醒。如下图,框中方法无法正常执行。

所以,这里的业务处理,我们需要另外完成。如下图:通过构造一些参数,进而更新订单的状态。

payment方法代码块

    /**
     * 订单支付
     *
     * @param ordersPaymentDTO
     * @return
     */
    public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {
        // 当前登录用户id
        Long userId = BaseContext.getCurrentId();
        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"));

        return vo;**/

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", "ORDERPAID");
        OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
        vo.setPackageStr(jsonObject.getString("package"));

        Integer OrderPaidStatus = Orders.PAID; // 支付状态,已支付
        Integer OrderStatus = Orders.TO_BE_CONFIRMED; // 订单状态,待接单
        // 更新支付时间check_out
        LocalDateTime check_out_time = LocalDateTime.now();

        orderMapper.updateStatus(OrderStatus, OrderPaidStatus, check_out_time, ordersPaymentDTO.getOrderNumber());
        return vo;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值