| 功能 | 说明 |
|---|---|
| 🧠 AI 对话 | 非关键词消息自动走 AI 回复,可聊任何话题 |
| 🔑 激活码 | 发送关键词自动生成/返回激活码 |
| 📢 关键词回复 | 内置关键词触发特定回复(如产品介绍) |
| 👋 关注欢迎语 | 新关注用户自动回复欢迎信息 |
- Next.js 16 (App Router) — API Route 处理微信回调
- AI SDK (
ai+@ai-sdk/openai) — LLM 对话(兼容 OpenAI 接口) - Supabase — 激活码存储(可替换为其他数据库)
- TypeScript + pnpm
微信用户消息
↓
POST /api/wechat/message
↓
├─ 关注事件 → 欢迎语 → 被动回复
├─ "获取开通码" → 查/生成激活码 → 被动回复
├─ "卡雷达" → 产品介绍 → 被动回复
├─ 其他文本 → 返回 "success" → 异步: AI生成 → 客服消息推送
└─ 非文本消息 → 帮助提示 → 被动回复
💡 微信要求 5 秒内返回被动回复,AI 可能超时,所以采用 「先返回空 success,再通过客服消息 API 异步推送」 的模式。
pnpm install
pnpm dev # 开发服务器 → http://localhost:3211复制 .env.example 为 .env 并填写环境变量(见下方)。
| 变量 | 说明 | 必需 |
|---|---|---|
WECHAT_TOKEN |
消息校验 Token | ✅ |
WECHAT_APPID |
公众号 AppID | ✅ |
WECHAT_APPSECRET |
公众号 AppSecret | ✅ |
LLM_API_KEY |
LLM API Key | ✅ |
LLM_BASE_URL |
LLM Base URL(如 https://api.deepseek.com/v1) |
✅ |
NEXT_PUBLIC_SUPABASE_URL |
Supabase 项目 URL | ✅ |
SUPABASE_SERVICE_ROLE_KEY |
Supabase Service Role Key | ✅ |
npm i -g vercel
vercel
# 设置环境变量
vercel env add WECHAT_TOKEN
vercel env add WECHAT_APPID
vercel env add WECHAT_APPSECRET
vercel env add LLM_API_KEY
vercel env add LLM_BASE_URL
vercel env add NEXT_PUBLIC_SUPABASE_URL
vercel env add SUPABASE_SERVICE_ROLE_KEY微信回调地址:https://<your-domain>/api/wechat/message
⚠️ NEXT_PUBLIC_SUPABASE_URL在构建时编译进客户端代码,Docker 构建需通过.env传入该值作为 build arg。
# 确保 .env 中 NEXT_PUBLIC_SUPABASE_URL 已填写真实值
docker compose up -d --build # 构建并启动
docker compose logs -f # 查看日志
curl http://localhost:3211/health # 健康检查
⚠️ 微信消息推送 URL 仅支持 80/443 端口。容器内部运行在 3211,需通过 Nginx 反向代理对外暴露。
在 Nginx 配置中添加:
server {
listen 80;
server_name your-domain.com;
location /api/wechat/message {
proxy_pass http://127.0.0.1:3211;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}如需 HTTPS,在同一个 server 块中配置 SSL 证书并添加 listen 443 ssl。
- 登录 微信公众平台
- 设置与开发 → 基本配置 → 服务器配置
- URL:
https://<your-domain>/api/wechat/message - Token: 与
WECHAT_TOKEN环境变量一致 - EncodingAESKey: 随机生成
- 消息加解密方式: 明文模式
本项目作为示例,以下部分需要根据你的业务需求修改:
编辑 src/lib/wechat/ai-system-prompt.ts,修改 buildWechatAiPrompt() 返回的系统提示词,定义你的 AI 身份、语气、知识范围和回复风格。
当前使用 Supabase 存储激活码。你可以替换为其他存储方案:
- 将
src/lib/supabase/server.ts替换为你自己的数据库客户端(MySQL、PostgreSQL、Redis 等) - 对应修改
src/app/api/wechat/message/route.ts中激活码的查询/写入逻辑
在 src/app/api/wechat/message/route.ts 中调整:
- 关键词匹配:修改
isActivationCommand()(定义在src/lib/wechat/index.ts)和"卡雷达"等关键词判断 - 关键词回复内容:修改各关键词对应的回复文本
- 激活码逻辑:修改
handleGetActivationCode()中的生成规则和存储表结构 - 关注欢迎语:修改 subscribe 事件的回复内容
| 场景 | 行为 |
|---|---|
WECHAT_APPID/APPSECRET 已配置 |
异步模式:先返回 success,再通过客服消息 API 推送 AI 回复 |
WECHAT_APPID/APPSECRET 未配置 |
同步模式:被动回复 AI 结果(5 秒超时兜底) |
LLM_* 未配置 |
AI 回复跳过,推送兜底提示 |
| AI 超时/失败 | 推送 "抱歉,我思考了一下但没想出好回答 😅" |
| 客服消息推送失败 | 静默失败,日志记录 |