苍穹外卖-微信支付功能解决
虽然CSDN上已经有更改前端代码来解决微信支付功能的例子。但是介于本人现在还不懂前端,所以在这我想通过一种纯后端的一个方式去模拟解决微信支付功能。虽然这样说交互体验会差些,但是功能都是能正常运行的(包括Day10的用户下单和催单)
前言:
虽然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内容)
这边也是一样的,你给小程序端点击确认支付,商家端会显示相应的语言播报(没有的话刷新网页)

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


最后:
今天的分享就到这里。如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!(๑`・ᴗ・´๑)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)