前言:
虽然CSDN上已经有更改前端代码来解决微信支付功能的例子。但是介于本人现在还不懂前端,所以在这我想通过一种纯后端的一个方式去模拟解决微信支付功能。虽然这样说交互体验会差些,但是功能都是能正常运行的(包括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内容)
这边也是一样的,你给小程序端点击确认支付,商家端会显示相应的语言播报(没有的话刷新网页)
催单
发出催单请求后,会在商家端显示相应内容
最后:
今天的分享就到这里。如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!(๑`・ᴗ・´๑)