java110
2022-01-17 28e7d3937f819a3486b22bfa1c84aee172aaccb4
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package com.java110.job.adapt.fee;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.java110.core.client.FtpUploadTemplate;
import com.java110.core.client.OssUploadTemplate;
import com.java110.core.factory.CommunitySettingFactory;
import com.java110.core.factory.PlutusFactory;
import com.java110.core.log.LoggerFactory;
import com.java110.dto.onlinePay.OnlinePayDto;
import com.java110.dto.smallWeChat.SmallWeChatDto;
import com.java110.entity.order.Business;
import com.java110.intf.acct.IOnlinePayV1InnerServiceSMO;
import com.java110.intf.fee.IReturnPayFeeInnerServiceSMO;
import com.java110.intf.order.IOrderInnerServiceSMO;
import com.java110.intf.store.ISmallWeChatInnerServiceSMO;
import com.java110.job.adapt.DatabusAdaptImpl;
import com.java110.po.onlinePay.OnlinePayPo;
import com.java110.utils.cache.MappingCache;
import com.java110.utils.constant.WechatConstant;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.utils.util.PayUtil;
import com.java110.utils.util.StringUtil;
import org.bouncycastle.util.encoders.Base64;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
 
import java.util.List;
 
/**
 * 退费审核通过后 通知 微信支付平台退款处理
 * 业务功能
 * <p>
 * 商户针对某一笔已经成功支付的订单发起退款。
 * <p>
 * 交互模式
 * <p>
 * 请求:后台请求交互模式
 * <p>
 * 返回结果:后台请求交互模式
 * <p>
 * 说明:支持部份退款;退到银行卡是非实时的,每个银行的处理速度不同,一般发起退款后1-3个工作日内到账。 当调用退款接口返回未知状态,需要调用退款查询接口查询实际退款状态 。 建议 5 秒调一次查询,调用 10 次后状态仍然未知,请在 3 个工作日后重新查询退款状态,或者使用对账单进行确认。
 * <p>
 * http://open.plutuspay.com/Index.html
 *
 * @author wuxw
 * @Date 2021-08-19 10:12
 */
@Component(value = "returnPayFeeToPlutusAdapt")
public class ReturnPayFeeToPlutusAdapt extends DatabusAdaptImpl {
    @Autowired
    private IReturnPayFeeInnerServiceSMO returnPayFeeInnerServiceSMOImpl;
 
    @Autowired
    private IOrderInnerServiceSMO orderInnerServiceSMOImpl;
 
    @Autowired
    private IOnlinePayV1InnerServiceSMO onlinePayV1InnerServiceSMOImpl;
 
 
    @Autowired
    private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl;
 
 
    @Autowired
    private RestTemplate outRestTemplate;
 
    public static final String wechatReturnUrl = "https://api.plutuspay.com/open/v2/refund";
 
    private static Logger logger = LoggerFactory.getLogger(ReturnPayFeeMoneyAdapt.class);
 
    @Autowired
    private FtpUploadTemplate ftpUploadTemplate;
 
    @Autowired
    private OssUploadTemplate ossUploadTemplate;
 
 
    @Override
    public void execute(Business business, List<Business> businesses) {
        JSONObject data = business.getData();
        OnlinePayPo oaWorkflowDataPo = BeanConvertUtil.covertBean(data, OnlinePayPo.class);
 
        try {
            doPayFeeMoney(oaWorkflowDataPo);
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 
    /**
     * 通知退款
     *
     * @param oaWorkflowDataPo
     */
    public void doPayFeeMoney(OnlinePayPo oaWorkflowDataPo) throws Exception {
 
        //查询小区信息
        OnlinePayDto onlinePayDto = new OnlinePayDto();
        onlinePayDto.setPayId(oaWorkflowDataPo.getPayId());
        onlinePayDto.setState(OnlinePayDto.STATE_WT);
        List<OnlinePayDto> onlinePayDtos = onlinePayV1InnerServiceSMOImpl.queryOnlinePays(onlinePayDto);
 
        if (onlinePayDtos == null || onlinePayDtos.size() < 1) {
            return;
        }
 
//        String payPassword = "";
//        String certData = "";
 
        SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
        smallWeChatDto.setMchId(onlinePayDtos.get(0).getMchId());
        smallWeChatDto.setAppId(onlinePayDtos.get(0).getAppId());
        List<SmallWeChatDto> smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto);
        String privateKey = "";
        String devId = "";
        String payPassword = "";
        String publicKey = "";
        if (smallWeChatDtos == null || smallWeChatDtos.size() < 1) {
            privateKey = MappingCache.getRemark(WechatConstant.WECHAT_DOMAIN, "PLUTUS_PRIVATE_KEY");
            devId = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "PLUTUS_DEV_ID");
            payPassword = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "key");
            publicKey = MappingCache.getRemark(WechatConstant.WECHAT_DOMAIN, "PLUTUS_PUBLIC_KEY");
        } else {
            privateKey = CommunitySettingFactory.getRemark(smallWeChatDtos.get(0).getObjId(), "PLUTUS_PRIVATE_KEY");
            devId = CommunitySettingFactory.getValue(smallWeChatDto.getObjId(), "PLUTUS_DEV_ID");
            payPassword = smallWeChatDtos.get(0).getPayPassword();
            publicKey = CommunitySettingFactory.getRemark(smallWeChatDtos.get(0).getObjId(), "PLUTUS_PUBLIC_KEY");
        }
 
 
        JSONObject parameters = new JSONObject();
        parameters.put("sn", onlinePayDtos.get(0).getMchId());//商户号
        parameters.put("outTradeId", onlinePayDtos.get(0).getOrderId());//商户号
        parameters.put("outRefundId", onlinePayDtos.get(0).getPayId());//我们自己设定的退款申请号,约束为UK
        parameters.put("refundAmount", PayUtil.moneyToIntegerStr(Double.parseDouble(onlinePayDtos.get(0).getTotalFee())));//订单金额 单位为分!!!这里稍微注意一下
 
 
        String param = PlutusFactory.Encryption(parameters.toJSONString(), privateKey, payPassword, 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), payPassword);
        //服务器返回内容
        String paramOut = new String(bb);
        System.out.println(paramOut);
 
        JSONObject paramObj = JSONObject.parseObject(paramOut);
 
        if (paramObj.getIntValue("status") == 1) {
            doUpdateOnlinePay(onlinePayDtos.get(0).getOrderId(), OnlinePayDto.STATE_CT, "退款完成");
        } else {
            doUpdateOnlinePay(onlinePayDtos.get(0).getOrderId(), OnlinePayDto.STATE_FT, paramObj.getString("remark"));
        }
 
    }
 
    private void doUpdateOnlinePay(String orderId, String state, String message) {
        OnlinePayPo onlinePayPo = new OnlinePayPo();
        onlinePayPo.setMessage(!StringUtil.isEmpty(message) && message.length() > 1000 ? message.substring(0, 1000) : message);
        onlinePayPo.setOrderId(orderId);
        onlinePayPo.setState(state);
        onlinePayV1InnerServiceSMOImpl.updateOnlinePay(onlinePayPo);
    }
 
}