wechatpay-apiv3 / wechatpay-java

微信支付 APIv3 的官方 Java Library
Apache License 2.0
923 stars 206 forks source link

自定义hostname #147

Closed hifishzlj closed 1 year ago

hifishzlj commented 1 year ago

您的功能请求与问题有关吗? 请描述您遇到的问题

当前HostName类只有 API("api.mch.weixin.qq.com"), APIHK("apihk.mch.weixin.qq.com"); 这2个枚举,我们项目中想使用灾备,需要用api2.mch.weixin.qq.com

描述您想要的解决方案

希望能自定义HostName

您还有其他的方案吗?

No response

其他信息

No response

xy-peng commented 1 year ago

灾备是在主域名不可访问时使用的,可以自定义 DNS,把 api2 的解析列表放在 api 的解析列表之后。

public class OkHttpDns implements Dns {
    @Override
    public List<InetAddress> lookup(String hostname) throws UnknownHostException {
        if (hostname.equals("api.mch.weixin.qq.com")) {
            return Dns.SYSTEM.lookup(hostname).append(Dns.SYSTEM.lookup("api2.mch.weixin.qq.com"));
        }
        return Dns.SYSTEM.lookup(hostname);
    }
}

你可以在构造的时候使用自定义DNS:

OkHttpClient okHttpClient = new OkHttpClient.Builder()
    .dns(new OkHttpDns())
    .build();

HttpClient httpClient =
    new DefaultHttpClientBuilder()
        .config(config)
        .okHttpClient(okHttpClient)
        .build();

DNS 解析出多个 IP 地址,OkHttp 会按照顺序依次连接,直到连接成功为止。所以增加灾备域名的 IP 之后,请结合服务容量和用户体验评估连接超时时间,避免服务挂死或者无效等待。