-
Notifications
You must be signed in to change notification settings - Fork 11
WeChat Gateway
微信公众号 API(尤其 get_access_token)要求调用方出口 IP 在公众号后台的白名单内。MBEditor 自部署在你自己的服务器/NAS 上,出口 IP 往往是动态的、或不便加进白名单,于是推草稿时报 「非白名单 IP」(40164 / invalid ip)。
解决办法:让微信 API 经一台固定公网 IP 的中转网关转发——微信看到的来源 IP 就是网关的 IP,把这个固定 IP 加进白名单即可。
MBEditor 的传输层可插拔,默认直连,需要时切到网关中转:
| 模式 | 何时用 | 出口 IP |
|---|---|---|
| 直连(默认) | 你的服务器本身有稳定公网 IP,直接加白名单即可 | 你服务器的 IP |
| 经网关中转 | 出口 IP 不固定 / 不便加白名单 | 网关的固定 IP |
本功能只负责让 MBEditor 指向一个网关,网关本身要你自备:一台有固定公网 IP 的机器,跑一个 HTTPS 反向代理,把请求原样转发到 api.weixin.qq.com,并用一个 Bearer 令牌做鉴权、用自签证书做 TLS。任何能做到这点的反代(Caddy / Nginx / 自写小程序)都可以。
网关只转发、绝不记录任何密钥。MBEditor 发往网关的请求带
Authorization: Bearer <令牌>,并用你提供的自签证书做 TLS pin 校验。
设置 → 发布服务器 / 网关:
- 打开「经网关中转」开关(关闭 = 直连)。
- 填 网关地址,如
https://<网关固定IP>:8443。 - 填 令牌(Bearer)。已配置时显示
••••,留空 = 保持原值。 - 粘贴或上传 证书 PEM(自签证书)。已配置时显示指纹,留空 = 保持原值。
- 点 测试连接 看可达性 / TLS / 是否能取 token。
- 保存。
- 令牌与证书只写不回显:
GET /settings/gateway永远只返回是否已配置 + 证书指纹,绝不返回令牌原文或证书全文。 - 密钥只存在后端的 Docker 具名卷里(仓库目录树之外),不进浏览器存储、不进公开仓库。
- 公开仓库里没有任何真实地址/令牌/证书。
在 .env 里设置(docker compose up -d 重启生效):
WECHAT_API_BASE=https://<网关固定IP>:8443 WECHAT_PROXY_TOKEN=<你的网关令牌> WECHAT_PROXY_CA=/etc/mbeditor-certs/wechat-proxy.crt
把自签证书放到宿主机 ./certs/wechat-proxy.crt(compose 已挂载到容器内 /etc/mbeditor-certs,只读)。.env 与 certs/ 都已被 .gitignore 覆盖。
后端在每次调用时解析当前传输,优先级:
网页配置(已启用) > 环境变量 WECHAT_API_BASE > 直连
所以你可以先用 env 跑起来,以后再迁到网页配置;两者都没配就是直连。
设置页底部「当前来源」会显示 网页配置 / 环境变量 / 直连。也可直接查接口(不会泄露密钥):
curl -s http://localhost:7072/api/v1/settings/gateway # {"transport":"https-gateway","enabled":true,"base":"https://...","tokenConfigured":true, # "caConfigured":true,"caFingerprint":"SHA256:...","source":"env"}
配好后重新推一篇到草稿箱,「非白名单 IP」应消失。