国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java通過(guò)JsApi方式實(shí)現(xiàn)微信支付

Java通過(guò)JsApi方式實(shí)現(xiàn)微信支付

2019-12-30 13:44縱酒揮刀斬人頭 JAVA教程

本文講解了Java如何實(shí)現(xiàn)JsApi方式的微信支付,代碼內(nèi)容詳細(xì),文章思路清晰,需要的朋友可以參考下

要使用JsApi進(jìn)行微信支付,首先要從微信獲得一個(gè)prepay_id,然后通過(guò)調(diào)用微信的jsapi完成支付,JS API的返回結(jié)果get_brand_wcpay_request:ok僅在用戶成功完成支付時(shí)返回。由于前端交互復(fù)雜,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以統(tǒng)一處理為用戶遇到錯(cuò)誤或者主動(dòng)放棄,不必細(xì)化區(qū)分。
示例代碼如下:

?
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
function onBridgeReady(){
 WeixinJSBridge.invoke(
 'getBrandWCPayRequest', {
 "appId" : "wx2421b1c4370ec43b", //公眾號(hào)名稱(chēng),由商戶傳入
 "timeStamp":" 1395712654", //時(shí)間戳,自1970年以來(lái)的秒數(shù)
 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //隨機(jī)串
 "package" : "u802345jgfjsdfgsdg888",
 "signType" : "MD5", //微信簽名方式:
 "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名
 },
 function(res){
 if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:res.err_msg將在用戶支付成功后返回 ok,但并不保證它絕對(duì)可靠。
 }
 );
}
if (typeof WeixinJSBridge == "undefined"){
 if( document.addEventListener ){
 document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
 }else if (document.attachEvent){
 document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
 document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
 }
}else{
 onBridgeReady();
}

以上傳入的參數(shù)package,即為prepay_id

下面講的是獲得參數(shù)來(lái)調(diào)用jsapi
我們調(diào)用JSAPI時(shí),必須獲得用戶的openid,(trade_type=JSAPI,openid為必填參數(shù)。)
首先定義一個(gè)請(qǐng)求的對(duì)象:

?
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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
package com.unstoppedable.protocol;
 
 
 
import com.unstoppedable.common.Configure;
import com.unstoppedable.common.HttpService;
import com.unstoppedable.common.RandomStringGenerator;
import com.unstoppedable.common.Signature;
 
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
 
 
public class UnifiedOrderReqData {
 
 private String appid;
 private String mch_id;
 private String device_info;
 private String nonce_str;
 private String sign;
 private String body;
 private String detail;
 private String attach;
 private String out_trade_no;
 private String fee_type;
 private int total_fee;
 private String spbill_create_ip;
 private String time_start;
 private String time_expire;
 private String goods_tag;
 private String notify_url;
 private String trade_type;
 private String product_id;
 private String limit_pay;
 private String openid;
 
 private UnifiedOrderReqData(UnifiedOrderReqDataBuilder builder) {
 this.appid = builder.appid;
 this.mch_id = builder.mch_id;
 this.device_info = builder.device_info;
 this.nonce_str = RandomStringGenerator.getRandomStringByLength(32);
 this.body = builder.body;
 this.detail = builder.detail;
 this.attach = builder.attach;
 this.out_trade_no = builder.out_trade_no;
 this.fee_type = builder.fee_type;
 this.total_fee = builder.total_fee;
 this.spbill_create_ip = builder.spbill_create_ip;
 this.time_start = builder.time_start;
 this.time_expire = builder.time_expire;
 this.goods_tag = builder.goods_tag;
 this.notify_url = builder.notify_url;
 this.trade_type = builder.trade_type;
 this.product_id = builder.product_id;
 this.limit_pay = builder.limit_pay;
 this.openid = builder.openid;
 this.sign = Signature.getSign(toMap());
 }
 
 
 public void setAppid(String appid) {
 this.appid = appid;
 }
 
 public void setMch_id(String mch_id) {
 this.mch_id = mch_id;
 }
 
 public void setDevice_info(String device_info) {
 this.device_info = device_info;
 }
 
 public void setNonce_str(String nonce_str) {
 this.nonce_str = nonce_str;
 }
 
 public void setSign(String sign) {
 this.sign = sign;
 }
 
 public void setBody(String body) {
 this.body = body;
 }
 
 public void setDetail(String detail) {
 this.detail = detail;
 }
 
 public void setAttach(String attach) {
 this.attach = attach;
 }
 
