fix
Hentua
2023-04-08 edef2c6a39ca9d0668a795529d33aba0a316692f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package cc.mrbird.febs.pay.service.impl;
 
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallMqRecord;
import cc.mrbird.febs.mall.entity.MallOrderInfo;
import cc.mrbird.febs.mall.mapper.MallMqRecordMapper;
import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
import cc.mrbird.febs.mall.service.ICommonService;
import cc.mrbird.febs.pay.properties.WxPayProperties;
import cc.mrbird.febs.pay.service.IPayService;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
 
/**
 * @author wzy
 * @date 2023-04-07
 **/
@Slf4j
@Service("wechatPayService")
@RequiredArgsConstructor
public class WxPayServiceImpl implements IPayService {
 
    @Autowired
    private ICommonService commonService;
 
    @Autowired
    private MallOrderInfoMapper orderInfoMapper;
 
    @Autowired
    private WxPayService wxPayService;
 
    @Autowired
    private WxPayProperties wxPayProperties;
 
    @Autowired
    private MallMqRecordMapper mallMqRecordMapper;
 
    @Autowired
    private AgentProducer agentProducer;
 
    @Value("${spring.profiles.active}")
    private String active;
 
    @Override
    public String pay(MallOrderInfo orderInfo) {
        WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
        request.setAppid(wxPayProperties.getAppId());
        request.setMchId(wxPayProperties.getMchId());
        request.setNotifyUrl(wxPayProperties.getNoticeUrl());
        request.setBody(orderInfo.getName());
        request.setOutTradeNo(orderInfo.getOrderNo());
        request.setTimeExpire(DateUtil.format(DateUtil.offset(new Date(), DateField.MINUTE, 15), DatePattern.PURE_DATETIME_PATTERN));
        request.setSpbillCreateIp("127.0.0.1");
        request.setTradeType("APP");
 
        if ("dev".equals(active) || "test".equals(active)) {
            request.setTotalFee(1);
        } else {
            request.setTotalFee(orderInfo.getAmount().subtract(orderInfo.getScoreAmount()).multiply(new BigDecimal(100)).intValue());
        }
 
        try {
            WxPayAppOrderResult result = wxPayService.createOrder(request);
            return JSONObject.toJSONString(result);
        } catch (WxPayException e) {
            e.printStackTrace();
            throw new FebsException("支付异常, 请检查");
        }
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void payCallback(Map<String, String> params) {
        String orderNo = params.get("out_trade_no");
 
        LambdaQueryWrapper<MallOrderInfo> query = new LambdaQueryWrapper<>();
        query.eq(MallOrderInfo::getOrderNo, orderNo);
        MallOrderInfo orderInfo = this.orderInfoMapper.selectOne(query);
        if ("1".equals(orderInfo.getPayResult())) {
            return;
        }
 
        orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
        orderInfo.setPayResult("1");
        orderInfo.setPayTime(new Date());
        orderInfo.setPayTradeNo(params.get("transaction_id"));
        orderInfoMapper.updateById(orderInfo);
 
        commonService.changeWallet(orderInfo.getId(), FlowTypeEnum.WECHAT.getValue());
 
        /**
         * 插入一条待处理记录
         * mq处理之后,更新状态
         */
        MallMqRecord mallMqRecord = new MallMqRecord();
        mallMqRecord.setOrderId(orderInfo.getId());
        mallMqRecord.setState(2);
        mallMqRecord.setRetryTimes(2);
        mallMqRecordMapper.insert(mallMqRecord);
        //发送补贴消息
        agentProducer.sendPerkMoneyMsg(orderInfo.getId());
        //发送代理自动升级消息
        agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId());
    }
}