silenceper / wechat

WeChat SDK for Go (微信SDK:简单、易用)
https://silenceper.com/wechat/
Apache License 2.0
4.69k stars 1.08k forks source link

支持在请求前修改各api的地址 #736

Closed zxfishhack closed 8 months ago

zxfishhack commented 9 months ago

订阅号要求强制设置ip白名单,在使用公网服务器配置反向代理至微信相关服务器时,需修改各API的请求域名。

houseme commented 9 months ago

please fix ci and improve comment

ourines commented 8 months ago

这个应该怎么使用?

houseme commented 8 months ago

这个应该怎么使用?

比如支付的时候,调用A(api.mch.weixin.qq.com)域名失败的时候,可以替换为备用B(api2.mch.weixin.qq.com)域名.


【主域名】
https://api.mch.weixin.qq.com 
使用该域名将访问就近的接入点
【备域名】
https://api2.mch.weixin.qq.com

支持 跨城冗灾升级指引

@zxfishhack 贴一个示例代码

zxfishhack commented 8 months ago

最简单的使用情形如下:

import "github.com/silenceper/wechat/v2/util"

func main() {
   ...
   util.SetURIModifier(func(uri string) string {
        return strings.ReplaceAll(uri, "https://api.weixin.qq.com", "https://wx.examples.com") // wx.examples.com上通过nginx配置了向https://api.weixin.qq.com的反向代理,此种情况方便调试
    })
   ... 
}
zxfishhack commented 8 months ago

针对跨城冗灾的情况,个人觉得可以起一个专门的模块去检测到各域名的链路情况,然后将主域名替换掉。 如:

type HealthCheck struct {
    preferDomain string
}

func (hc *HealthCheck) healthCheckRoutine() {
    // TODO:执行域名获取及健康检查
}

func (hc *HealthCheck) URIModifier(uri string) string {
    return strings.ReplaceAll(uri, "https://api.mch.weixin.qq.com", hc.preferDomain)
}

func NewHealthCheck() (hc *HealthCheck, err error) {
    hc = &HealthCheck{preferDomain: "https://api.mch.weixin.qq.com"}
    go hc.healthCheckRoutine()

    return
}
ourines commented 8 months ago

最简单的使用情形如下:

import "github.com/silenceper/wechat/v2/util"

func main() {
   ...
   util.SetURIModifier(func(uri string) string {
        return strings.ReplaceAll(uri, "https://api.weixin.qq.com", "https://wx.examples.com") // wx.examples.com上通过nginx配置了向https://api.weixin.qq.com的反向代理,此种情况方便调试
    })
   ... 
}

nginx 这样配置

# 配置企业微信api
location /proxy/ {
proxy_pass https://qyapi.weixin.qq.com/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}