Helius
2021-06-29 5252d1396e21a16774be699a5ba1c8d39c14a22e
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
package com.xzx.gc.common.utils.payutil;
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
 
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.*;
 
@Service
@Slf4j
public class WxRequestParam {
 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
 
    /**
     * 小程序现金红包支付参数
     * @param m
     * @return
     */
    public String getXcxParam(Map<String, String> m){
 
        //四位随机数
        String mchBillno = WxConfig.MCH_ID+sdf.format(new Date())+(int)((Math.random()*9+1)*1000000000);
        String nonceStr = UUID.randomUUID().toString().replace("-", "");
        // 备注
        String remark = "beizhu";
        // 祝福语
        String wishing = "gongxifacai";
        // 场景id
        String sceneId = "PRODUCT_1";
        // 活动名称
        String actName = "gongxifacai";
        // 商户名称(微信红包发送者名称,最好用英文)
        String sendName = "xiaozongxiao";
        // 红包发放总人数
        String totalNum = "1";
 
        SortedMap<String, String> packageParams = new TreeMap<>();
        // 活动名称
        packageParams.put("act_name", actName);
        // 用户openId
        packageParams.put("re_openid", m.get("reOpenid"));
        // 商户名称(微信红包发送者名称,最好用英文)
        packageParams.put("send_name", sendName);
        // 红包金额
        packageParams.put("total_amount", m.get("totalAmount"));
        // 红包发放总人数
        packageParams.put("total_num", totalNum);
        // 通知用户形式
        packageParams.put("notify_way", WxConfig.WX_NOTITY_WAY);
        // 备注
        packageParams.put("remark", remark);
        // 商户订单号
        packageParams.put("mch_billno", mchBillno);
        // 商户号
        packageParams.put("mch_id", WxConfig.MCH_ID);
        // /随机字符串
        packageParams.put("nonce_str",nonceStr);
        // 场景id
        packageParams.put("scene_id", sceneId);
        // 红包祝福语
        packageParams.put("wishing", wishing);
        // 公众账号appid
        packageParams.put("wxappid", WxConfig.WXAPP_ID);
 
        //生成签名
        String sign = createSign(packageParams,WxConfig.WX_API_KEY,"UTF-8");
        String param="<xml>"+
                "<nonce_str>"+packageParams.get("nonce_str")+"</nonce_str>"+
                "<sign>"+sign+"</sign>"+
                "<mch_billno>"+packageParams.get("mch_billno")+"</mch_billno>"+
                "<mch_id>"+packageParams.get("mch_id")+"</mch_id>"+
                "<wxappid>"+packageParams.get("wxappid")+"</wxappid>"+
                "<send_name>"+packageParams.get("send_name")+"</send_name>"+
                "<re_openid>"+packageParams.get("re_openid")+"</re_openid>"+
                "<total_amount>"+packageParams.get("total_amount")+"</total_amount>"+
                "<total_num>"+packageParams.get("total_num")+"</total_num>"+
                "<wishing>"+packageParams.get("wishing")+"</wishing>"+
                "<act_name>"+packageParams.get("act_name")+"</act_name>"+
                "<remark>"+packageParams.get("remark")+"</remark>"+
                "<notify_way>"+packageParams.get("notify_way")+"</notify_way>"+
                "<scene_id>"+packageParams.get("scene_id")+"</scene_id>"+
                "</xml>";
        return param;
    }
 
    /**
     * 获取企业支付的支付参数
     * @param m
     */
    public String getQiyePayParam(Map<String, String> m){
        //四位随机数
        String mchBillno = WxConfig.MCH_ID+sdf.format(new Date())+(int)((Math.random()*9+1)*1000000000);
        String nonceStr = UUID.randomUUID().toString().replace("-", "");
 
        SortedMap<String, String> packageParams = new TreeMap<>();
 
        // 企业付款金额,单位为分
        packageParams.put("amount", m.get("totalAmount"));
        // 商户appid下,某用户的openid
        packageParams.put("openid", m.get("reOpenid"));
 
        // 申请商户号的appid或商户号绑定的appid
        packageParams.put("mch_appid", WxConfig.WXAPP_ID);
        // 微信支付分配的商户号
        packageParams.put("mchid", WxConfig.MCH_ID);
        // 微信支付分配的终端设备号
        // packageParams.put("device_info", "");
        // 随机字符串,不长于32位
        packageParams.put("nonce_str", nonceStr);
        // 商户订单号,需保持唯一性(只能是字母或者数字,不能包含有其他字符)
        packageParams.put("partner_trade_no", mchBillno);
        // NO_CHECK:不校验真实姓名 FORCE_CHECK:强校验真实姓名
        packageParams.put("check_name", "NO_CHECK");
        // 收款用户真实姓名。 如果check_name设置为FORCE_CHECK,则必填用户真实姓名
        packageParams.put("re_user_name", "xx");
        // 企业付款备注
        packageParams.put("desc", "remark");
        // Ip地址
        packageParams.put("spbill_create_ip", "0.0.0.0");
 
        //生成签名
        String sign = createSign(packageParams,WxConfig.WX_API_KEY,"UTF-8");
 
        String param="<xml>"+
                "<mch_appid>"+packageParams.get("mch_appid")+"</mch_appid>"+
                "<sign>"+sign+"</sign>"+
                "<mchid>"+packageParams.get("mchid")+"</mchid>"+
                "<nonce_str>"+packageParams.get("nonce_str")+"</nonce_str>"+
                "<partner_trade_no>"+packageParams.get("partner_trade_no")+"</partner_trade_no>"+
                "<openid>"+packageParams.get("openid")+"</openid>"+
                "<check_name>"+packageParams.get("check_name")+"</check_name>"+
                "<re_user_name>"+packageParams.get("re_user_name")+"</re_user_name>"+
                "<amount>"+packageParams.get("amount")+"</amount>"+
                "<desc>"+packageParams.get("desc")+"</desc>"+
                "<spbill_create_ip>"+packageParams.get("spbill_create_ip")+"</spbill_create_ip>"+
                "</xml>";
        return param;
    }
 
    String createSign(SortedMap<String, String> paraMap,String key,String charset) {
        StringBuffer sb = new StringBuffer();
        Set es = paraMap.entrySet();
        Iterator it = es.iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            String k = (String) entry.getKey();
            String v = (String) entry.getValue();
            if (null != v && !"".equals(v) && !"sign".equals(k)
                    && !"key".equals(k)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + key);
        System.out.println("===========签名参数====="+sb.toString());
        String sign = md5Password(sb.toString()).toUpperCase();
        // String sign = MD5Util.encode(sb.toString()).toUpperCase();
        System.out.println("===========生成的签名是====="+sign);
        return sign;
 
    }
 
    /**
     * 生成32位md5码
     *
     * @param key
     * @return
     */
    static String md5Password(String key) {
        char hexDigits[] = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
        };
        try {
            byte[] btInput = key.getBytes();
            // 获得MD5摘要算法的 MessageDigest 对象
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            // 使用指定的字节更新摘要
            mdInst.update(btInput);
            // 获得密文
            byte[] md = mdInst.digest();
            // 把密文转换成十六进制的字符串形式
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }
 
 
 
}