ERROR: api.mch.weixin.qq.com:443 failed to respond [微信退款]

1、问题

ERROR: api.mch.weixin.qq.com:443 failed to respond

此报错是因为调用微信退款请求需要双向证书

获取API证书

此路径下载即可
微信商户平台(pay.weixin.qq.com)–>账户中心–>账户设置–>API安全
在这里插入图片描述
一共三个文件,java开发者只需要 apiclient_cert.p12文件即可
在这里插入图片描述
导入安装证书,证书密码默认为商户号

2、代码实现


    public BaseResponse<RefundLog> wxpayRefund(PaymentLog paymentLog, BigDecimal refundAmount) throws Exception {

        Map<String, Object> parameterMap = new HashMap<>();
        parameterMap.put(APPID, 公众账号ID);
        parameterMap.put(MCHID, 商户号);
        parameterMap.put(NONCE_STR, 随机字符串);
        parameterMap.put(OUT_TRADE_NO, 商户订单号);
        parameterMap.put(OUT_REFUND_NO, 商户退款单号);
        parameterMap.put(TOTAL_FEE, 订单金额);
        parameterMap.put(REFUND_FEE, 退款金额);
        parameterMap.put(SIGN_PARAMETER_NAME, 签名);

		//微信退款信息要以xml格式传递
        String postDataXML = XMLUtils.getRequestXml(parameterMap);
        log.info("支付参数准备XML:{}", postDataXML);
		//请求退款连接
        String result = wxRefundLink(postDataXML, mch_id);
		//返回这转为map
        Map responseMap = XMLUtils.fromXML(result);
		//退款状态业务处理
        if (FAIL.equals(responseMap.get(RETURN_CODE))) {
            return BaseResponse.successResponse("微信退款失败,"+responseMap.get(RETURN_MSG));
        } else{
            if (SUCCESS.equals(responseMap.get(RESULT_CODE))) {
                return BaseResponse.successResponse("微信退款完成");
            } else {
                //出现业务错误
                String errorCodeDes = String.valueOf(responseMap.get(ERR_CODE_DES));
                log.error("err_code_des:" + errorCodeDes);
                return BaseResponse.successResponse("退款失败"+errorCodeDes);
            }
        }

    }


	
    private String  wxRefundLink(String postDataXML,String mch_id) throws Exception{
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse httpResponse = null;
        try{
            //获取微信退款证书
            KeyStore keyStore = getCertificate(mch_id);
            SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, mch_id.toCharArray()).build();
            SSLConnectionSocketFactory sslf = new SSLConnectionSocketFactory(sslContext);
            httpClient = HttpClients.custom().setSSLSocketFactory(sslf).build();
            HttpPost httpPost = new HttpPost(WX_REFUND_URL);//退款接口

            StringEntity reqEntity = new StringEntity(postDataXML);
            // 设置类型
            reqEntity.setContentType("application/x-www-form-urlencoded");
            httpPost.setEntity(reqEntity);
            String result = null;
            httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            if (Validator.isNotNullOrEmpty(httpEntity)) {
                result = EntityUtils.toString(httpEntity, UTF8);
                EntityUtils.consume(httpEntity);
            }
            return result;
        }finally {//关流
            httpClient.close();
            httpResponse.close();
        }

    }
	
	    /**
     *
     * @description: 获取微信退款证书
     * @param mch_id
     * @auther: sean.xu
     * @date: 2019/8/13 15:11
     */
    private KeyStore getCertificate(String mch_id){
        //try-with-resources 关流
        try (FileInputStream inputStream = new FileInputStream(new File("D:\\wx\\1248201701_20190812_cert\\apiclient_cert.p12"))) {
            KeyStore keyStore = KeyStore.getInstance(PKCS12);
            keyStore.load(inputStream, mch_id.toCharArray());
            return keyStore;
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

3、效果截图

在这里插入图片描述

四、友情链接

退款文档
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_4&index=6

签名 证书
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3

引用\[1\]: 微信支付API提供了多个接口,其中包括统一下单、查询订单、关闭订单、申请退款、查询退款、下载对账单、下载资金账单、交付结果通知、交易保障、退款结果通知和拉取订单评价数据等接口。这些接口有些需要使用证书,有些则不需要使用证书。\[1\] 引用\[2\]: 有时候在使用微信支付接口时,可能会遇到无法请求接口的问题。其中一个可能的原因是DNS解析错误,可以通过在服务器的hosts文件中添加微信支付接口的IP地址来解决这个问题。\[2\] 引用\[3\]: 另外,有时候在生成微信支付二维码时也可能遇到问题。最近微信支付进行了升级,导致原来的请求位置支付的二维码地址不能用了,所以只能在服务器本地生成支付二维码。在调试过程中,可能会遇到打印出的$responseXml为空的情况,这可能是请求接口时出现了问题。\[3\] 综上所述,如果你遇到了无法请求"https://api.mch.weixin.qq.com/pay/unifiedorder"接口的问题,可能是由于DNS解析错误或者接口升级导致的。你可以尝试在服务器的hosts文件中添加微信支付接口的IP地址来解决DNS解析错误的问题。另外,你还可以检查请求接口时的代码是否正确,确保请求参数正确传递。如果问题仍然存在,建议查看微信支付的官方文档或联系微信支付的技术支持获取进一步的帮助。 #### 引用[.reference_title] - *1* [微信支付--公众号支付及退款,采坑之旅](https://blog.csdn.net/qq_36994538/article/details/100079697)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [PHP微信支付 curl请求https://api.mch.weixin.qq.com/pay/unifiedorder 返回空的解决方案](https://blog.csdn.net/amtz_2000/article/details/84139019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值