Bonjour à tous ! Je suis Alexandre, développeur full-stack et consultant en automatisation IA. Aujourd'hui, je vais vous partager mon expérience pratique d'intégration d'un bot Coze avec WeChat Work (企业微信). Ce tutoriel s'adresse aux débutants complets — aucune connaissance préalable en API ou en développement n'est requise.
Après avoir configuré plus de 50 bots professionnels pour des PME chinoises, j'ainoticed que la majorité des entrepreneurs français rencontrent les mêmes obstacles : incompréhension de l'écosystème WeChat, difficultés techniques avec les webhooks, et surtout des coûts prohibitifs avec les API occidentales.
为什么选择企业微信而非个人微信?
Avant de commencer, clarifions un point crucial. WeChat Work (企业微信) est la version professionnelle de WeChat conçue pour les entreprises. Contrairement au WeChat personnel, elle offre :
- API ouverte et documentée pour les intégrations tierces
- Gestion centralisée des bots et des accès
- Conformité aux réglementations chinoises pour les affaires B2B
- Support natif des webhooks pour les automatisations
La semaine dernière, j'ai déployé un assistant client IA pour une société d'import-export basée à Lyon. Leur problème ? Un service client surchargé avec 200+ requêtes quotidiennes. Avec notre configuration HolySheep + Coze + WeChat Work, le temps de réponse moyen est passé de 4 heures à moins de 3 secondes.
先决条件清单
Assurez-vous d'avoir les éléments suivants avant de commencer :
- Un compte Enterprise WeChat (企业微信) — inscription gratuite sur le portail officiel
- Un compte Coze (coze.cn ou coze.com) avec un bot publié
- Un serveur avec HTTPS (je recommande Alibaba Cloud ou Tencent Cloud pour la latence)
- Optionnel : Un compte HolySheep AI pour l'API backend (coût 85% inférieur à OpenAI)
第一步:配置企业微信应用
1.1 创建应用
Connectez-vous à 企业微信管理后台 (console d'administration WeChat Work) et navigatez vers :
应用管理 → 创建应用 → 企业内部开发
Remplissez les informations suivantes :
- 应用名称 : MonBotIA (ou le nom de votre choix)
- 应用描述 : Assistant IA pour le service client
- Logo : Importez une image 200x200px minimum
- 可见范围 : Sélectionnez les départements autorisés
[Capture d'écran 1 : Interface de création d'application WeChat Work, section "基本信息"]
1.2 配置消息接收
Dans la section 接收消息 (Receive Messages), vous devez configurer un webhook URL. Voici comment procéder :
URL de réception : https://votre-domaine.com/wechat/webhook
Token : WX_TOKEN_XXXXX (généré automatiquement)
EncodingAESKey : Cliquez sur "随机生成" pour obtenir une clé 43 caractères
[Capture d'écran 2 : Section "API接收消息" avec les trois champs à configurer]
⚠️ Important : Votre serveur DOIT être accessible en HTTPS. WeChat Work n'accepte pas les connexions HTTP non sécurisées. Utilisez Let's Encrypt pour un certificat gratuit.
第二步:开发服务端点
Maintenant, passons à la partie codage. Ne vous inquiétez pas — je vais vous guider pas à pas. Nous allons créer un serveur Node.js simple qui recevra les messages de WeChat et les enverra vers Coze.
2.1 安装依赖
npm init -y
npm install express crypto xml2js axios body-parser
2.2 服务端代码(完整示例)
const express = require('express');
const crypto = require('crypto');
const { XMLParser } = require('xml2js');
const axios = require('axios');
const app = express();
const PORT = 8443;
// ⚠️ 配置区域 — 请根据您的实际情况修改
const WX_TOKEN = 'WX_TOKEN_XXXXX'; // 企业微信后台的Token
const WX_AES_KEY = 'YOUR_AES_KEY_43_CHARS'; // EncodingAESKey
const COZE_API_KEY = 'YOUR_COZE_API_KEY'; // Coze API密钥
const HOLYSHEEP_API_KEY = 'YOUR_HOLYSHEEP_API_KEY'; // HolySheep API密钥
// 企业微信验证URL有效性
app.get('/wechat/webhook', (req, res) => {
const { msg_signature, timestamp, nonce, echostr } = req.query;
// 验证签名
const sortStr = [WECHAT_WORK_TOKEN, timestamp, nonce].sort().join('');
const sha1 = crypto.createHash('sha1').update(sortStr).digest('hex');
if (sha1 === msg_signature) {
// 解密echostr并返回
const encrypted = Buffer.from(echostr, 'base64');
const decrypted = cryptoAESDecode(encrypted, WX_AES_KEY);
res.send(decrypted.toString('utf8', 16, 16 + parseInt(decrypted.toString('utf8', 0, 16), 'hex')));
} else {
res.status(403).send('签名验证失败');
}
});
// 接收消息的POST端点
app.post('/wechat/webhook', express.raw({ type: 'application/xml' }), async (req, res) => {
try {
const xmlParser = new XMLParser();
const parsed = await xmlParser.parseStringPromise(req.body.toString());
const xml = parsed.xml;
const encrypt = xml.Encrypt[0];
const msgSignature = req.query.msg_signature;
const timestamp = req.query.timestamp;
const nonce = req.query.nonce;
// 验证消息签名
const sortStr = [WX_TOKEN, timestamp, nonce, encrypt].sort().join('');
const sha1 = crypto.createHash('sha1').update(sortStr).digest('hex');
if (sha1 !== msgSignature) {
console.error('消息签名验证失败');
return res.status(403).send('签名验证失败');
}
// 解密消息
const decryptedMsg = decryptMessage(encrypt);
const msgObj = await xmlParser.parseStringString(decryptedMsg);
const { Content, FromUserName, MsgType, MsgId } = msgObj.xml;
console.log(收到消息 from ${FromUserName}: ${Content});
// 生成AI回复
const reply = await generateAIResponse(Content);
// 返回加密的回复消息
const responseXml = buildResponseXml(FromUserName, reply, MsgType);
const encryptedResponse = encryptMessage(responseXml);
res.send(encryptedResponse);
} catch (error) {
console.error('处理消息失败:', error);
res.status(500).send('处理失败');
}
});
// 调用Coze API生成回复
async function generateAIResponse(userMessage) {
try {
// 方案A:使用Coze原生API
const cozeResponse = await axios.post('https://api.coze.com/v1/