package com.iotechn.unimall.biz.pay; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.dobbinsoft.fw.core.exception.ServiceException; import com.dobbinsoft.fw.pay.exception.PayServiceException; import com.dobbinsoft.fw.pay.handler.MatrixPayCallbackHandler; import com.dobbinsoft.fw.pay.model.notify.MatrixPayNotifyResponse; import com.dobbinsoft.fw.pay.model.notify.MatrixPayOrderNotifyResult; import com.dobbinsoft.fw.support.mq.DelayedMessageQueue; import com.iotechn.unimall.biz.service.user.UserBizService; import com.iotechn.unimall.biz.service.vip.VipOrderBizService; import com.iotechn.unimall.data.domain.VipOrderDO; import com.iotechn.unimall.data.enums.DMQHandlerType; import com.iotechn.unimall.data.enums.VipOrderStatusType; import com.iotechn.unimall.data.mapper.VipOrderMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.List; public class VipOrderPayCallbackHandler implements MatrixPayCallbackHandler { @Autowired private VipOrderMapper vipOrderMapper; @Autowired private DelayedMessageQueue delayedMessageQueue; @Autowired private VipOrderBizService vipOrderBizService; @Autowired private UserBizService userBizService; private static final Logger logger = LoggerFactory.getLogger(VipOrderPayCallbackHandler.class); @Override public void beforeCheckSign(HttpServletRequest httpServletRequest) { } @Override @Transactional(rollbackFor = Exception.class) public Object handle(MatrixPayOrderNotifyResult result, HttpServletRequest request) { try { /* 之前传过去的我们系统的订单ID */ // 现在是不知道是父订单还是普通订单 String orderNo = result.getOutTradeNo(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("order_no", orderNo); List vipOrderDOS = vipOrderMapper.selectList(wrapper); if (CollectionUtils.isEmpty(vipOrderDOS)) { return MatrixPayNotifyResponse.fail("没有该订单"); } VipOrderDO vipOrderDO = vipOrderDOS.get(0); if (vipOrderDO.getStatus() != VipOrderStatusType.WAIT_BUY.getCode()) { return MatrixPayNotifyResponse.success("订单已处理"); } if (result.getTotalFee().intValue() != vipOrderDO.getPrice().intValue()) { return MatrixPayNotifyResponse.fail("价格不一致"); } logger.info("[VIP 充值回调] result=" + JSONObject.toJSONString(result)); vipOrderBizService.changeOrderParentStatus(vipOrderDO.getId(), VipOrderStatusType.WAIT_REFUND.getCode(), VipOrderStatusType.WAIT_BUY.getCode()); userBizService.upUserLevel(vipOrderDO); delayedMessageQueue.publishTask(DMQHandlerType.VIP_ORDER_BUY_OVER.getCode(), String.valueOf(vipOrderDO.getId()), 60 * 60 * 24 * 7); VipOrderDO update = new VipOrderDO(); update.setId(vipOrderDO.getId()); update.setGmtPay(new Date()); update.setPayChannel(result.getPayChannel().getCode()); update.setAppId(result.getAppid()); vipOrderMapper.updateById(update); return MatrixPayNotifyResponse.success("支付成功"); } catch (ServiceException e) { throw new PayServiceException(e.getMessage()); } } }