Skip to content

Repository files navigation

🤖 wechat-bot

微信公众号对接 AI 大模型的示例项目 — 智能会话 + 激活码服务

License: MIT Next.js TypeScript Supabase


✨ 功能

功能 说明
🧠 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

📦 部署

Vercel

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

Docker

⚠️ 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 反向代理

在 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

🔗 微信公众平台配置

  1. 登录 微信公众平台
  2. 设置与开发 → 基本配置 → 服务器配置
  3. URL: https://<your-domain>/api/wechat/message
  4. Token: 与 WECHAT_TOKEN 环境变量一致
  5. EncodingAESKey: 随机生成
  6. 消息加解密方式: 明文模式

🔧 定制指南

本项目作为示例,以下部分需要根据你的业务需求修改:

AI 人设与系统提示词

编辑 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 超时/失败 推送 "抱歉,我思考了一下但没想出好回答 😅"
客服消息推送失败 静默失败,日志记录

📄 License

MIT

About

微信公众号对接 AI 大模型的示例项目 — 智能会话 + 激活码服务 | WeChat Official Account Bot with AI chat & activation code service

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages