首页 > 其他分享 >项目中访问支付宝专线踩坑

项目中访问支付宝专线踩坑

时间:2024-04-13 13:13:48浏览次数:20  
标签:alipay 支付宝 专线 访问 private AbstractAlipayClient api static com

问题描述

支付宝互联网地址为 https://openapi.alipay.com/gateway.do,专线相比于互联网地址速度更快,更加稳定。这里我们假设专线地址为 https://xxx.xxx.xxx.xxx:443/gateway.do

我们通过支付宝的 SDK 来访问支付宝专线地址,结果报了以下错误

level:ERROR messasge:AbsAlipayService.getResponse.AlipayApiException stackTrack:"com.alipay.api.AlipayApiException: java.io.IOException: HTTPS hostname wrong:  should be <xxx.xxx.xxx.xxx>
    at com.alipay.api.AbstractAlipayClient.doPost(AbstractAlipayClient.java:692)
    at com.alipay.api.AbstractAlipayClient._execute(AbstractAlipayClient.java:607)
    at com.alipay.api.AbstractAlipayClient.execute(AbstractAlipayClient.java:108)
    at com.alipay.api.AbstractAlipayClient.execute(AbstractAlipayClient.java:95)
    at com.alipay.api.AbstractAlipayClient.execute(AbstractAlipayClient.java:89)

问题原因

支付宝 SDK 底层使用 WebUtils 来发送网络请求,HostnameVerifier 实现类默认返回 false,我们需要跳过此验证。

verifier = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return false;
            }
        };

解决方法

方法1

private static void skipAlipayHttpsVerifier() {
        try {
            Field verifierField = WebUtils.class.getDeclaredField("verifier");
            verifierField.setAccessible(true);
            verifierField.set(null, new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            });
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

在项目启动时调用此方法,通过反射来重写 HostnameVerifier 的实现类。

方法2

public abstract class WebUtils {
    private static final String DEFAULT_CHARSET = "UTF-8";
    private static final String METHOD_POST = "POST";
    private static final String METHOD_GET = "GET";
    private static SSLContext ctx = null;
    private static HostnameVerifier verifier = null;
    private static SSLSocketFactory socketFactory = null;

    private WebUtils() {
    }

    static {
        try {
            ctx = SSLContext.getInstance("TLS");
            ctx.init(new KeyManager[0], new TrustManager[]{new DefaultTrustManager()}, new SecureRandom());
            ctx.getClientSessionContext().setSessionTimeout(15);
            ctx.getClientSessionContext().setSessionCacheSize(1000);
            socketFactory = ctx.getSocketFactory();
        } catch (Exception var1) {
        }

        verifier = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
               // 仅修改这一个地方
                return true;
            }
        };
    }
}

在项目中同一个 package 下创建一个 WebUtils,具体类路径为 com.alipay.api.internal.util.WebUtils,这样类加载器最终加载的就是我们自己定义的 WebUtils 类了。

标签:alipay,支付宝,专线,访问,private,AbstractAlipayClient,api,static,com
From: https://www.cnblogs.com/strongmore/p/18106938

相关文章

  • 禁止某ip访问
    使用firewall配置,通过添加富规则(richrules)来实现firewall-cmd--permanent--add-rich-rule='rulefamily=ipv4sourceaddress="8.147.170.200"drop'firewall-cmd--permanent--add-rich-rule='rulefamily=ipv4sourceaddress="38.147.170.23"......
  • Python中利用enumerate()精简循环中的索引和元素访问
    ​ Python中,enumerate()函数是一个内置函数,用于在遍历序列(如列表、元组或字符串)时同时获取每个元素的索引和值。可以使代码更简洁、更易读,特别是在需要索引时。使用enumerate()可以避免使用传统的范围(range())和长度(len())组合来访问元素和它们的索引。参考文档:Python中......
  • 不同虚拟机之间的docker容器互相访问
    虚拟机平台VMwareWrokStationPro16虚拟机环境Unbuntu22.04目标:在VM2中创建1个bridge虚拟网络,在VM2中,创建容器x,并能访问VM1中的容器,在两个虚拟机中创建birdge网络,虚拟机中的容器可以互相访问解决方案:使用overlay来实现不同虚拟机中的容器的互相访问在虚拟机1使用命令do......
  • 【Python】Django中的static资源访问404的问题
    [本文出自天外归云的博客园]如果你发现你本地部署没问题,部署到生产环境服务器后提示404找不到静态资源文件。不是你的代码有问题,而是你没有使用--insecure参数启动服务。pythonmanage.pyrunserver0.0.0.0:8000--insecure但是这个insecure参数在Django4中已经去掉了,所以......
  • 腾讯云轻量服务器流量用尽后的访问策略及2024年优惠购买政策参与步骤
    对于很多使用腾讯云轻量应用服务器的用户来说,每月300GB的流量包是一个相对充足的数值。但在某些情况下,尤其是业务突发增长时,这个流量包可能会被用超。那么,用超了流量后服务器还能继续使用吗?当然可以。即使300GB的月流量用完了,轻量服务器依然可以正常运行和访问。但需要注意的......
  • 将http转为https访问需要费用吗
    首先,需要了解http和https的概念的区别。http本身是一种超文本传输协议,目前是互联网在进行数据访问过程中最广泛运用的一种网络协议,http工作于客户端与服务器端之间。浏览器作为http客户端通过URL向http服务器端发送所有请求。Web服务器则根据接收到的请求,向客户端发送响应信......
  • jdbc结合druid连接池访问postgreSQL数据库
    jdbc结合druid连接池访问postgreSQL数据库连接mysql的话也是一个道理,就是把对应的依赖和数据库驱动换一下一.在pom.xml里面加上对应的依赖<!--druid数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring......
  • 比nestjs更优雅的ioc:跨模块访问资源
    使用ts的最佳境界:化类型于无形在项目中使用ts可以带来类型智能提示与校验的诸多好处。同时,为了减少类型标注,达到化类型于无形的效果,CabloyJS引入了ioc和依赖查找的机制。在上一篇文章中,我们创建了一个业务模块test-home,并且采用依赖查找的机制演示了如何优雅的定义和使用资源,包括......
  • jackson 使用jsonNode与objectNode 实现访问json对象, 操作json对象
    前情提要因为现有项目都用的阿里巴巴的fastjson做json串的序列化与反序列化,但是fastJson的漏洞太多了,经常处理扫描出来的漏洞时,需要升级版本,导致出现各种大大小小的bug,经过考究,决定使用jackSon做新项目的序列化与反序列化工作,那先看一下常用的场景:将对象转为js......
  • 将service类型由"ClusterIP"改为"NodePort"无法使有nodeip+端口访问服务解决方法
    1.背景.我打算在K8S集群部署一套Prometheus监控系统,以监控系统和各应用的各项指标,如资源、性能及自定义监控指标,具体部署方案和细节就不和大家详细说了,后面再和大家分享,这次先说我遇到问题。在Prometheus各组件都部署成功时候,我发现grafana的service的类型为"ClusterIP",这意味......