这篇的用途是给自己的企业微信应用提供一个固定的 API 转发入口。调用方请求自己的域名,由 Caddy 转发到 qyapi.weixin.qq.com。这不是登录企业微信的替代办法,也不会绕过应用权限或企业后台的访问限制。

说明图:企业微信 API 转发:固定上游,限制调用方
准备域名与服务器
准备能访问企业微信 API 的服务器,把自己的域名解析到它。本文以 wecom.example.com 为占位符,部署时必须替换成真实域名。服务器的实际出口 IP 也要和企业后台的相关限制一起核对;并不是只能使用境外服务器。
公网入口使用 HTTPS。Caddy 自动申请证书还需要域名解析与相应验证端口正常,不应为了省事让包含 access_token 的调用经过明文 HTTP。
Caddyfile
下面只允许一个固定的调用方公网 IP。198.51.100.10 是文档示例地址,必须替换,不能原样使用。
wecom.example.com {
@allowed remote_ip 198.51.100.10
handle @allowed {
reverse_proxy https://qyapi.weixin.qq.com {
header_up Host {upstream_hostport}
}
}
handle {
respond "Forbidden" 403
}
}
这个配置固定了上游,不是允许客户端任意指定目标的开放代理。允许列表按 Caddy 实际看到的来源 IP 匹配;如果入口前还有 CDN 或其他代理,不能直接照抄为真实客户端地址,需要另外规划可信代理链。
header_up Host {upstream_hostport} 不是所有版本都必需的固定写法。当前 Caddy 2.11 起对 HTTPS 上游有自动 Host 处理;这里显式写出是为了说明请求关系和兼容配置,不要把显式 Host 配置当成所有版本的要求。
用官方 Caddy 镜像运行
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
volumes:
caddy_data:
caddy_config:
先准备真实的 Caddyfile 文件,再检查配置:
docker compose run --rm caddy caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
docker compose up -d
docker compose logs --tail=100 caddy
htnanako/wxproxy 是另一种第三方代理容器,不是官方 Caddy 镜像。两者是不同的部署方案,不要混写成同一个服务。
接入应用时只替换 API 基地址
应用原本请求 https://qyapi.weixin.qq.com/cgi-bin/...,在它支持自定义企业微信 API 地址的前提下,改为自己的 https://wecom.example.com/cgi-bin/...。路径和业务参数仍按企业微信接口要求填写。
不要把企业微信 secret、access_token 或消息正文写进公开示例。开启请求日志前先考虑查询字符串中的 token,排错截图也要遮掉它。先用不含真实凭据的请求确认来源限制,再在自己的环境里完成有权限的接口测试。
Discord 的邀请链接不是 Webhook。两者接入方式不同,不能拿邀请地址当消息 API。
参考:Caddy 安装、reverse_proxy、企业微信开发者文档。本文完成文档与配置结构核对,未在你的服务器上实际部署或发送消息。