|
5 | 5 | import com.github.binarywang.wxpay.bean.result.WxEntPayResult; |
6 | 6 | import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; |
7 | 7 | import com.github.binarywang.wxpay.config.WxPayConfig; |
| 8 | +import com.github.binarywang.wxpay.exception.WxPayException; |
8 | 9 | import com.github.binarywang.wxpay.service.WxPayService; |
9 | 10 | import com.github.binarywang.wxpay.util.SignUtils; |
10 | | -import com.github.util.MD5Util; |
11 | 11 | import com.github.util.ReturnModel; |
12 | 12 | import com.github.util.Sha1Util; |
13 | 13 | import com.github.util.XMLUtil; |
14 | 14 | import com.google.gson.Gson; |
15 | 15 | import me.chanjar.weixin.common.exception.WxErrorException; |
16 | | -import org.apache.http.HttpEntity; |
17 | | -import org.apache.http.client.methods.CloseableHttpResponse; |
18 | | -import org.apache.http.client.methods.HttpPost; |
19 | | -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; |
20 | | -import org.apache.http.entity.StringEntity; |
21 | | -import org.apache.http.impl.client.CloseableHttpClient; |
22 | | -import org.apache.http.impl.client.HttpClients; |
23 | | -import org.apache.http.ssl.SSLContexts; |
24 | | -import org.apache.http.util.EntityUtils; |
25 | 16 | import org.springframework.beans.factory.annotation.Autowired; |
26 | 17 | import org.springframework.stereotype.Controller; |
27 | 18 | import org.springframework.web.bind.annotation.RequestMapping; |
28 | 19 |
|
29 | | -import javax.net.ssl.SSLContext; |
30 | 20 | import javax.servlet.http.HttpServletRequest; |
31 | 21 | import javax.servlet.http.HttpServletResponse; |
32 | | -import java.io.BufferedReader; |
33 | | -import java.io.File; |
34 | | -import java.io.FileInputStream; |
35 | | -import java.io.InputStreamReader; |
36 | | -import java.security.KeyStore; |
37 | | -import java.util.HashMap; |
38 | 22 | import java.util.Map; |
39 | | -import java.util.Set; |
40 | | -import java.util.TreeMap; |
41 | | - |
42 | | -import static java.nio.charset.StandardCharsets.UTF_8; |
43 | 23 |
|
44 | 24 | /** |
45 | 25 | * 微信支付Controller |
|
51 | 31 | @RequestMapping(value = "wxPay") |
52 | 32 | public class PaymentController extends GenericController { |
53 | 33 |
|
54 | | -@Autowired |
55 | | -private WxPayConfig payConfig; |
56 | | -@Autowired |
57 | | -private WxPayService payService; |
| 34 | + @Autowired |
| 35 | + private WxPayConfig payConfig; |
| 36 | + @Autowired |
| 37 | + private WxPayService payService; |
58 | 38 |
|
59 | | -/** |
60 | | - * 用于返回预支付的结果 WxMpPrepayIdResult,一般不需要使用此接口 |
61 | | - * |
62 | | - * @param response |
63 | | - * @param request |
64 | | - * @throws WxErrorException |
65 | | - */ |
66 | | -@RequestMapping(value = "getPrepayIdResult") |
67 | | -public void getPrepayId(HttpServletResponse response, |
68 | | - HttpServletRequest request) throws WxErrorException { |
69 | | -WxPayUnifiedOrderRequest payInfo = new WxPayUnifiedOrderRequest(); |
70 | | -payInfo.setOpenid(request.getParameter("openid")); |
71 | | -payInfo.setOutTradeNo(request.getParameter("out_trade_no")); |
72 | | -payInfo.setTotalFee(Integer.valueOf(request.getParameter("total_fee"))); |
73 | | -payInfo.setBody(request.getParameter("body")); |
74 | | -payInfo.setTradeType(request.getParameter("trade_type")); |
75 | | -payInfo.setSpbillCreateIp(request.getParameter("spbill_create_ip")); |
76 | | -payInfo.setNotifyURL(""); |
77 | | -this.logger |
78 | | -.info("PartnerKey is :" + this.payConfig.getMchKey()); |
79 | | -WxPayUnifiedOrderResult result = this.payService.unifiedOrder(payInfo); |
80 | | -this.logger.info(new Gson().toJson(result)); |
81 | | -renderString(response, result); |
82 | | -} |
| 39 | + /** |
| 40 | + * 用于返回预支付的结果 WxMpPrepayIdResult,一般不需要使用此接口 |
| 41 | + * |
| 42 | + * @param response |
| 43 | + * @param request |
| 44 | + * @throws WxErrorException |
| 45 | + */ |
| 46 | + @RequestMapping(value = "getPrepayIdResult") |
| 47 | + public void getPrepayId(HttpServletResponse response, |
| 48 | + HttpServletRequest request) throws WxErrorException, WxPayException { |
| 49 | + WxPayUnifiedOrderRequest payInfo = WxPayUnifiedOrderRequest.newBuilder() |
| 50 | + .openid(request.getParameter("openid")) |
| 51 | + .outTradeNo(request.getParameter("out_trade_no")) |
| 52 | + .totalFee(Integer.valueOf(request.getParameter("total_fee"))) |
| 53 | + .body(request.getParameter("body")) |
| 54 | + .tradeType(request.getParameter("trade_type")) |
| 55 | + .spbillCreateIp(request.getParameter("spbill_create_ip")) |
| 56 | + .notifyURL("") |
| 57 | + .build(); |
| 58 | + this.logger |
| 59 | + .info("PartnerKey is :" + this.payConfig.getMchKey()); |
| 60 | + WxPayUnifiedOrderResult result = this.payService.unifiedOrder(payInfo); |
| 61 | + this.logger.info(new Gson().toJson(result)); |
| 62 | + renderString(response, result); |
| 63 | + } |
83 | 64 |
|
84 | | -/** |
85 | | - * 返回前台H5调用JS支付所需要的参数,公众号支付调用此接口 |
86 | | - * |
87 | | - * @param response |
88 | | - * @param request |
89 | | - */ |
90 | | -@RequestMapping(value = "getJSSDKPayInfo") |
91 | | -public void getJSSDKPayInfo(HttpServletResponse response, |
92 | | - HttpServletRequest request) { |
93 | | -ReturnModel returnModel = new ReturnModel(); |
94 | | -WxPayUnifiedOrderRequest prepayInfo = new WxPayUnifiedOrderRequest(); |
95 | | -prepayInfo.setOpenid(request.getParameter("openid")); |
96 | | -prepayInfo.setOutTradeNo(request.getParameter("out_trade_no")); |
97 | | -prepayInfo.setTotalFee(Integer.valueOf(request.getParameter("total_fee"))); |
98 | | -prepayInfo.setBody(request.getParameter("body")); |
99 | | -prepayInfo.setTradeType(request.getParameter("trade_type")); |
100 | | -prepayInfo.setSpbillCreateIp(request.getParameter("spbill_create_ip")); |
101 | | -//TODO(user) 填写通知回调地址 |
102 | | -prepayInfo.setNotifyURL(""); |
| 65 | + /** |
| 66 | + * 返回前台H5调用JS支付所需要的参数,公众号支付调用此接口 |
| 67 | + * |
| 68 | + * @param response |
| 69 | + * @param request |
| 70 | + */ |
| 71 | + @RequestMapping(value = "getJSSDKPayInfo") |
| 72 | + public void getJSSDKPayInfo(HttpServletResponse response, |
| 73 | + HttpServletRequest request) { |
| 74 | + ReturnModel returnModel = new ReturnModel(); |
| 75 | + WxPayUnifiedOrderRequest prepayInfo = WxPayUnifiedOrderRequest.newBuilder() |
| 76 | + .openid(request.getParameter("openid")) |
| 77 | + .outTradeNo(request.getParameter("out_trade_no")) |
| 78 | + .totalFee(Integer.valueOf(request.getParameter("total_fee"))) |
| 79 | + .body(request.getParameter("body")) |
| 80 | + .tradeType(request.getParameter("trade_type")) |
| 81 | + .spbillCreateIp(request.getParameter("spbill_create_ip")) |
| 82 | + .notifyURL("")//TODO(user) 填写通知回调地址 |
| 83 | + .build(); |
103 | 84 |
|
104 | | -try { |
105 | | -Map<String, String> payInfo = this.payService.getPayInfo(prepayInfo); |
106 | | -returnModel.setResult(true); |
107 | | -returnModel.setDatum(payInfo); |
108 | | -renderString(response, returnModel); |
109 | | -} catch (WxErrorException e) { |
110 | | -returnModel.setResult(false); |
111 | | -returnModel.setReason(e.getError().toString()); |
112 | | -renderString(response, returnModel); |
113 | | -this.logger.error(e.getError().toString()); |
114 | | -} |
115 | | -} |
| 85 | + try { |
| 86 | + Map<String, String> payInfo = this.payService.getPayInfo(prepayInfo); |
| 87 | + returnModel.setResult(true); |
| 88 | + returnModel.setDatum(payInfo); |
| 89 | + renderString(response, returnModel); |
| 90 | + } catch (WxPayException e) { |
| 91 | + returnModel.setResult(false); |
| 92 | + returnModel.setReason(e.getErrCodeDes()); |
| 93 | + renderString(response, returnModel); |
| 94 | + this.logger.error(e.getErrCodeDes()); |
| 95 | + } |
| 96 | + } |
116 | 97 |
|
117 | | -/** |
118 | | - * 微信通知支付结果的回调地址,notify_url |
119 | | - * |
120 | | - * @param request |
121 | | - * @param response |
122 | | - */ |
123 | | -@RequestMapping(value = "getJSSDKCallbackData") |
124 | | -public void getJSSDKCallbackData(HttpServletRequest request, |
125 | | - HttpServletResponse response) { |
126 | | -try { |
127 | | -synchronized (this) { |
128 | | -Map<String, String> kvm = XMLUtil.parseRequestXmlToMap(request); |
129 | | -if (SignUtils.checkSign(kvm, this.payConfig.getMchKey())) { |
130 | | -if (kvm.get("result_code").equals("SUCCESS")) { |
131 | | -//TODO(user) 微信服务器通知此回调接口支付成功后,通知给业务系统做处理 |
132 | | -logger.info("out_trade_no: " + kvm.get("out_trade_no") + " pay SUCCESS!"); |
133 | | -response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[ok]]></return_msg></xml>"); |
134 | | -} else { |
135 | | -this.logger.error("out_trade_no: " |
136 | | -+ kvm.get("out_trade_no") + " result_code is FAIL"); |
137 | | -response.getWriter().write( |
138 | | -"<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[result_code is FAIL]]></return_msg></xml>"); |
139 | | -} |
140 | | -} else { |
141 | | -response.getWriter().write( |
142 | | -"<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[check signature FAIL]]></return_msg></xml>"); |
143 | | -this.logger.error("out_trade_no: " + kvm.get("out_trade_no") |
144 | | -+ " check signature FAIL"); |
145 | | -} |
146 | | -} |
147 | | -} catch (Exception e) { |
148 | | -e.printStackTrace(); |
149 | | -} |
150 | | -} |
| 98 | + /** |
| 99 | + * 微信通知支付结果的回调地址,notify_url |
| 100 | + * |
| 101 | + * @param request |
| 102 | + * @param response |
| 103 | + */ |
| 104 | + @RequestMapping(value = "getJSSDKCallbackData") |
| 105 | + public void getJSSDKCallbackData(HttpServletRequest request, |
| 106 | + HttpServletResponse response) { |
| 107 | + try { |
| 108 | + synchronized (this) { |
| 109 | + Map<String, String> kvm = XMLUtil.parseRequestXmlToMap(request); |
| 110 | + if (SignUtils.checkSign(kvm, this.payConfig.getMchKey())) { |
| 111 | + if (kvm.get("result_code").equals("SUCCESS")) { |
| 112 | + //TODO(user) 微信服务器通知此回调接口支付成功后,通知给业务系统做处理 |
| 113 | + logger.info("out_trade_no: " + kvm.get("out_trade_no") + " pay SUCCESS!"); |
| 114 | + response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[ok]]></return_msg></xml>"); |
| 115 | + } else { |
| 116 | + this.logger.error("out_trade_no: " |
| 117 | + + kvm.get("out_trade_no") + " result_code is FAIL"); |
| 118 | + response.getWriter().write( |
| 119 | + "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[result_code is FAIL]]></return_msg></xml>"); |
| 120 | + } |
| 121 | + } else { |
| 122 | + response.getWriter().write( |
| 123 | + "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[check signature FAIL]]></return_msg></xml>"); |
| 124 | + this.logger.error("out_trade_no: " + kvm.get("out_trade_no") |
| 125 | + + " check signature FAIL"); |
| 126 | + } |
| 127 | + } |
| 128 | + } catch (Exception e) { |
| 129 | + e.printStackTrace(); |
| 130 | + } |
| 131 | + } |
151 | 132 |
|
152 | | -@RequestMapping(value = "entPay") |
153 | | -public void payToIndividual(HttpServletResponse response, |
154 | | - HttpServletRequest request) { |
155 | | -WxEntPayRequest wxEntPayRequest = new WxEntPayRequest(); |
156 | | -wxEntPayRequest.setAppid(payConfig.getAppId()); |
157 | | -wxEntPayRequest.setMchId(payConfig.getMchId()); |
158 | | -wxEntPayRequest.setNonceStr(Sha1Util.getNonceStr()); |
159 | | -wxEntPayRequest.setPartnerTradeNo(request.getParameter("partner_trade_no")); |
160 | | -wxEntPayRequest.setOpenid(request.getParameter("openid")); |
161 | | -wxEntPayRequest.setCheckName("NO_CHECK"); |
162 | | -wxEntPayRequest.setAmount(Integer.valueOf(request.getParameter("amount"))); |
163 | | -wxEntPayRequest.setDescription(request.getParameter("desc")); |
164 | | -wxEntPayRequest.setSpbillCreateIp(request.getParameter("spbill_create_ip")); |
| 133 | + @RequestMapping(value = "entPay") |
| 134 | + public void payToIndividual(HttpServletResponse response, |
| 135 | + HttpServletRequest request) { |
| 136 | + WxEntPayRequest wxEntPayRequest = new WxEntPayRequest(); |
| 137 | + wxEntPayRequest.setAppid(payConfig.getAppId()); |
| 138 | + wxEntPayRequest.setMchId(payConfig.getMchId()); |
| 139 | + wxEntPayRequest.setNonceStr(Sha1Util.getNonceStr()); |
| 140 | + wxEntPayRequest.setPartnerTradeNo(request.getParameter("partner_trade_no")); |
| 141 | + wxEntPayRequest.setOpenid(request.getParameter("openid")); |
| 142 | + wxEntPayRequest.setCheckName("NO_CHECK"); |
| 143 | + wxEntPayRequest.setAmount(Integer.valueOf(request.getParameter("amount"))); |
| 144 | + wxEntPayRequest.setDescription(request.getParameter("desc")); |
| 145 | + wxEntPayRequest.setSpbillCreateIp(request.getParameter("spbill_create_ip")); |
165 | 146 |
|
166 | | -try { |
167 | | -WxEntPayResult wxEntPayResult = payService.entPay(wxEntPayRequest); |
168 | | -if ("SUCCESS".equals(wxEntPayResult.getResultCode().toUpperCase()) |
169 | | -&& "SUCCESS" |
170 | | -.equals(wxEntPayResult.getReturnCode().toUpperCase())) { |
171 | | -this.logger.info("企业对个人付款成功!\n付款信息:\n" + wxEntPayResult.toString()); |
172 | | -} else { |
173 | | -this.logger.error("err_code: " + wxEntPayResult.getErrCode() |
174 | | -+ " err_code_des: " + wxEntPayResult.getErrCodeDes()); |
175 | | -} |
176 | | -} catch (Exception e) { |
177 | | -e.printStackTrace(); |
178 | | -} |
179 | | -} |
| 147 | + try { |
| 148 | + WxEntPayResult wxEntPayResult = payService.entPay(wxEntPayRequest); |
| 149 | + if ("SUCCESS".equals(wxEntPayResult.getResultCode().toUpperCase()) |
| 150 | + && "SUCCESS" |
| 151 | + .equals(wxEntPayResult.getReturnCode().toUpperCase())) { |
| 152 | + this.logger.info("企业对个人付款成功!\n付款信息:\n" + wxEntPayResult.toString()); |
| 153 | + } else { |
| 154 | + this.logger.error("err_code: " + wxEntPayResult.getErrCode() |
| 155 | + + " err_code_des: " + wxEntPayResult.getErrCodeDes()); |
| 156 | + } |
| 157 | + } catch (Exception e) { |
| 158 | + e.printStackTrace(); |
| 159 | + } |
| 160 | + } |
180 | 161 |
|
181 | 162 | } |
182 | 163 |
|
0 commit comments