mitao
2025-02-21 31573d6180d15ef65ed0df9c2732495f40b12663
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
package com.panzhihua.common.utlis;
 
import java.math.BigDecimal;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
 
import com.panzhihua.common.utlis.wx.WXPayUtil;
import org.json.XML;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.panzhihua.common.constants.PayCpmstant;
 
import lombok.extern.slf4j.Slf4j;
 
@Slf4j
public class WxPayUtils {
 
    public static String getUnifiedorder(String appid, String mchId, String payKey, String notifyUrl, String body,
        String openid, String outTradeNo, BigDecimal money,String attach) {
        String nonceStr = PayUtil.makeUUID(32);
        SortedMap<Object, Object> params = new TreeMap<>();
        params.put("appid", appid);
        params.put("body", body);
        params.put("mch_id", mchId);
        params.put("nonce_str", nonceStr);
        params.put("notify_url", notifyUrl);
        params.put("openid", openid);
        //附加数据
        if(StringUtils.isNotEmpty(attach)){
            params.put("attach", attach);
        }
        params.put("out_trade_no", outTradeNo);// 商品订单号
        params.put("spbill_create_ip", PayUtil.getLocalIp());// 服务部署的ip
        params.put("total_fee", PayUtil.moneyToIntegerStr(money));// 费用的参数转型
        params.put("trade_type", "JSAPI");// 对接类型
        params.put("sign", PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, params, payKey));// MD5签名
        // 转换成xml
        String xmlData = PayUtil.getRequestXml(params);
        // 请求微信后台,获取支付id
        String resXml = HttpClientUtil.httpsRequest(PayCpmstant.UNIFIEDORDER_URL, xmlData);
        log.info("请求微信支付返回参数:" + resXml);
 
        org.json.JSONObject resultData = XML.toJSONObject(resXml);
        JSONObject data = JSON.parseObject(resultData.get("xml").toString());
        JSONObject result = new JSONObject();
        if (data.get("return_msg").equals(PayCpmstant.RETURN_MSG)
            && data.get("return_code").equals(PayCpmstant.RETURN_CODE)) {
            // 将微信统一下单成功的参数拼接再签名
            // 统一下单返回prepay_id
            String prepayId = "prepay_id=" + data.getString("prepay_id");
            // 时间戳
            Long timeStamp = System.currentTimeMillis() / 1000;
            // 封装需要签名的字段
            SortedMap<Object, Object> payParams = new TreeMap<>();
            payParams.put("appId", appid);
            payParams.put("nonceStr", nonceStr);
            payParams.put("package", prepayId);
            payParams.put("signType", PayCpmstant.SIGN_TYPE);
            payParams.put("timeStamp", timeStamp);
            // 将参数以及签名计算完成封装返回给前端
            result.put("timeStamp", timeStamp);
            result.put("nonceStr", nonceStr);
            result.put("package", prepayId);
            result.put("signType", PayCpmstant.SIGN_TYPE);
            result.put("paySign", PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, payParams, payKey));
        }
        return result.toJSONString();
    }
 
    public static SortedMap<Object, Object> prepayId(Map<String, String> map) {
        SortedMap<Object, Object> parameters = new TreeMap<>();
        parameters.put("appId", "");
        parameters.put("timeStamp", PayUtil.create_timestamp());
        parameters.put("nonceStr", map.get("nonce_str"));
        parameters.put("package", "prepay_id=" + map.get("prepay_id"));
        parameters.put("signType", "MD5");
        String sign = PayUtil.createSign("UTF-8", parameters, "商户秘钥");
        parameters.put("prepay_id", "prepay_id=" + map.get("prepay_id"));
        parameters.put("paySign", sign);
        return parameters;
    }
    public static String h5pay(String appid, String mchId, String payKey, String notifyUrl, String body,
                               String openid, String outTradeNo, BigDecimal money, String tradeType, String clientIp) {
        String nonceStr = PayUtil.makeUUID(32);
        SortedMap<Object, Object> params = new TreeMap<>();
        params.put("appid", appid);
        params.put("body", body);
        params.put("mch_id", mchId);
        params.put("nonce_str", nonceStr);
        params.put("notify_url", notifyUrl);
        params.put("openid", openid);
        params.put("out_trade_no", outTradeNo);// 商品订单号
        params.put("spbill_create_ip", clientIp);// 用户真实ip
        params.put("total_fee", PayUtil.moneyToIntegerStr(money));// 费用的参数转型
        params.put("trade_type", tradeType);// 对接类型
        params.put("sign", PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, params, payKey));// MD5签名
        // 转换成xml
        String xmlData = PayUtil.getRequestXml(params);
        // 请求微信后台,获取支付id
        String resXml = HttpClientUtil.httpsRequest(PayCpmstant.UNIFIEDORDER_URL, xmlData);
        log.info("请求微信支付返回参数:" + resXml);
 
        org.json.JSONObject resultData = XML.toJSONObject(resXml);
        JSONObject data = JSON.parseObject(resultData.get("xml").toString());
        JSONObject result = new JSONObject();
 
            if (data.get("return_msg").equals(PayCpmstant.RETURN_MSG)
                    && data.get("return_code").equals(PayCpmstant.RETURN_CODE)) {
                // 将微信统一下单成功的参数拼接再签名
                // 统一下单返回prepay_id
                if(tradeType.equals("JSAPI")) {
                    String prepayId = "prepay_id=" + data.getString("prepay_id");
                    // 时间戳
                    Long timeStamp = System.currentTimeMillis() / 1000;
                    // 封装需要签名的字段
                    SortedMap<Object, Object> payParams = new TreeMap<>();
                    payParams.put("appId", appid);
                    payParams.put("nonceStr", nonceStr);
                    payParams.put("package", prepayId);
                    payParams.put("signType", PayCpmstant.SIGN_TYPE);
                    payParams.put("timeStamp", timeStamp);
                    // 将参数以及签名计算完成封装返回给前端
                    result.put("timeStamp", timeStamp);
                    result.put("nonceStr", nonceStr);
                    result.put("package", prepayId);
                    result.put("signType", PayCpmstant.SIGN_TYPE);
                    result.put("paySign", PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, payParams, payKey));
                }
                else if(tradeType.equals("NATIVE")) {
                    result.put("codeUrl",data.getString("code_url"));
                } else if(tradeType.equals("MWEB")) {
                    result.put("mWebUrl",data.getString("mweb_url"));
                }
            }
 
 
 
        return result.toJSONString();
    }
 
    public static String refund(String appid,String mchId,String orderNo,BigDecimal totalFee,BigDecimal refundFee,String refundNo,Boolean isTest) throws Exception {
        //创建请求地址
        String url = PayCpmstant.REFUND_URL;
        Map<String, String> paramMap = new LinkedHashMap<>();
        paramMap.put("appid",appid);
        paramMap.put("mch_id",mchId);
        paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
        paramMap.put("out_refund_no",refundNo);
        paramMap.put("out_trade_no",orderNo);
        paramMap.put("refund_fee",String.valueOf(refundFee.multiply(BigDecimal.valueOf(100)).longValue()));
        paramMap.put("total_fee",String.valueOf(totalFee.multiply(BigDecimal.valueOf(100)).longValue()));
        paramMap.put("sign",WXPayUtil.generateSignature(paramMap,PayCpmstant.REFUND_KEY));
        log.info("微信退款请求参数:{},{},{},{}",url,WXPayUtil.mapToXml(paramMap),mchId,isTest);
        //接收请求返回值
        return HttpClientUtil.doRefund(url,WXPayUtil.mapToXml(paramMap),mchId,isTest);
 
    }
}