huliguo
2025-07-03 e3a2245265516fef78b4737d6fffc939e7c5e0af
pt-errand/src/main/java/com/ruoyi/errand/service/impl/VipOrderServiceImpl.java
@@ -14,11 +14,14 @@
import com.ruoyi.errand.mapper.VipOrderMapper;
import com.ruoyi.errand.mapper.VipSettingMapper;
import com.ruoyi.errand.object.dto.app.VipPaymentDTO;
import com.ruoyi.errand.object.vo.sys.OrderSysDetailVO;
import com.ruoyi.errand.service.VipOrderService;
import com.ruoyi.errand.utils.CloseOrderResult;
import com.ruoyi.errand.utils.PaymentUtil;
import com.ruoyi.errand.utils.UniPayCallbackResult;
import com.ruoyi.errand.utils.UniPayResult;
import com.ruoyi.errand.utils.wx.PayResult;
import com.ruoyi.errand.utils.wx.WechatPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.core.context.SecurityContextHolder;
@@ -29,10 +32,7 @@
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.*;
@Service
@Slf4j
@@ -43,6 +43,8 @@
    private RedisTemplate redisTemplate;
    @Resource
    private AppUserMapper appUserMapper;
    @Resource
    private WechatPayService wechatPayService;
    @Override
    public R vipPayment(VipPaymentDTO vipPaymentDTO) {
@@ -51,8 +53,8 @@
        vipOrder.setAppUserId(appuser.getId());
        VipSetting vipSetting = vipSettingMapper.selectById(vipPaymentDTO.getId());
        vipOrder.setOrderAmount(vipSetting.getVip_price());
        vipOrder.setPaymentAmount(vipSetting.getVip_price());
        vipOrder.setOrderAmount(vipSetting.getVipPrice());
        vipOrder.setPaymentAmount(vipSetting.getVipPrice());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        vipOrder.setOrderNumber("QJS" + getNumber(3) + sdf.format(new Date()));
        vipOrder.setPayStatus(1);
@@ -62,23 +64,28 @@
        BigDecimal paymentMoney = vipOrder.getOrderAmount();
        if ( BigDecimal.ZERO.compareTo(paymentMoney) < 0){
            //调起微信支付
            String vipName = vipSetting.getVip_name();
            UniPayResult uniPayResult = PaymentUtil.uniPay(vipOrder.getOrderNumber(), paymentMoney.doubleValue(),  "购买会员",
                    vipName, "", "/app/vipOrder/orderPaymentCallback", appuser.getWxOpenid(), null);
            if(null == uniPayResult || !"100".equals(uniPayResult.getRa_Code())){
                return R.fail(null == uniPayResult ? "支付失败" : uniPayResult.getRb_CodeMsg());
            String vipName = vipSetting.getVipName();
            try {
                R r = wechatPayService.unifiedOrder(vipOrder.getId().toString(), vipOrder.getOrderNumber(), paymentMoney.toString(), "购买"+vipName,appuser.getWxOpenid(),"/app/vipOrder/orderPaymentCallback");
                if (null == r || 200 != r.getCode()) {
                    //支付失败 删除订单
                    vipOrder.setDelFlag(1);
                    this.updateById(vipOrder);
                    //返回报错信息
                    return R.fail(null == r ? "支付失败" : r.getMsg());
                }
                //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。
                long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC);
                redisTemplate.opsForZSet().add("VipOrderPayment", vipOrder.getOrderNumber(), second);
                return r;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            String rc_result = uniPayResult.getRc_Result();
            JSONObject jsonObject = JSON.parseObject(rc_result);
            jsonObject.put("orderId", vipOrder.getId().toString());
            //将支付数据添加到redis队列中,便于定时任务去校验是否完成支付,没有完成支付支付,15分钟后关闭订单。
            long second = LocalDateTime.now().plusMinutes(15).toEpochSecond(ZoneOffset.UTC);
            redisTemplate.opsForZSet().add("VipOrderPayment", vipOrder.getOrderNumber(), second);
            return R.ok(jsonObject.toJSONString());
        }
        //设置vipOrder信息
        vipOrder.setPayStatus(2);//已支付
        vipOrder.setOrderTime(LocalDateTime.now());//下单时间
        vipOrder.setOrderStatus(4);
        this.updateById(vipOrder);
        //更新用户信息
        Long appUserId = vipOrder.getAppUserId();
@@ -96,16 +103,17 @@
    }
    @Override
    public R orderPaymentCallback(UniPayCallbackResult uniPayCallbackResult) {
        VipOrder vipOrder = this.getBaseMapper().selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber, uniPayCallbackResult.getR2_OrderNo()));
    public R orderPaymentCallback(PayResult payResult) {
        VipOrder vipOrder = this.getBaseMapper().selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderNumber, payResult.getOrderNumber()));
        if(null == vipOrder || vipOrder.getPayStatus() == 2){
            return R.ok();
        }
        //设置vipOrder信息
        vipOrder.setPayStatus(2);//已支付
        vipOrder.setOrderTime(LocalDateTime.now());//下单时间
        String r7TrxNo = uniPayCallbackResult.getR9_BankTrxNo();
        String r7TrxNo = payResult.getTransactionId();
        vipOrder.setSerialNumber(r7TrxNo);
        vipOrder.setOrderStatus(4);
        this.updateById(vipOrder);
        //更新用户信息
        //检查是否续期的
@@ -120,6 +128,7 @@
        // 根据 vipId 计算会员到期时间
        LocalDateTime endTime = calculateEndTime(appUser.getEndTime(), vipOrder.getVipId());
        appUser.setEndTime(endTime);
        appUserMapper.updateById(appUser);
        return R.ok();
    }
@@ -138,11 +147,10 @@
                    continue;
                }
                //开始执行关闭订单操作
                CloseOrderResult closeOrderResult = PaymentUtil.closeOrder(order.getOrderNumber());
                if((null == closeOrderResult || !closeOrderResult.getRa_Status().equals("100")) &&
                        Arrays.asList("0", "4", "101", "10080000", "10080002", "10083004", "10083005").contains(closeOrderResult.getRb_Code())){
                Map<String, String> map = wechatPayService.closeOrder(order.getOrderNumber());
                if((null == map || !map.get("return_code").equals("SUCCESS"))){
                    redisTemplate.opsForZSet().add("VipOrderPayment", order.getOrderNumber(), 0);
                    log.error("关闭订单失败:{}---->{}",order.getOrderNumber(), JSON.toJSONString(closeOrderResult));
                    log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), map.get("return_msg"));
                }
                redisTemplate.opsForZSet().remove("VipOrderPayment", order.getOrderNumber());
                //删除订单
@@ -153,6 +161,12 @@
        }
    }
    @Override
    public OrderSysDetailVO detail(Integer id) {
        return this.getBaseMapper().detail(id);
    }
    private LocalDateTime calculateEndTime(LocalDateTime startTime, Integer vipId) {
        switch (vipId) {