 public void setOut_trade_no(String out_trade_no) {
 this.out_trade_no = out_trade_no;
 }
 
 public void setFee_type(String fee_type) {
 this.fee_type = fee_type;
 }
 
 public void setTotal_fee(int total_fee) {
 this.total_fee = total_fee;
 }
 
 public void setSpbill_create_ip(String spbill_create_ip) {
 this.spbill_create_ip = spbill_create_ip;
 }
 
 public void setTime_start(String time_start) {
 this.time_start = time_start;
 }
 
 public void setTime_expire(String time_expire) {
 this.time_expire = time_expire;
 }
 
 public void setGoods_tag(String goods_tag) {
 this.goods_tag = goods_tag;
 }
 
 public void setNotify_url(String notify_url) {
 this.notify_url = notify_url;
 }
 
 public void setTrade_type(String trade_type) {
 this.trade_type = trade_type;
 }
 
 public void setProduct_id(String product_id) {
 this.product_id = product_id;
 }
 
 public void setLimit_pay(String limit_pay) {
 this.limit_pay = limit_pay;
 }
 
 public void setOpenid(String openid) {
 this.openid = openid;
 }
 
 public Map<String, Object> toMap() {
 Map<String, Object> map = new HashMap<String, Object>();
 Field[] fields = this.getClass().getDeclaredFields();
 for (Field field : fields) {
 Object obj;
 try {
 obj = field.get(this);
 if (obj != null) {
  map.put(field.getName(), obj);
 }
 } catch (IllegalArgumentException e) {
 e.printStackTrace();
 } catch (IllegalAccessException e) {
 e.printStackTrace();
 }
 }
 return map;
 }
 
 
 public static class UnifiedOrderReqDataBuilder {
 private String appid;
 private String mch_id;
 private String device_info;
 private String body;
 private String detail;
 private String attach;
 private String out_trade_no;
 private String fee_type;
 private int total_fee;
 private String spbill_create_ip;
 private String time_start;
 private String time_expire;
 private String goods_tag;
 private String notify_url;
 private String trade_type;
 private String product_id;
 private String limit_pay;
 private String openid;
 
 public UnifiedOrderReqDataBuilder(String appid, String mch_id, String body, String out_trade_no, Integer total_fee,
   String spbill_create_ip, String notify_url, String trade_type) {
 if (appid == null) {
 throw new IllegalArgumentException("傳入?yún)?shù)appid不能為null");
 }
 if (mch_id == null) {
 throw new IllegalArgumentException("傳入?yún)?shù)mch_id不能為null");
 }
 if (body == null) {
 throw new IllegalArgumentException("傳入?yún)?shù)body不能為null");
 }
 if (out_trade_no == null) {
 throw new IllegalArgumentException("傳入?yún)?shù)out_trade_no不能為null");
 }
 if (total_fee == null) {
 throw new IllegalArgumentException("傳入?yún)?shù)total_fee不能為null");
 }
 if (spbill_create_ip == null) {
 throw new IllegalArgumentException("傳入?yún)?shù)spbill_create_ip不能為null");
 }
 if (notify_url == null) {
 throw new IllegalArgumentException("傳入?yún)?shù)notify_url不能為null");
 }
 if (trade_type == null) {
 throw new IllegalArgumentException("傳入?yún)?shù)trade_type不能為null");
 }
 this.appid = appid;
 this.mch_id = mch_id;
 this.body = body;
 this.out_trade_no = out_trade_no;
 this.total_fee = total_fee;
 this.spbill_create_ip = spbill_create_ip;
 this.notify_url = notify_url;
 this.trade_type = trade_type;
 }
 
 public UnifiedOrderReqDataBuilder setDevice_info(String device_info) {
 this.device_info = device_info;
 return this;
 }
 
 public UnifiedOrderReqDataBuilder setDetail(String detail) {
 this.detail = detail;
 return this;
 }
 
 public UnifiedOrderReqDataBuilder setAttach(String attach) {
 this.attach = attach;
 return this;
 }
 
 public UnifiedOrderReqDataBuilder setFee_type(String fee_type) {
 this.fee_type = fee_type;
 return this;
 }
 
 public UnifiedOrderReqDataBuilder setTime_start(String time_start) {
 this.time_start = time_start;
 return this;
 }
 
 public UnifiedOrderReqDataBuilder setTime_expire(String time_expire) {
 this.time_expire = time_expire;
 return this;
 }
 
