欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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;
    }

 

坑点:

  1. 微信支付的退款必须使用证书,这个证书的下载和安装过程参考:(https://jingyan.baidu.com/article/ed2a5d1f02ad0649f6be179d.html
  2. 直接访问退款地址的人几乎都会看到这句话:

    400 Bad Request

    No required SSL certificate was sent

    这里简单说了这个退款必须经过SSL进行连接。
  3. 证书最好不要外网可以访问~

  4. 部分代码来自httpclient官网API:(http://hc.apache.org/httpclient-3.x/sslguide.html

  5. 经常做接口的最好把httpclient吃一遍,你会发现真的很好用~

本文地址:https://blog.csdn.net/fengwangzhe000/article/details/107309944