Skip to content

WeChat Gateway

Anson edited this page Jun 14, 2026 · 1 revision

微信网关配置

为什么需要它

微信公众号 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 校验。

方式一:在网页配置(推荐)

设置 → 发布服务器 / 网关:

  1. 打开「经网关中转」开关(关闭 = 直连)。
  2. 网关地址,如 https://<网关固定IP>:8443
  3. 令牌(Bearer)。已配置时显示 ••••,留空 = 保持原值
  4. 粘贴或上传 证书 PEM(自签证书)。已配置时显示指纹,留空 = 保持原值
  5. 测试连接 看可达性 / TLS / 是否能取 token。
  6. 保存

安全特性(脱敏)

  • 令牌与证书只写不回显: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,只读)。.envcerts/ 都已被 .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」应消失。

Clone this wiki locally