 public UnifiedOrderReqDataBuilder setGoods_tag(String goods_tag) {
 this.goods_tag = goods_tag;
 return this;
 }
 
 public UnifiedOrderReqDataBuilder setProduct_id(String product_id) {
 this.product_id = product_id;
 return this;
 }
 
 public UnifiedOrderReqDataBuilder setLimit_pay(String limit_pay) {
 this.limit_pay = limit_pay;
 return this;
 }
 
 public UnifiedOrderReqDataBuilder setOpenid(String openid) {
 this.openid = openid;
 return this;
 }
 
 
 public UnifiedOrderReqData build() {
 
 if("JSAPI".equals(this.trade_type) && this.openid == null) {
 throw new IllegalArgumentException("當(dāng)傳入trade_type為JSAPI時(shí),openid為必填參數(shù)");
 }
 if("NATIVE".equals(this.trade_type) && this.product_id == null) {
 throw new IllegalArgumentException("當(dāng)傳入trade_type為NATIVE時(shí),product_id為必填參數(shù)");
 }
 return new UnifiedOrderReqData(this);
 }
 }
 
 
 
}

因?yàn)橛行﹨?shù)為必填,有些參數(shù)為選填。而且sign要等所有參數(shù)傳入之后才能計(jì)算的出,所以這里用了builder模式。關(guān)于builder模式。

我們選用httpclient進(jìn)行網(wǎng)絡(luò)傳輸。

?
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
package com.unstoppedable.common;
 
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.ConnectionPoolTimeoutException;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
 
import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.security.KeyStore;
 
/**
 * Created by hupeng on 2015/7/28.
 */
public class HttpService {
 private static Log logger = LogFactory.getLog(HttpService.class);
 
 private static CloseableHttpClient httpClient = buildHttpClient();
 
 //連接超時(shí)時(shí)間,默認(rèn)10秒
 private static int socketTimeout = 5000;
 
 //傳輸超時(shí)時(shí)間,默認(rèn)30秒
 private static int connectTimeout = 5000;
 
 private static int requestTimeout = 5000;
 
 public static CloseableHttpClient buildHttpClient() {
 
 try {
 KeyStore keyStore = KeyStore.getInstance("PKCS12");
 FileInputStream instream = new FileInputStream(new File(Configure.getCertLocalPath()));//加載本地的證書(shū)進(jìn)行https加密傳輸
 try {
 keyStore.load(instream, Configure.getCertPassword().toCharArray());//設(shè)置證書(shū)密碼
 } finally {
 instream.close();
 }
 
 
 // Trust own CA and all self-signed certs
 SSLContext sslcontext = SSLContexts.custom()
  .loadKeyMaterial(keyStore, Configure.getCertPassword().toCharArray())
  .build();
 // Allow TLSv1 protocol only
 SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
  sslcontext,
  new String[]{"TLSv1"},
  null,
  SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
 
 RequestConfig requestConfig = RequestConfig.custom()
  .setConnectTimeout(connectTimeout)
  .setConnectionRequestTimeout(requestTimeout)
  .setSocketTimeout(socketTimeout).build();
 
 httpClient = HttpClients.custom()
  .setDefaultRequestConfig(requestConfig)
  .setSSLSocketFactory(sslsf)
  .build();
 
 return httpClient;
 } catch (Exception e) {
 throw new RuntimeException("error create httpclient......", e);
 }
 }
 
 
 
