前言
因无法以企业、商家的身份注册小程序,所有导致微信支付这块代码无法正常实现。空指针异常(相关商户号、证书、密钥等参数无法配置)。但是由于后边需要实现该功能才能完成订单支付,对订单数据进行修改,然后管理端展示订单状态,来单提醒等等内容,因此这里需要修改源代码,跳过微信支付的内容。进而继续完成后续学习。
分析
观察下面微信支付的时序图,我们可以看到我们前端和商户系统和微信后台交互的地方存在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;
}