Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

AltStyle によって変換されたページ (->オリジナル) /