Skip to content

Commit 078d25b

Browse files
authored
请求中自动添加 Wechatpay-Serial 头 (#312)
* feat: 请求中自动添加 Wechatpay-Serial 头 * fix: 修复平台证书模式获取序列号的方式
1 parent 8492a63 commit 078d25b

18 files changed

+233
-34
lines changed

core/src/main/java/com/wechat/pay/java/core/auth/Validator.java

+2
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ public interface Validator {
1414
* @return 返回是否合法
1515
*/
1616
<T> boolean validate(HttpHeaders responseHeaders, String body);
17+
18+
<T> String getSerialNumber();
1719
}

core/src/main/java/com/wechat/pay/java/core/auth/WechatPay2Validator.java

+5
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,9 @@ public <T> boolean validate(HttpHeaders responseHeaders, String responseBody) {
6060
logger.debug("Signature for verifying signatures is[{}]", signature);
6161
return verifier.verify(serialNumber, message, signature);
6262
}
63+
64+
@Override
65+
public <T> String getSerialNumber() {
66+
return this.verifier.getSerialNumber();
67+
}
6368
}

core/src/main/java/com/wechat/pay/java/core/certificate/RSAAutoCertificateProvider.java

+5
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ public Builder httpClientBuilder(AbstractHttpClientBuilder<?> builder) {
113113
public boolean validate(HttpHeaders responseHeaders, String body) {
114114
return true;
115115
}
116+
117+
@Override
118+
public <T> String getSerialNumber() {
119+
return "";
120+
}
116121
};
117122

118123
public RSAAutoCertificateProvider build() {

core/src/main/java/com/wechat/pay/java/core/cipher/AbstractVerifier.java

+11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static java.util.Objects.requireNonNull;
44

55
import com.wechat.pay.java.core.certificate.CertificateProvider;
6+
import com.wechat.pay.java.core.util.PemUtil;
67
import java.nio.charset.StandardCharsets;
78
import java.security.InvalidKeyException;
89
import java.security.NoSuchAlgorithmException;
@@ -126,4 +127,14 @@ public boolean verify(String serialNumber, String message, String signature) {
126127
}
127128
return verify(certificate, message, signature);
128129
}
130+
131+
@Override
132+
public String getSerialNumber() {
133+
if (publicKey != null) {
134+
return publicKeyId;
135+
}
136+
137+
requireNonNull(certificateProvider);
138+
return PemUtil.getSerialNumber(certificateProvider.getAvailableCertificate());
139+
}
129140
}

core/src/main/java/com/wechat/pay/java/core/cipher/Verifier.java

+2
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ public interface Verifier {
1212
* @return 是否验证通过
1313
*/
1414
boolean verify(String serialNumber, String message, String signature);
15+
16+
String getSerialNumber();
1517
}

core/src/main/java/com/wechat/pay/java/core/http/AbstractHttpClient.java

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static com.wechat.pay.java.core.http.Constant.USER_AGENT;
88
import static com.wechat.pay.java.core.http.Constant.USER_AGENT_FORMAT;
99
import static com.wechat.pay.java.core.http.Constant.VERSION;
10+
import static com.wechat.pay.java.core.http.Constant.WECHAT_PAY_SERIAL;
1011
import static java.net.HttpURLConnection.HTTP_MULT_CHOICE;
1112
import static java.net.HttpURLConnection.HTTP_OK;
1213
import static java.util.Objects.requireNonNull;
@@ -39,6 +40,7 @@ public <T> HttpResponse<T> execute(HttpRequest httpRequest, Class<T> responseCla
3940
.headers(httpRequest.getHeaders())
4041
.addHeader(AUTHORIZATION, getAuthorization(httpRequest))
4142
.addHeader(USER_AGENT, getUserAgent())
43+
.addHeader(WECHAT_PAY_SERIAL, getWechatPaySerial())
4244
.body(httpRequest.getBody())
4345
.build();
4446
OriginalResponse originalResponse = innerExecute(innerRequest);
@@ -57,6 +59,7 @@ public InputStream download(String url) {
5759
.addHeader(AUTHORIZATION, getAuthorization(originRequest))
5860
.addHeader(ACCEPT, "*/*")
5961
.addHeader(USER_AGENT, getUserAgent())
62+
.addHeader(WECHAT_PAY_SERIAL, getWechatPaySerial())
6063
.build();
6164
return innerDownload(httpRequest);
6265
}
@@ -130,6 +133,10 @@ private String getUserAgent() {
130133
getHttpClientInfo());
131134
}
132135

136+
private String getWechatPaySerial() {
137+
return this.validator.getSerialNumber();
138+
}
139+
133140
/**
134141
* 获取http客户端信息,用于User-Agent。 格式:客户端名称/版本 示例:okhttp3/4.9.3
135142
*

core/src/test/java/com/wechat/pay/java/core/RSAAutoCertificateConfigTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ static void initHttpClient() {
4242
public <T> boolean validate(HttpHeaders responseHeaders, String body) {
4343
return true;
4444
}
45+
46+
@Override
47+
public <T> String getSerialNumber() {
48+
return "";
49+
}
4550
};
4651
okHttpClient =
4752
new OkHttpClient.Builder()

core/src/test/java/com/wechat/pay/java/core/auth/WechatPay2ValidatorTest.java

+11-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,17 @@ public static void init() {
3232
String buildMessage = timestamp + "\n" + NONCE + "\n" + BODY + "\n";
3333

3434
Verifier fakeVerifier =
35-
(serialNumber, message, signature) -> {
36-
Assert.assertEquals(buildMessage, message);
37-
return true;
35+
new Verifier() {
36+
@Override
37+
public boolean verify(String serialNumber, String message, String signature) {
38+
Assert.assertEquals(buildMessage, message);
39+
return true;
40+
}
41+
42+
@Override
43+
public String getSerialNumber() {
44+
return "";
45+
}
3846
};
3947

4048
validator = new WechatPay2Validator(fakeVerifier);

core/src/test/java/com/wechat/pay/java/core/certificate/AutoCertificateServiceTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,11 @@ static class FakeValidator implements Validator {
229229
public <T> boolean validate(HttpHeaders responseHeaders, String body) {
230230
return true;
231231
}
232+
233+
@Override
234+
public <T> String getSerialNumber() {
235+
return "";
236+
}
232237
}
233238

234239
@Test

core/src/test/java/com/wechat/pay/java/core/certificate/RSAAutoCertificateProviderTest.java

+10
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,23 @@ static class EmtpyValidator implements Validator {
3939
public boolean validate(HttpHeaders responseHeaders, String body) {
4040
return true;
4141
}
42+
43+
@Override
44+
public <T> String getSerialNumber() {
45+
return "";
46+
}
4247
}
4348

4449
static class FalseValidator implements Validator {
4550
@Override
4651
public boolean validate(HttpHeaders responseHeaders, String body) {
4752
return false;
4853
}
54+
55+
@Override
56+
public <T> String getSerialNumber() {
57+
return "";
58+
}
4959
}
5060

5161
@BeforeAll

core/src/test/java/com/wechat/pay/java/core/http/DefaultHttpClientBuilderTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ public String getAuthorization(URI uri, String httpMethod, String signBody) {
4141
public <T> boolean validate(HttpHeaders responseHeaders, String body) {
4242
return true;
4343
}
44+
45+
@Override
46+
public <T> String getSerialNumber() {
47+
return "";
48+
}
4449
};
4550

4651
OkHttpClient okHttpClient = new OkHttpClient();

0 commit comments

Comments
 (0)