【wechatpay-apache-httpclient】官網(wǎng):
https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient
這個點一定要清晰(即:不需要自己去是生成簽名)
image.png
以JSAPI為例
【JSAPI支付】官網(wǎng)地址:
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_6.shtml
項目目錄:
image.png
工具類【W(wǎng)echatPayUtil】代碼 :
/**
* APP_ID(公眾號/小程序等)
*/
private static final String APP_ID = "xxxx";
/**
* 商戶號 (微信商戶平臺可以獲取)
*/
private static final String MERCHATN_ID = "xxx";
/**
* API_V3 (微信商戶平臺配置)
*/
private static final String API_V3 = "xxxx";
/**
* 私鑰 (微信商戶平臺配置)
*/
private static final String PRIVATE_KEY_PATH = "ice/channel_config/wechat/apiclient_key.pem";
/**
* 證書路徑 (自行設(shè)置)
*/
private static final String CERT_PATH = "ice/channel_config/wechat/apiclient_cert.pem";
/**
* 證書序列號(微信商戶平臺配置)
*/
private static final String CERT_ID = "xxxxxx";
/**
* 初始化 clientBuilder和證書管理器
*
* @return com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder
* @author xxxx
* @date 2022-11-25
*/
public static WechatPayHttpClientBuilder initClientBuilder() throws IOException, GeneralSecurityException, HttpCodeException, NotFoundException {
// 讀取證書及私鑰
Resource resourcePrivateKey = new FileSystemResource(new File(PRIVATE_KEY_PATH));
PrivateKey privateKey = PemUtil.loadPrivateKey(resourcePrivateKey.getInputStream());
Resource resourceCert = new FileSystemResource(new File(CERT_PATH));
X509Certificate cert = PemUtil.loadCertificate(resourceCert.getInputStream());
// 微信證書管理器
CertificatesManager certificatesManager = CertificatesManager.getInstance();
certificatesManager.putMerchant(
MERCHATN_ID,
new WechatPay2Credentials(
MERCHATN_ID,
new PrivateKeySigner(CERT_ID, privateKey)
),
API_V3.getBytes(StandardCharsets.UTF_8)
);
Verifier verifier = certificatesManager.getVerifier(MERCHATN_ID);
// 初始化
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(MERCHATN_ID, CERT_ID, privateKey)
.withWechatPay(Collections.singletonList(cert))
.withValidator(new WechatPay2Validator(verifier));
return builder;
}
以對賬文件下載為例進行測試
對賬文件下載,根據(jù)官網(wǎng)說明:
image.png
JSAPI對賬文件下載API文檔官網(wǎng):https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_8.shtml
請求頭【Accept: application/json】必須要設(shè)置润歉,不設(shè)置會報錯吵取;【Content-Type: application/json】測試發(fā)現(xiàn)可以不設(shè)置
image.png
下面這個地方看起來像是要進行簽名后再發(fā)起請求藕夫,但是實際上使用【wechatpay-apache-httpclient】的時候并不需要(工具類自己會簽名)昌屉,別被誤導了
image.png
【測試代碼】
public static void main(String[] args) throws Exception {
// 交易賬單申請 https://api.mch.weixin.qq.com/v3/bill/tradebill?bill_date=2022-11-23
CloseableHttpClient applyClient = WechatPayUtil.initClientBuilder().build();
// 初始化請求
HttpGet applyHttpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/bill/tradebill?bill_date=2022-11-23");
// 請求頭設(shè)置 官方說明:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay2_0.shtml
applyHttpGet.addHeader("Accept", "application/json");
applyHttpGet.addHeader("Content-type", "application/json; charset=utf-8");
// 發(fā)起請求
CloseableHttpResponse applyResponse = applyClient.execute(applyHttpGet);
// 結(jié)果轉(zhuǎn)換為Map
String applyResponseEntityStr = EntityUtils.toString(applyResponse.getEntity());
System.out.println(">>>>>>>>>【對賬文件申請】響應結(jié)果:" + applyResponseEntityStr);
Map applyResponseMap = new ObjectMapper().readValue(applyResponseEntityStr, Map.class);
applyClient.close();
applyResponse.close();
// 交易賬單下載
String downloadUrl = (String) applyResponseMap.get("download_url");
CloseableHttpClient downloadClient = WechatPayUtil.initClientBuilder().withValidator(response -> true).build();
HttpGet downloadHttpGet = new HttpGet(downloadUrl);
// 請求頭設(shè)置 官方說明:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay2_0.shtml
downloadHttpGet.addHeader("Accept", "application/json");
downloadHttpGet.addHeader("Content-type", "application/json; charset=utf-8");
// 發(fā)起請求
CloseableHttpResponse downloadResponse = downloadClient.execute(downloadHttpGet);
// 結(jié)果轉(zhuǎn)換為String
String downloadResponseEntityStr = EntityUtils.toString(downloadResponse.getEntity());
System.out.println(">>>>>>>>>【交易賬單下載-string】響應結(jié)果:");
System.out.println(downloadResponseEntityStr);
// 結(jié)果轉(zhuǎn)換為List<String>
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(EntityUtils.toByteArray(downloadResponse.getEntity()))));
List<String> resultList = bufferedReader.lines().collect(Collectors.toList());
System.out.println(MessageFormat.format(">>>>>>>>>【交易賬單下載-List<String>】響應結(jié)果:總計【{0}】條",resultList.size()));
resultList.forEach(System.out::println);
downloadClient.close();
downloadResponse.close();
}
【測試結(jié)果】
【對賬交易文件申請】返回結(jié)果:
【對賬文件申請】響應結(jié)果:{"download_url":"https://api.mch.weixin.qq.com/v3/billdownload/file?token=om9r_WnzFUSMg24K4PYrtC7_byEZrIlmsMOJ8y7u_JPJP0D1F2AC_U6rtLAIsjlm","hash_type":"SHA1","hash_value":"f9ecef7bc7429e89b83e5ec4742b2699c74b5a11"}
【對賬交易文件下載】返回結(jié)果:(返回數(shù)據(jù)中丸凭,敏感數(shù)據(jù)已被替換為對應中文)
>>>>>>>>>【交易賬單下載-string】響應結(jié)果:
交易時間,公眾賬號ID,商戶號,特約商戶號,設(shè)備號,微信訂單號,商戶訂單號,用戶標識,交易類型,交易狀態(tài),付款銀行,貨幣種類,應結(jié)訂單金額,代金券金額,微信退款單號,商戶退款單號,退款金額,充值券退款金額,退款類型,退款狀態(tài),商品名稱,商戶數(shù)據(jù)包,手續(xù)費,費率,訂單金額,申請退款金額,費率備注
`2022-11-23 15:21:15,`公眾賬號ID,`商戶號,`0,`,`4200001642202211233962981879,`1595316481882824704,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`null用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.01,`0.00,`
`2022-11-23 15:11:51,`公眾賬號ID,`商戶號,`0,`,`4200001661202211230109762244,`1595314109068582912,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`null用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.01,`0.00,`
`2022-11-23 19:24:25,`公眾賬號ID,`商戶號,`0,`,`4200001666202211235431097357,`1595377702036283392,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.03,`0.00,`0,`0,`0.00,`0.00,`,`,`h001用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.03,`0.00,`
總交易單數(shù),應結(jié)訂單總金額,退款總金額,充值券退款總金額,手續(xù)費總金額,訂單總金額,申請退款總金額
`3,`0.05,`0.00,`0.00,`0.00000,`0.05,`0.00
>>>>>>>>>【交易賬單下載-List<String>】響應結(jié)果:總計【6】條
交易時間,公眾賬號ID,商戶號,特約商戶號,設(shè)備號,微信訂單號,商戶訂單號,用戶標識,交易類型,交易狀態(tài),付款銀行,貨幣種類,應結(jié)訂單金額,代金券金額,微信退款單號,商戶退款單號,退款金額,充值券退款金額,退款類型,退款狀態(tài),商品名稱,商戶數(shù)據(jù)包,手續(xù)費,費率,訂單金額,申請退款金額,費率備注
`2022-11-23 15:21:15,`公眾賬號ID,`商戶號,`0,`,`4200001642202211233962981879,`1595316481882824704,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`null用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.01,`0.00,`
`2022-11-23 15:11:51,`公眾賬號ID,`商戶號,`0,`,`4200001661202211230109762244,`1595314109068582912,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.01,`0.00,`0,`0,`0.00,`0.00,`,`,`null用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.01,`0.00,`
`2022-11-23 19:24:25,`公眾賬號ID,`商戶號,`0,`,`4200001666202211235431097357,`1595377702036283392,`用戶標識,`JSAPI,`SUCCESS,`OTHERS,`CNY,`0.03,`0.00,`0,`0,`0.00,`0.00,`,`,`h001用戶的水費訂單收費記錄,`,`0.00000,`0.54%,`0.03,`0.00,`
總交易單數(shù),應結(jié)訂單總金額,退款總金額,充值券退款總金額,手續(xù)費總金額,訂單總金額,申請退款總金額
`3,`0.05,`0.00,`0.00,`0.00000,`0.05,`0.00