yujian
2019-10-16 a3e1aec60d2f886b8c48966c889b567719d0c5ea
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
package org.yeshi.utils.wx;
 
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
 
import org.yeshi.utils.HttpUtil;
import org.yeshi.utils.StringUtil;
import org.yeshi.utils.entity.wx.RedPackParams;
import org.yeshi.utils.entity.wx.WXAPPInfo;
import org.yeshi.utils.entity.wx.WXPlaceOrderParams;
import org.yeshi.utils.exception.WXPlaceOrderParamsException;
 
/**
 * 微信支付帮助类
 * 
 * @author Administrator
 *
 */
public class WXPayUtil {
 
    public static String payToOpenId(String appId, String openId, String mchId, String key, String pwd,
            InputStream cert, String orderNo, BigDecimal money, String desc, String ip) {
        Map<String, String> map = new HashMap<>();
        map.put("mch_appid", appId);
        map.put("mchid", mchId);
        map.put("nonce_str", StringUtil.getRandomCode(32));
        map.put("partner_trade_no", orderNo);
        map.put("openid", openId);
        map.put("check_name", "NO_CHECK");
        map.put("amount", money.multiply(new BigDecimal(100)).intValue() + "");
        map.put("desc", desc);
        map.put("spbill_create_ip", ip);
        map.put("sign", WXUtil.getSignMD5(map, key));
        String entity = WXUtil.loadWXMessage(map);
        try {
            String result = HttpUtil.httpsPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers",
                    entity, pwd, cert);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * 发放微信红包
     * 
     * @param params
     * @param pwd
     * @param cert
     * @return
     */
    public static String redPackToOpenId(RedPackParams params, String pwd, InputStream cert) {
        // 转化成分
        BigDecimal money = params.getMoney();
        money = money.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_DOWN);
 
        Map<String, String> map = new HashMap<>();
        map.put("nonce_str", StringUtil.getRandomCode(32));
        map.put("mch_billno", params.getBillno());
        map.put("mch_id", params.getMchId());
        map.put("wxappid", params.getWxappId());
        map.put("send_name", params.getSendName());
        map.put("re_openid", params.getOpenid());
        map.put("total_amount", money.toString());
        map.put("total_num", params.getTotalNum() + "");
        map.put("wishing", params.getWishing());
        map.put("client_ip", params.getClientIp());
        map.put("act_name", params.getActName());
        map.put("remark", params.getRemark());
 
        if (!StringUtil.isNullOrEmpty(params.getSceneId()))
            map.put("scene_id", params.getSceneId());
 
        if (!StringUtil.isNullOrEmpty(params.getRiskInfo()))
            map.put("risk_info", params.getRiskInfo());
 
        map.put("sign", WXUtil.getSignMD5(map, params.getKey()));
        String entity = WXUtil.loadWXMessage(map);
        try {
            String result = HttpUtil.httpsPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", entity,
                    pwd, cert);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * 查询红包领取记录
     * 
     * @param billno
     *            商户订单号
     * @param mchId
     *            商户号
     * @param key
     * @param appId
     *            Appid
     * @param pwd
     * @param cert
     * @return
     */
    public static String getRedPackRecord(String billno, String mchId, String appId, String key, String pwd,
            InputStream cert) {
        Map<String, String> map = new HashMap<>();
        map.put("mch_billno", billno);
        map.put("mch_id", mchId);
        map.put("wxappid", appId);
        map.put("bill_type", "MCHT");
        map.put("nonce_str", StringUtil.getRandomCode(32));
        map.put("sign", WXUtil.getSignMD5(map, key));
        String entity = WXUtil.loadWXMessage(map);
        try {
            String result = HttpUtil.httpsPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo", entity, pwd,
                    cert);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * 微信支付统一下单
     * 
     * @param params
     * @return
     * @throws WXPlaceOrderParamsException
     */
    public static Map<String, String> produceOrder(WXPlaceOrderParams params) throws WXPlaceOrderParamsException {
        if (params == null)
            throw new WXPlaceOrderParamsException(1, "请传入下单参数");
 
        if (params.getInfo() == null)
            throw new WXPlaceOrderParamsException(2, "请传入下单应用信息");
 
        if (StringUtil.isNullOrEmpty(params.getInfo().getAppId()))
            throw new WXPlaceOrderParamsException(201, "请传入下单应用信息-appId");
        if (StringUtil.isNullOrEmpty(params.getInfo().getAppSecret()))
            throw new WXPlaceOrderParamsException(202, "请传入下单应用信息-appSecret");
        if (StringUtil.isNullOrEmpty(params.getInfo().getMchId()))
            throw new WXPlaceOrderParamsException(203, "请传入下单应用信息-mchId");
        if (StringUtil.isNullOrEmpty(params.getInfo().getMchKey()))
            throw new WXPlaceOrderParamsException(204, "请传入下单应用信息-mchKey");
        if (StringUtil.isNullOrEmpty(params.getBody()))
            throw new WXPlaceOrderParamsException(3, "请传入body");
 
        if (StringUtil.isNullOrEmpty(params.getOrderNo()))
            throw new WXPlaceOrderParamsException(4, "请传入orderNo");
 
        if (params.getFee() == null)
            throw new WXPlaceOrderParamsException(5, "请传入fee");
 
        if (StringUtil.isNullOrEmpty(params.getIp()))
            throw new WXPlaceOrderParamsException(6, "请传入ip");
 
        if (StringUtil.isNullOrEmpty(params.getNotifyUrl()))
            throw new WXPlaceOrderParamsException(7, "请传入notifyUrl");
 
        if (StringUtil.isNullOrEmpty(params.getTradeType()))
            throw new WXPlaceOrderParamsException(8, "请传入tradeType");
 
//        if (StringUtil.isNullOrEmpty(params.getOpenId()))
//            throw new WXPlaceOrderParamsException(9, "请传入openId");
 
        Map<String, String> map = new HashMap<String, String>();
        map.put("appid", params.getInfo().getAppId());
        map.put("mch_id", params.getInfo().getMchId());
        map.put("nonce_str", StringUtil.getRandomCode(32));
        map.put("body", params.getBody());
        map.put("out_trade_no", params.getOrderNo());
        map.put("total_fee", "" + params.getFee().multiply(new BigDecimal(100)).intValue());
        map.put("spbill_create_ip", params.getIp());
        map.put("notify_url", params.getNotifyUrl());
        map.put("trade_type", params.getTradeType());
        if (!StringUtil.isNullOrEmpty(params.getOpenId()))
            map.put("openid", params.getOpenId());
        map.put("sign", WXUtil.getSignMD5(map, params.getInfo().getMchKey()));
 
        String entity = WXUtil.loadWXMessage(map);
 
        String result = HttpUtil.post("https://api.mch.weixin.qq.com/pay/unifiedorder", entity);
        System.out.println("统一下单结果:" + result);
        Map<String, String> resultMap = WXUtil.parseXML(result);
 
        return resultMap;
    }
}