wuxw
2023-10-27 a3f3bdb9d56cb9b4d1527b0306758df3fc2cb8b6
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
132
133
134
135
136
137
package com.java110.acct.payment.adapt.chinaUms;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.java110.acct.payment.IRefundMoneyAdapt;
import com.java110.core.client.FtpUploadTemplate;
import com.java110.core.client.OssUploadTemplate;
import com.java110.core.factory.PlutusFactory;
import com.java110.core.log.LoggerFactory;
import com.java110.dto.paymentPool.PaymentPoolDto;
import com.java110.dto.paymentPoolValue.PaymentPoolValueDto;
import com.java110.dto.wechat.OnlinePayDto;
import com.java110.intf.acct.IOnlinePayRefundV1InnerServiceSMO;
import com.java110.intf.acct.IOnlinePayV1InnerServiceSMO;
import com.java110.intf.acct.IPaymentPoolValueV1InnerServiceSMO;
import com.java110.intf.fee.IReturnPayFeeInnerServiceSMO;
import com.java110.intf.order.IOrderInnerServiceSMO;
import com.java110.intf.store.ISmallWechatV1InnerServiceSMO;
import com.java110.utils.util.PayUtil;
import com.java110.vo.ResultVo;
import org.bouncycastle.util.encoders.Base64;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
 
import java.util.List;
 
@Service("chinaUmsRefundMoney")
public class ChinaUmsRefundMoneyAdapt implements IRefundMoneyAdapt {
 
 
    //微信支付
    public static final String DOMAIN_WECHAT_PAY = "WECHAT_PAY";
 
    // 微信服务商支付开关
    public static final String WECHAT_SERVICE_PAY_SWITCH = "WECHAT_SERVICE_PAY_SWITCH";
 
    //开关ON打开
    public static final String WECHAT_SERVICE_PAY_SWITCH_ON = "ON";
 
    private static final String WECHAT_SERVICE_APP_ID = "SERVICE_APP_ID";
 
    private static final String WECHAT_SERVICE_MCH_ID = "SERVICE_MCH_ID";
 
    @Autowired
    private IPaymentPoolValueV1InnerServiceSMO paymentPoolValueV1InnerServiceSMOImpl;
 
    @Autowired
    private IReturnPayFeeInnerServiceSMO returnPayFeeInnerServiceSMOImpl;
 
    @Autowired
    private IOrderInnerServiceSMO orderInnerServiceSMOImpl;
 
    @Autowired
    private IOnlinePayV1InnerServiceSMO onlinePayV1InnerServiceSMOImpl;
 
    @Autowired
    private ISmallWechatV1InnerServiceSMO smallWechatV1InnerServiceSMOImpl;
 
    @Autowired
    private RestTemplate outRestTemplate;
 
    public static final String wechatReturnUrl = "https://api.plutuspay.com/open/v2/refund";
 
    private static Logger logger = LoggerFactory.getLogger(ChinaUmsRefundMoneyAdapt.class);
 
    @Autowired
    private FtpUploadTemplate ftpUploadTemplate;
 
    @Autowired
    private OssUploadTemplate ossUploadTemplate;
 
    @Autowired
    private IOnlinePayRefundV1InnerServiceSMO onlinePayRefundV1InnerServiceSMOImpl;
 
    @Override
    public ResultVo refund(OnlinePayDto onlinePayDto, PaymentPoolDto paymentPoolDto) throws Exception {
 
        PaymentPoolValueDto paymentPoolValueDto = new PaymentPoolValueDto();
        paymentPoolValueDto.setPpId(paymentPoolDto.getPpId());
        List<PaymentPoolValueDto> paymentPoolValueDtos = paymentPoolValueV1InnerServiceSMOImpl.queryPaymentPoolValues(paymentPoolValueDto);
 
        if (paymentPoolValueDtos == null || paymentPoolValueDtos.isEmpty()) {
            throw new IllegalArgumentException("配置错误,未配置参数");
        }
 
 
        String mchId = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "PLUTUS_MCHID");
        String key = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "PLUTUS_KEY");
        String privateKey = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "PLUTUS_PRIVATE_KEY");
        String devId = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "PLUTUS_DEV_ID");
        String publicKey = PaymentPoolValueDto.getValue(paymentPoolValueDtos, "PLUTUS_PUBLIC_KEY");
 
        JSONObject parameters = new JSONObject();
        parameters.put("sn", mchId);//商户号
        parameters.put("outTradeId", onlinePayDto.getOrderId());//商户号
        parameters.put("outRefundId", onlinePayDto.getPayId());//我们自己设定的退款申请号,约束为UK
        parameters.put("refundAmount", PayUtil.moneyToIntegerStr(Double.parseDouble(onlinePayDto.getTotalFee())));//订单金额 单位为分!!!这里稍微注意一下
 
 
        String param = PlutusFactory.Encryption(parameters.toJSONString(), privateKey, key, devId);
        System.out.println(param);
 
        String str = PlutusFactory.post(wechatReturnUrl, param);
        System.out.println(str);
 
        JSONObject json = JSON.parseObject(str);
 
        String signature = json.getString("signature");
        String content = json.getString("content");
 
 
        //验签
        Boolean verify = PlutusFactory.verify256(content, Base64.decode(signature), publicKey);
        //验签成功
        if (!verify) {
            throw new IllegalArgumentException("支付失败签名失败");
        }
        //解密
        byte[] bb = PlutusFactory.decrypt(Base64.decode(content), key);
        //服务器返回内容
        String paramOut = new String(bb);
        System.out.println(paramOut);
 
        JSONObject paramObj = JSONObject.parseObject(paramOut);
 
        if (paramObj.getIntValue("status") != 2) {
            return new ResultVo(ResultVo.CODE_ERROR, paramObj.getString("remark"));
        } else {
            return new ResultVo(ResultVo.CODE_OK, "退款完成");
        }
 
    }
 
 
}