-
Notifications
You must be signed in to change notification settings - Fork 184
/
JsapiServiceExtension.java
139 lines (130 loc) · 6.05 KB
/
JsapiServiceExtension.java
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
package com.wechat.pay.java.service.payments.jsapi;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.cipher.Signer;
import com.wechat.pay.java.core.exception.HttpException;
import com.wechat.pay.java.core.exception.MalformedMessageException;
import com.wechat.pay.java.core.exception.ServiceException;
import com.wechat.pay.java.core.exception.ValidationException;
import com.wechat.pay.java.core.http.HostName;
import com.wechat.pay.java.core.http.HttpClient;
import com.wechat.pay.java.core.util.NonceUtil;
import com.wechat.pay.java.service.payments.jsapi.model.CloseOrderRequest;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByIdRequest;
import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByOutTradeNoRequest;
import com.wechat.pay.java.service.payments.model.Transaction;
import java.time.Instant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JsapiServiceExtension {
private final Signer signer;
private final String signType;
private final JsapiService jsapiService;
private static final Logger logger = LoggerFactory.getLogger(JsapiServiceExtension.class);
private JsapiServiceExtension(
Config config, HttpClient httpClient, HostName hostName, String signType) {
this.signer = config.createSigner();
JsapiService.Builder builder = new JsapiService.Builder().config(config);
this.signType = signType;
if (httpClient != null) {
builder.httpClient(httpClient);
}
if (hostName != null) {
builder.hostName(hostName);
}
this.jsapiService = builder.build();
}
/**
* JSAPI支付下单,并返回JSAPI调起支付数据
*
* @param request 请求参数
* @return PrepayWithRequestPaymentResponse
* @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。
* @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。
* @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。
* @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。
*/
public PrepayWithRequestPaymentResponse prepayWithRequestPayment(PrepayRequest request) {
String prepayId = jsapiService.prepay(request).getPrepayId();
long timestamp = Instant.now().getEpochSecond();
String nonceStr = NonceUtil.createNonce(32);
String packageVal = "prepay_id=" + prepayId;
String message =
request.getAppid() + "\n" + timestamp + "\n" + nonceStr + "\n" + packageVal + "\n";
logger.debug("Message for RequestPayment signatures is[{}]", message);
String sign = signer.sign(message).getSign();
PrepayWithRequestPaymentResponse response = new PrepayWithRequestPaymentResponse();
response.setAppId(request.getAppid());
response.setTimeStamp(String.valueOf(timestamp));
response.setNonceStr(nonceStr);
response.setPackageVal(packageVal);
response.setSignType(signType);
response.setPaySign(sign);
return response;
}
/**
* 微信支付订单号查询订单
*
* @param request 请求参数
* @return Transaction
* @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。
* @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。
* @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。
* @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。
*/
public Transaction queryOrderById(QueryOrderByIdRequest request) {
return jsapiService.queryOrderById(request);
}
/**
* 商户订单号查询订单
*
* @param request 请求参数
* @return Transaction
* @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。
* @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。
* @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。
* @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。
*/
public Transaction queryOrderByOutTradeNo(QueryOrderByOutTradeNoRequest request) {
return jsapiService.queryOrderByOutTradeNo(request);
}
/**
* 关闭订单
*
* @param request 请求参数
* @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。
* @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。
* @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。
* @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。
*/
public void closeOrder(CloseOrderRequest request) {
jsapiService.closeOrder(request);
}
public static class Builder {
private Config config;
private HttpClient httpClient;
private HostName hostName;
private String signType;
public Builder config(Config config) {
this.config = config;
return this;
}
public Builder httpClient(HttpClient httpClient) {
this.httpClient = httpClient;
return this;
}
public Builder hostName(HostName hostName) {
this.hostName = hostName;
return this;
}
public Builder signType(String signType) {
this.signType = signType;
return this;
}
public JsapiServiceExtension build() {
return new JsapiServiceExtension(
config, httpClient, hostName, signType == null ? "RSA" : signType);
}
}
}