模拟微信支付后续
1.用户端取消订单
订单处于待接单状态下取消,需要进行退款
由于前面模拟微信支付,直接调用了支付成功的接口,实际上并未支付
此时用户端取消订单,需要跳过微信支付退款接口,直接修改数据库订单状态
注释调用wechatpayutil.refund方法
完整代码如下:
/**
* 用户取消订单
*
* @param id
*/
public void userCancelById(Long id) throws Exception {
// 根据id查询订单
Orders ordersDB = orderMapper.getById(id);
// 校验订单是否存在
if (ordersDB == null) {
throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
}
//订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
if (ordersDB.getStatus() > 2) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Orders orders = new Orders();
orders.setId(ordersDB.getId());
// 订单处于待接单状态下取消,需要进行退款
if (ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
//调用微信支付退款接口
// weChatPayUtil.refund(
// ordersDB.getNumber(), //商户订单号
// ordersDB.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);
}
功能效果如图:
![](https://img-blog.csdnimg.cn/direct/c5b8c188486d48109f300db779c4ceb5.png)
![](https://img-blog.csdnimg.cn/direct/35dab71dbedb4b788bba05672d9809cf.png)
![](https://img-blog.csdnimg.cn/direct/c308cb2584cc4cb7a4410880e08bc6bc.png)
2.商家端拒绝订单
涉及到退款部分:跳过 weChatPayUtil.refund调用
模拟给用户退款,直接更新数据库订单支付状态为 ”已退款 “
com/sky/service/impl/OrderServiceImpl.java
同理,涉及到wechatpayutil.refund方法的都需要注释
完整代码如下: **
/**
* 拒单
*
* @param ordersRejectionDTO
*/
public void rejection(OrdersRejectionDTO ordersRejectionDTO) throws Exception {
// 根据id查询订单
Orders ordersDB = orderMapper.getById(ordersRejectionDTO.getId());
// 订单只有存在且状态为2(待接单)才可以拒单
if (ordersDB == null || !ordersDB.getStatus().equals(Orders.TO_BE_CONFIRMED)) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
//支付状态
Integer payStatus = ordersDB.getPayStatus();
if (payStatus == Orders.PAID) {
//跳过 weChatPayUtil.refund调用,模拟给用户退款,直接更新数据库订单支付状态为 ”已退款 “
//用户已支付,需要退款
// String refund = weChatPayUtil.refund(
// ordersDB.getNumber(),
// ordersDB.getNumber(),
// new BigDecimal(0.01),
// new BigDecimal(0.01));
// log.info("申请退款:{}", refund);
log.info("给订单{}退款", ordersDB.getNumber());
}
// 拒单需要退款,根据订单id更新订单状态、拒单原因、取消时间
Orders orders = new Orders();
orders.setPayStatus(Orders.REFUND);//修改订单支付状态为 ”已退款 “
orders.setId(ordersDB.getId());
orders.setStatus(Orders.CANCELLED);
orders.setRejectionReason(ordersRejectionDTO.getRejectionReason());
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
效果如图:
3.商家端取消订单
同上,注释 weChatPayUtil,直接更新数据库订单支付状态为 ”已退款 “
完整代码如下:
public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception {
// 根据id查询订单
Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId());
//支付状态
Integer payStatus = ordersDB.getPayStatus();
if (payStatus == 1) {
//跳过 weChatPayUtil.refund调用,模拟给用户退款,直接更新数据库订单支付状态为 ”已退款 “
//用户已支付,需要退款
// String refund = weChatPayUtil.refund(
// ordersDB.getNumber(),
// ordersDB.getNumber(),
// new BigDecimal(0.01),
// new BigDecimal(0.01));
// log.info("申请退款:{}", refund);
log.info("给订单{}退款", ordersDB.getNumber());
}
// 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间
Orders orders = new Orders();
orders.setPayStatus(Orders.REFUND);//修改订单支付状态为 ”已退款 “
orders.setId(ordersCancelDTO.getId());
orders.setStatus(Orders.CANCELLED);
orders.setCancelReason(ordersCancelDTO.getCancelReason());
orders.setCancelTime(LocalDateTime.now());
orderMapper.update(orders);
}
效果如图:
更新数据库状态: