CONMISANMA的正确答案——关于微信支付的退款问题【java】
程序员文章站
2022-03-14 18:08:38
测试系统:WIN10x64IDE工具:netbeansJDK版本:1.8直接上解决方案: /** * 获取微信支付的退款结果 * * @param socketAgreement 安全套接字协议(当前微信支持的安全套接字协议为“PKCS12”【20200713091509】) * @param certificatePath 证书的系统绝对路径(按微信建议,最好不能随便被外网访问的路径) * @param certifica.....
测试系统:WIN10 x64
IDE工具:netbeans
JDK版本:1.8
直接上解决方案:
/**
* 获取微信支付的退款结果
*
* @param socketAgreement 安全套接字协议(当前微信支持的安全套接字协议为“PKCS12”【20200713091509】)
* @param certificatePath 证书的系统绝对路径(按微信建议,最好不能随便被外网访问的路径)
* @param certificatePassword 证书密码(默认为商户号)
* @param url 退款路径
* @param data 发送的XML数据
* @return
* @throws Exception
*/
public static String getWXPayRefundResult(
String socketAgreement,
String certificatePath,
String certificatePassword,
String url,
String data
) throws Exception {
String result = null;
SSLConnectionSocketFactory sslcsf;
try (FileInputStream fis = new FileInputStream(certificatePath)) {
KeyStore keyStore;
SSLContext sslc;
SSLContextBuilder sslcb;
socketAgreement = StringUtils.isBlank(socketAgreement) ? "PKCS12" : socketAgreement; // 默认为“PKCS12”
keyStore = KeyStore.getInstance(socketAgreement); // 创建密钥和证书储存器
keyStore.load(fis, certificatePassword.toCharArray()); // 加载证书以及该证书的密码
sslcb = SSLContexts.custom(); // 创建一个SSL上下文构造器
sslc = sslcb.loadKeyMaterial(keyStore, certificatePassword.toCharArray()).build(); // 构造器加载储存器并构建
sslcsf = new SSLConnectionSocketFactory(
sslc,
new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"},
null,
new DefaultHostnameVerifier()
); // 创建SSL连接工厂
}
try (CloseableHttpClient chc = HttpClients.custom().setSSLSocketFactory(sslcsf).build()) {
HttpPost post = new HttpPost(url); // 创建连接
post.setEntity(new StringEntity(new String(data.getBytes()))); // 写入数据
CloseableHttpResponse chr = chc.execute(post); // 提交数据
// 读取返回结果
try (InputStreamReader isr = new InputStreamReader(chr.getEntity().getContent(), "UTF-8");
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
result += line;
}
}
}
return result;
}
坑点:
- 微信支付的退款必须使用证书,这个证书的下载和安装过程参考:(https://jingyan.baidu.com/article/ed2a5d1f02ad0649f6be179d.html)
- 直接访问退款地址的人几乎都会看到这句话:
400 Bad Request
No required SSL certificate was sent
这里简单说了这个退款必须经过SSL进行连接。 -
证书最好不要外网可以访问~
-
部分代码来自httpclient官网API:(http://hc.apache.org/httpclient-3.x/sslguide.html)
-
经常做接口的最好把httpclient吃一遍,你会发现真的很好用~
本文地址:https://blog.csdn.net/fengwangzhe000/article/details/107309944
上一篇: MySQL 5.7.22 二进制包安装及免安装版Windows配置方法
下一篇: 初入认识组策略