 public static String doGet(String requestUrl) throws Exception {
 HttpGet httpget = new HttpGet(requestUrl);
 try {
 
 
 logger.debug("Executing request " + httpget.getRequestLine());
 // Create a custom response handler
 ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
 
 @Override
 public String handleResponse(
  final HttpResponse response) throws ClientProtocolException, IOException {
  int status = response.getStatusLine().getStatusCode();
  if (status >= 200 && status < 300) {
  HttpEntity entity = response.getEntity();
  return entity != null ? EntityUtils.toString(entity) : null;
  } else {
  throw new ClientProtocolException("Unexpected response status: " + status);
  }
 }
 
 };
 
 return httpClient.execute(httpget, responseHandler);
 } finally {
 httpget.releaseConnection();
 }
 }
 
 public static String doPost(String url, Object object2Xml) {
 
 String result = null;
 
 HttpPost httpPost = new HttpPost(url);
 
 //解決XStream對(duì)出現(xiàn)雙下劃線的bug
 XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
 
 //將要提交給API的數(shù)據(jù)對(duì)象轉(zhuǎn)換成XML格式數(shù)據(jù)Post給API
 String postDataXML = xStreamForRequestPostData.toXML(object2Xml);
 
 logger.info("API,POST過(guò)去的數(shù)據(jù)是:");
 logger.info(postDataXML);
 
 //得指明使用UTF-8編碼,否則到API服務(wù)器XML的中文不能被成功識(shí)別
 StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");
 httpPost.addHeader("Content-Type", "text/xml");
 httpPost.setEntity(postEntity);
 
 //設(shè)置請(qǐng)求器的配置
 
 logger.info("executing request" + httpPost.getRequestLine());
 
 try {
 HttpResponse response = httpClient.execute(httpPost);
 
 HttpEntity entity = response.getEntity();
 
 result = EntityUtils.toString(entity, "UTF-8");
 
 } catch (ConnectionPoolTimeoutException e) {
 logger.error("http get throw ConnectionPoolTimeoutException(wait time out)", e);
 
 } catch (ConnectTimeoutException e) {
 logger.error("http get throw ConnectTimeoutException", e);
 
 } catch (SocketTimeoutException e) {
 logger.error("http get throw SocketTimeoutException", e);
 
 } catch (Exception e) {
 logger.error("http get throw Exception", e);
 
 } finally {
 httpPost.abort();
 }
 
 return result;
 }
}

然后是我們的總?cè)肟冢?/p>

?
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
package com.unstoppedable.service;
 
import com.unstoppedable.common.Configure;
import com.unstoppedable.common.HttpService;
import com.unstoppedable.common.XMLParser;
import com.unstoppedable.protocol.UnifiedOrderReqData;
import org.xml.sax.SAXException;
 
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.Map;
 
/**
 * Created by hupeng on 2015/7/28.
 */
public class WxPayApi {
 
 public static Map<String,Object> UnifiedOrder(UnifiedOrderReqData reqData) throws IOException, SAXException, ParserConfigurationException {
 String res = HttpService.doPost(Configure.UNIFIED_ORDER_API, reqData);
 return XMLParser.getMapFromXML(res);
 }
 
 public static void main(String[] args) throws Exception {
 UnifiedOrderReqData reqData = new UnifiedOrderReqData.UnifiedOrderReqDataBuilder("appid", "mch_id", "body", "out_trade_no", 1, "spbill_create_ip", "notify_url", "JSAPI").setOpenid("openid").build();
 System.out.println(UnifiedOrder(reqData));
 
 
 }
}

返回的xml為:

?
1
2
3
4
5
6
7
8
9
10
11
<xml>
 <return_code><![CDATA[SUCCESS]]></return_code>
 <return_msg><![CDATA[OK]]></return_msg>
 <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
 <mch_id><![CDATA[10000100]]></mch_id>
 <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
 <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
 <result_code><![CDATA[SUCCESS]]></result_code>
 <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
 <trade_type><![CDATA[JSAPI]]></trade_type>
</xml>

return_code 和result_code都為SUCCESS的時(shí)候會(huì)返回我們需要的prepay_id。。。,然后在jsapi中使用他就可以了。。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩欧美国产精品 | 激情综合国产 | 视频在线一区二区三区 | 欧美大片免费高清观看 | 人人超碰免费 | 久久久久久久久久久福利观看 | 免费的av | 日韩中文字幕一区二区高清99 | 国产激情网 | 亚洲精品国产乱码在线看蜜月 | 成人a级片在线观看 | 亚洲免费色 | 亚洲第一成av人网站懂色 | 免费黄色成人 | 中文字幕一区二区三区精彩视频 | 午夜视频在线播放 | 黄色精品在线 | 国产午夜视频在线观看 | 欧美不卡视频 | 午夜视频在线播放 | 欧美日韩一区二区三区在线观看 | 成人精品国产一区二区4080 | 国产一级毛片一级 | 久久久精品国产99久久精品芒果 | 91视频在线网址 | 午夜私人影院在线观看 | 91视频精选 | 午夜影院 | 丁香五月亚洲综合在线 | 99久久免费精品 | 日韩一区二区三区福利视频 | 日韩福利 | 日本久久久久久 | 色猫猫国产区一区二在线视频 | 欧美电影免费网站 | 97精品国产97久久久久久免费 | 国产成人精品一区二区三区四区 | 懂色一区二区三区av片 | 国产视频一区在线 | 国产麻豆精品 | 国产韩国精品一区二区三区 |