微信小程序API客服消息完全指南
点击勘误issues (opens new window),哪吒感谢大家的阅读

# 微信小程序API客服消息完全指南
# 目录
- 微信小程序API客服消息完全指南
# 1. 客服消息概述
# 1.1 什么是客服消息
客服消息是微信小程序提供的一种重要消息能力,允许小程序与用户进行双向即时通信。通过客服消息,开发者可以为用户提供咨询、反馈、售后等服务,大大提升用户体验和服务质量。
客服消息的核心特点:
- 双向通信:支持小程序与用户的双向即时对话
- 多种消息类型:支持文本、图片、图文链接、小程序卡片等多种消息类型
- 会话保持:在一定时间内保持会话状态,便于持续沟通
- 无需用户授权:用户主动发起会话后,开发者可在48小时内回复消息,无需额外授权
- 灵活集成:可对接自有客服系统或第三方客服平台
# 1.2 客服消息的应用场景
客服消息在小程序中有广泛的应用场景,主要包括:
- 售前咨询:用户可以在购买前咨询产品详情、规格、价格等信息
- 售后服务:处理用户在购买后的问题、退换货申请等
- 订单跟踪:用户可以通过客服消息查询订单状态、物流信息
- 投诉反馈:收集用户的意见和建议,处理投诉
- 活动通知:向用户推送促销活动、新品上市等信息
- 智能客服:结合AI技术,实现自动问答和智能推荐
- 社群运营:通过客服消息维护用户关系,提升用户粘性
# 1.3 客服消息与订阅消息的区别
特性 | 客服消息 | 订阅消息 |
---|---|---|
通信方式 | 双向通信 | 单向通知 |
发起方式 | 用户主动发起或开发者回复 | 仅开发者发送 |
时效性 | 用户发起后48小时内有效 | 用户订阅后一定时间内有效 |
授权要求 | 用户进入会话即视为授权 | 需要用户明确订阅授权 |
消息类型 | 多种类型(文本、图片、链接等) | 固定模板格式 |
使用场景 | 即时沟通、咨询服务 | 通知提醒、状态更新 |
频率限制 | 较为宽松 | 严格限制发送频率 |
# 2. 客服消息接入前准备
# 2.1 配置要求与权限申请
在接入客服消息功能前,需要满足以下条件:
小程序类目要求:
- 客服消息功能对小程序类目有一定要求,需确认您的小程序类目是否支持
- 大部分商家类目、服务类目、工具类目都支持客服消息
服务器要求:
- 需要有一个支持HTTPS的服务器用于接收和处理消息
- 服务器需要有固定的公网IP和域名
- 服务器需要支持80端口和443端口
开发者资质:
- 小程序需已通过微信认证
- 开发者需具备基本的后端开发能力
# 2.2 开通客服消息
登录微信公众平台:
- 访问微信公众平台 (opens new window)并登录小程序管理账号
进入客服消息设置:
- 在左侧菜单栏选择「设置」→「客服」→「客服消息」
开启客服消息:
- 点击「开启」按钮启用客服消息功能
- 如果按钮为灰色,请检查小程序类目是否支持客服消息
# 2.3 配置消息推送URL
设置服务器配置:
- 在左侧菜单栏选择「开发」→「开发设置」→「消息推送」
- 点击「修改」按钮进入配置页面
填写服务器信息:
- URL:填写接收消息的服务器地址,必须以
https://
或http://
开头 - Token:自定义的令牌,用于验证消息的确来自微信服务器
- EncodingAESKey:消息加密密钥,可点击「随机生成」按钮获取
- 消息加密方式:建议选择「安全模式」
- URL:填写接收消息的服务器地址,必须以
验证服务器配置:
- 点击「提交」按钮,微信服务器会向您配置的URL发送一个验证请求
- 您的服务器需要按照微信的验证规则正确响应,才能完成配置
// 服务器验证示例代码(Node.js)
const crypto = require('crypto');
app.get('/wechat/message', (req, res) => {
const { signature, timestamp, nonce, echostr } = req.query;
const token = 'your_token'; // 替换为您设置的Token
// 1. 将token、timestamp、nonce三个参数进行字典序排序
const array = [token, timestamp, nonce].sort();
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
const tempStr = array.join('');
const hashCode = crypto.createHash('sha1').update(tempStr).digest('hex');
// 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (hashCode === signature) {
res.send(echostr);
} else {
res.send('验证失败');
}
});
# 3. 客服消息接口详解
# 3.1 接收客服消息
当用户向小程序发送消息时,微信服务器会将消息推送到您配置的URL。您需要在服务器端接收并处理这些消息。
消息接收流程:
- 用户在小程序中发送消息
- 微信服务器将消息推送到您配置的URL
- 您的服务器接收并解析消息
- 根据消息内容进行相应处理
接收消息示例代码:
// 使用Express框架接收消息(Node.js)
const express = require('express');
const bodyParser = require('body-parser');
const xml2js = require('xml2js');
const app = express();
// 解析XML格式的请求体
app.use(bodyParser.text({ type: 'text/xml' }));
app.post('/wechat/message', (req, res) => {
// 解析XML消息
xml2js.parseString(req.body, { explicitArray: false }, (err, result) => {
if (err) {
console.error('解析XML失败:', err);
res.send('success'); // 即使解析失败也要返回success,避免微信服务器重试
return;
}
const message = result.xml;
console.log('收到消息:', message);
// 根据消息类型处理
switch (message.MsgType) {
case 'text':
// 处理文本消息
console.log(`收到文本消息:${message.Content},来自:${message.FromUserName}`);
break;
case 'image':
// 处理图片消息
console.log(`收到图片消息,图片URL:${message.PicUrl},来自:${message.FromUserName}`);
break;
// 处理其他类型消息...
}
// 必须回复success,否则微信服务器会重试
res.send('success');
});
});
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});
# 3.2 发送客服消息
开发者可以通过调用微信提供的接口,主动向用户发送客服消息。在用户发起会话后的48小时内,开发者可以不限次数地向用户发送消息。
发送消息流程:
- 获取接口调用凭证(access_token)
- 构造消息内容
- 调用发送消息接口
- 处理接口返回结果
获取access_token示例代码:
const axios = require('axios');
async function getAccessToken() {
const appId = 'your_app_id'; // 替换为您的小程序AppID
const appSecret = 'your_app_secret'; // 替换为您的小程序AppSecret
try {
const response = await axios.get(
`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`
);
if (response.data && response.data.access_token) {
return response.data.access_token;
} else {
throw new Error('获取access_token失败:' + JSON.stringify(response.data));
}
} catch (error) {
console.error('获取access_token出错:', error);
throw error;
}
}
发送文本消息示例代码:
async function sendTextMessage(openId, text) {
try {
const accessToken = await getAccessToken();
const response = await axios.post(
`https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${accessToken}`,
{
touser: openId,
msgtype: 'text',
text: {
content: text
}
}
);
if (response.data && response.data.errcode === 0) {
console.log('消息发送成功');
return true;
} else {
console.error('消息发送失败:', response.data);
return false;
}
} catch (error) {
console.error('发送消息出错:', error);
return false;
}
}
// 使用示例
sendTextMessage('user_open_id', '您好,这是一条客服消息!');
# 3.3 消息加密与解密
在安全模式下,微信服务器推送的消息会进行加密,开发者需要先解密才能获取原始消息内容。
解密消息示例代码:
const crypto = require('crypto');
function decryptMessage(encryptedMsg, encodingAESKey, appId) {
// 将encodingAESKey转换为Buffer
const aesKey = Buffer.from(encodingAESKey + '=', 'base64');
// 解密
const decipher = crypto.createDecipheriv('aes-256-cbc', aesKey, aesKey.slice(0, 16));
decipher.setAutoPadding(false);
let decrypted = decipher.update(encryptedMsg, 'base64', 'utf8');
decrypted += decipher.final('utf8');
// 去除填充
const pad = decrypted.charCodeAt(decrypted.length - 1);
decrypted = decrypted.slice(0, -pad);
// 获取消息内容
const content = decrypted.slice(16);
const xmlLength = content.slice(0, 4).readUInt32BE(0);
const xmlContent = content.slice(4, xmlLength + 4);
const fromAppId = content.slice(xmlLength + 4);
// 校验AppID
if (fromAppId.toString() !== appId) {
throw new Error('AppID校验失败');
}
return xmlContent.toString();
}
# 4. 客服消息类型与格式
# 4.1 文本消息
文本消息是最基本的消息类型,用于发送纯文本内容。
接收文本消息格式:
<xml>
<ToUserName><![CDATA[gh_xxxxxxxxxxxx]]></ToUserName>
<FromUserName><![CDATA[oxxxxxxxxxxxxxxxxxxxx]]></FromUserName>
<CreateTime>1548831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[这是用户发送的文本消息]]></Content>
<MsgId>22222222222222222</MsgId>
</xml>
发送文本消息格式:
{
"touser": "oxxxxxxxxxxxxxxxxxxxx",
"msgtype": "text",
"text": {
"content": "这是回复的文本消息"
}
}
# 4.2 图片消息
图片消息用于发送图片内容,需要先上传图片获取media_id。
接收图片消息格式:
<xml>
<ToUserName><![CDATA[gh_xxxxxxxxxxxx]]></ToUserName>
<FromUserName><![CDATA[oxxxxxxxxxxxxxxxxxxxx]]></FromUserName>
<CreateTime>1548831860</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[http://mmbiz.qpic.cn/...]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
<MsgId>22222222222222222</MsgId>
</xml>
发送图片消息格式:
{
"touser": "oxxxxxxxxxxxxxxxxxxxx",
"msgtype": "image",
"image": {
"media_id": "MEDIA_ID"
}
}
上传图片获取media_id示例代码:
const fs = require('fs');
const FormData = require('form-data');
const axios = require('axios');
async function uploadImage(imagePath) {
try {
const accessToken = await getAccessToken();
const form = new FormData();
form.append('media', fs.createReadStream(imagePath));
const response = await axios.post(
`https://api.weixin.qq.com/cgi-bin/media/upload?access_token=${accessToken}&type=image`,
form,
{
headers: form.getHeaders()
}
);
if (response.data && response.data.media_id) {
console.log('图片上传成功,media_id:', response.data.media_id);
return response.data.media_id;
} else {
console.error('图片上传失败:', response.data);
return null;
}
} catch (error) {
console.error('上传图片出错:', error);
return null;
}
}
# 4.3 图文链接消息
图文链接消息用于发送带有标题、描述、图片和链接的消息。
发送图文链接消息格式:
{
"touser": "oxxxxxxxxxxxxxxxxxxxx",
"msgtype": "link",
"link": {
"title": "图文链接标题",
"description": "图文链接描述",
"url": "https://example.com/article",
"thumb_url": "https://example.com/thumb.jpg"
}
}
# 4.4 小程序卡片消息
小程序卡片消息用于推广其他小程序页面。
发送小程序卡片消息格式:
{
"touser": "oxxxxxxxxxxxxxxxxxxxx",
"msgtype": "miniprogrampage",
"miniprogrampage": {
"title": "小程序卡片标题",
"pagepath": "pages/index/index",
"thumb_media_id": "THUMB_MEDIA_ID"
}
}
# 4.5 其他消息类型
除了上述常用消息类型外,客服消息还支持以下类型:
- 语音消息:发送语音文件
- 视频消息:发送视频文件
- 音乐消息:发送音乐链接
- 图文消息(news):发送多条图文信息
- 菜单消息:发送带有菜单选项的消息
# 5. 客服消息实战开发
# 5.1 后端接收与解析消息
在实际开发中,我们需要构建一个完整的后端服务来接收和处理客服消息。以下是一个基于Node.js和Express的完整示例:
const express = require('express');
const bodyParser = require('body-parser');
const xml2js = require('xml2js');
const crypto = require('crypto');
const app = express();
// 配置信息
const config = {
token: 'your_token',
encodingAESKey: 'your_encoding_aes_key',
appId: 'your_app_id'
};
// 解析XML格式的请求体
app.use(bodyParser.text({ type: 'text/xml' }));
// 验证服务器配置
app.get('/wechat/message', (req, res) => {
const { signature, timestamp, nonce, echostr } = req.query;
// 1. 将token、timestamp、nonce三个参数进行字典序排序
const array = [config.token, timestamp, nonce].sort();
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
const tempStr = array.join('');
const hashCode = crypto.createHash('sha1').update(tempStr).digest('hex');
// 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (hashCode === signature) {
res.send(echostr);
} else {
res.send('验证失败');
}
});
// 接收客服消息
app.post('/wechat/message', (req, res) => {
// 解析XML消息
xml2js.parseString(req.body, { explicitArray: false }, async (err, result) => {
if (err) {
console.error('解析XML失败:', err);
res.send('success');
return;
}
const message = result.xml;
console.log('收到消息:', message);
try {
// 根据消息类型处理
switch (message.MsgType) {
case 'text':
// 处理文本消息
await handleTextMessage(message);
break;
case 'image':
// 处理图片消息
await handleImageMessage(message);
break;
// 处理其他类型消息...
default:
console.log(`收到未知类型消息:${message.MsgType}`);
}
} catch (error) {
console.error('处理消息出错:', error);
}
// 必须回复success,否则微信服务器会重试
res.send('success');
});
});
// 处理文本消息
async function handleTextMessage(message) {
const { FromUserName, Content } = message;
console.log(`收到文本消息:${Content},来自:${FromUserName}`);
// 简单的自动回复逻辑
if (Content.includes('你好') || Content.includes('hello')) {
await sendTextMessage(FromUserName, '您好!有什么可以帮助您的吗?');
} else if (Content.includes('价格') || Content.includes('多少钱')) {
await sendTextMessage(FromUserName, '我们的产品价格为99元起,详情可查看商品页面。');
} else {
// 默认回复
await sendTextMessage(FromUserName, `感谢您的留言:${Content},我们会尽快处理。`);
}
}
// 处理图片消息
async function handleImageMessage(message) {
const { FromUserName, PicUrl, MediaId } = message;
console.log(`收到图片消息,图片URL:${PicUrl},来自:${FromUserName}`);
// 回复确认收到图片
await sendTextMessage(FromUserName, '已收到您发送的图片,谢谢!');
}
// 启动服务器
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});
# 5.2 后端发送客服消息
以下是一个完整的发送客服消息的工具类:
const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');
// 缓存access_token
let accessTokenCache = {
token: '',
expireTime: 0
};
// 获取access_token
async function getAccessToken() {
const now = Date.now();
// 如果缓存的token未过期,直接返回
if (accessTokenCache.token && accessTokenCache.expireTime > now) {
return accessTokenCache.token;
}
const appId = 'your_app_id';
const appSecret = 'your_app_secret';
try {
const response = await axios.get(
`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`
);
if (response.data && response.data.access_token) {
// 缓存token,有效期设为7000秒(微信返回的是7200秒,留200秒余量)
accessTokenCache = {
token: response.data.access_token,
expireTime: now + 7000 * 1000
};
return accessTokenCache.token;
} else {
throw new Error('获取access_token失败:' + JSON.stringify(response.data));
}
} catch (error) {
console.error('获取access_token出错:', error);
throw error;
}
}
// 发送文本消息
async function sendTextMessage(openId, text) {
try {
const accessToken = await getAccessToken();
const response = await axios.post(
`https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${accessToken}`,
{
touser: openId,
msgtype: 'text',
text: {
content: text
}
}
);
if (response.data && response.data.errcode === 0) {
console.log('文本消息发送成功');
return true;
} else {
console.error('文本消息发送失败:', response.data);
return false;
}
} catch (error) {
console.error('发送文本消息出错:', error);
return false;
}
}
// 上传图片获取media_id
async function uploadImage(imagePath) {
try {
const accessToken = await getAccessToken();
const form = new FormData();
form.append('media', fs.createReadStream(imagePath));
const response = await axios.post(
`https://api.weixin.qq.com/cgi-bin/media/upload?access_token=${accessToken}&type=image`,
form,
{
headers: form.getHeaders()
}
);
if (response.data && response.data.media_id) {
console.log('图片上传成功,media_id:', response.data.media_id);
return response.data.media_id;
} else {
console.error('图片上传失败:', response.data);
return null;
}
} catch (error) {
console.error('上传图片出错:', error);
return null;
}
}
// 发送图片消息
async function sendImageMessage(openId, mediaId) {
try {
const accessToken = await getAccessToken();
const response = await axios.post(
`https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${accessToken}`,
{
touser: openId,
msgtype: 'image',
image: {
media_id: mediaId
}
}
);
if (response.data && response.data.errcode === 0) {
console.log('图片消息发送成功');
return true;
} else {
console.error('图片消息发送失败:', response.data);
return false;
}
} catch (error) {
console.error('发送图片消息出错:', error);
return false;
}
}
// 发送图文链接消息
async function sendLinkMessage(openId, title, description, url, thumbUrl) {
try {
const accessToken = await getAccessToken();
const response = await axios.post(
`https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${accessToken}`,
{
touser: openId,
msgtype: 'link',
link: {
title,
description,
url,
thumb_url: thumbUrl
}
}
);
if (response.data && response.data.errcode === 0) {
console.log('图文链接消息发送成功');
return true;
} else {
console.error('图文链接消息发送失败:', response.data);
return false;
}
} catch (error) {
console.error('发送图文链接消息出错:', error);
return false;
}
}
// 发送小程序卡片消息
async function sendMiniProgramMessage(openId, title, pagePath, thumbMediaId) {
try {
const accessToken = await getAccessToken();
const response = await axios.post(
`https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${accessToken}`,
{
touser: openId,
msgtype: 'miniprogrampage',
miniprogrampage: {
title,
pagepath: pagePath,
thumb_media_id: thumbMediaId
}
}
);
if (response.data && response.data.errcode === 0) {
console.log('小程序卡片消息发送成功');
return true;
} else {
console.error('小程序卡片消息发送失败:', response.data);
return false;
}
} catch (error) {
console.error('发送小程序卡片消息出错:', error);
return false;
}
}
module.exports = {
getAccessToken,
sendTextMessage,
uploadImage,
sendImageMessage,
sendLinkMessage,
sendMiniProgramMessage
};
# 5.3 前端客服会话入口
在小程序前端,可以通过以下方式创建客服会话入口:
- 使用客服会话按钮组件:
<!-- WXML文件 -->
<button open-type="contact" show-message-card="true" send-message-title="咨询标题" send-message-path="pages/index/index" send-message-img="图片链接">联系客服</button>
- 通过API打开客服会话:
// JS文件
Page({
// 打开客服会话
openCustomerService() {
wx.openCustomerServiceChat({
extInfo: { url: 'https://work.weixin.qq.com/kfid/kfc7c39738c3d6e6f21' },
corpId: 'ww9xxxxxxxxxxxxxxx',
success(res) {
console.log('打开客服会话成功', res);
},
fail(err) {
console.error('打开客服会话失败', err);
}
});
}
});
- 在页面中嵌入客服消息卡片:
<!-- WXML文件 -->
<contact-button type="default-dark" size="20" session-from="weapp"></contact-button>
# 5.4 自动回复机制实现
实现一个简单的自动回复机制,可以根据用户消息内容进行智能回复:
// 自动回复处理函数
async function handleAutoReply(message) {
const { FromUserName, Content, MsgType } = message;
// 如果不是文本消息,发送默认回复
if (MsgType !== 'text') {
await sendTextMessage(FromUserName, '您好,我们已收到您的消息,客服将尽快回复您。');
return;
}
// 关键词匹配规则
const keywordRules = [
{ keywords: ['你好', 'hello', 'hi'], reply: '您好!很高兴为您服务,请问有什么可以帮助您的?' },
{ keywords: ['价格', '多少钱', '费用'], reply: '我们的产品价格为99元起,详情可查看商品页面或咨询在线客服。' },
{ keywords: ['配送', '快递', '物流', '发货'], reply: '我们默认使用顺丰快递,一般下单后1-3天内发货,节假日可能会有延迟。' },
{ keywords: ['退款', '退货', '换货', '售后'], reply: '如需办理退换货,请在订单详情页申请售后,或提供订单号给客服处理。' },
{ keywords: ['优惠券', '折扣', '促销'], reply: '目前正在进行满100减20的促销活动,新用户还可领取88元优惠券。' },
{ keywords: ['地址', '门店', '实体店'], reply: '我们的线下门店地址可在"关于我们"页面查看,也可以直接在小程序内使用"附近门店"功能。' }
];
// 检查是否匹配关键词
for (const rule of keywordRules) {
if (rule.keywords.some(keyword => Content.includes(keyword))) {
await sendTextMessage(FromUserName, rule.reply);
return;
}
}
// 默认回复
await sendTextMessage(FromUserName, '感谢您的咨询,我们已收到您的消息,客服将尽快回复您。如有紧急问题,可拨打客服热线:400-123-4567。');
}
# 6. 客服系统集成
# 6.1 接入第三方客服系统
微信小程序可以与第三方客服系统集成,常见的第三方客服系统包括:
- 美洽客服
- 智齿客服
- 微信官方客服
- 环信客服
- 网易七鱼
以美洽客服为例,集成步骤如下:
注册美洽账号:
- 访问美洽官网注册账号
- 创建应用并获取企业ID
在小程序中集成SDK:
- 下载美洽小程序SDK
- 将SDK文件添加到小程序项目中
初始化SDK:
// app.js
App({
onLaunch: function() {
// 初始化美洽SDK
const meiqiaConfig = {
enterpriseId: 'your_enterprise_id',
projectType: 1, // 1代表小程序
oe: false, // 是否为开放平台应用
platformType: 'wechat' // 平台类型
};
// 引入美洽SDK
const Meiqia = require('./utils/meiqia-sdk.js');
this.meiqia = new Meiqia(meiqiaConfig);
// 设置用户信息
this.meiqia.setClientInfo({
id: 'user_id', // 用户ID
name: 'user_name', // 用户名称
avatar: 'user_avatar_url', // 用户头像
// 其他自定义信息
customInfo: {
gender: '男',
age: '25',
level: 'VIP'
}
});
}
});
- 添加客服入口:
<!-- WXML文件 -->
<button bindtap="openMeiqiaChat">联系客服</button>
// JS文件
Page({
openMeiqiaChat() {
const app = getApp();
app.meiqia.openChat({
success: function() {
console.log('打开客服对话框成功');
},
fail: function(error) {
console.error('打开客服对话框失败', error);
}
});
}
});
# 6.2 自建客服系统
如果需要更高的定制化,可以自建客服系统。自建客服系统的核心组件包括:
消息接收与发送模块:
- 接收用户消息
- 发送客服回复
客服工作台:
- 客服人员操作界面
- 会话管理
- 用户信息展示
消息路由系统:
- 根据规则将用户消息分配给合适的客服
自动回复系统:
- 关键词自动回复
- 智能问答机器人
数据统计与分析:
- 会话量统计
- 客服绩效分析
- 用户满意度评价
# 6.3 客服系统功能设计
一个完善的客服系统应包含以下功能:
多渠道接入:
- 小程序客服消息
- 公众号消息
- 网页聊天
- 电话语音
智能分配:
- 根据客服技能分配
- 根据用户等级分配
- 负载均衡分配
会话管理:
- 会话排队
- 会话转接
- 会话结束与评价
知识库系统:
- 常见问题库
- 快捷回复模板
- 标准答案库
客服监控:
- 实时会话监控
- 客服状态监控
- 质量抽检
数据分析:
- 会话量趋势
- 问题类型分布
- 客服绩效分析
- 用户满意度分析
# 7. 客服消息安全与合规
# 7.1 内容安全审核
为了确保客服消息内容的安全性,应实施以下措施:
关键词过滤:
- 建立敏感词库
- 对用户消息进行实时过滤
- 对客服回复进行审核
内容审核API:
- 接入微信内容安全API
- 接入第三方内容审核服务
// 内容安全检测示例
async function checkContentSafety(content) {
try {
const accessToken = await getAccessToken();
const response = await axios.post(
`https://api.weixin.qq.com/wxa/msg_sec_check?access_token=${accessToken}`,
{
content: content
}
);
if (response.data && response.data.errcode === 0) {
return { safe: true };
} else if (response.data.errcode === 87014) {
return { safe: false, reason: '内容含有违法违规信息' };
} else {
console.error('内容检测失败:', response.data);
return { safe: false, reason: '内容检测失败' };
}
} catch (error) {
console.error('内容安全检测出错:', error);
return { safe: false, reason: '内容检测异常' };
}
}
// 使用示例
async function sendSafeMessage(openId, content) {
const safetyResult = await checkContentSafety(content);
if (safetyResult.safe) {
await sendTextMessage(openId, content);
} else {
console.error('消息内容不安全,已阻止发送:', safetyResult.reason);
// 可以通知管理员或记录日志
}
}
# 7.2 敏感信息处理
在处理客服消息时,需要注意保护用户敏感信息:
个人信息脱敏:
- 手机号码:显示为 138****1234
- 身份证号:显示为 110101********1234
- 银行卡号:显示为 6222 **** **** 1234
数据存储安全:
- 敏感信息加密存储
- 设置访问权限控制
- 定期清理历史消息
传输安全:
- 使用HTTPS加密传输
- 避免在日志中记录敏感信息
# 7.3 合规注意事项
在使用客服消息功能时,需要注意以下合规事项:
获取用户授权:
- 虽然客服消息不需要额外授权,但在收集用户其他信息时需要明确告知并获取授权
遵守微信规则:
- 不得发送违法违规内容
- 不得发送营销垃圾信息
- 不得骚扰用户
隐私政策:
- 在小程序中提供清晰的隐私政策
- 说明客服消息的使用方式和数据处理方式
记录保存:
- 保存客服消息记录,以备查询和审计
- 遵守相关行业的数据保存要求
# 8. 客服消息最佳实践
# 8.1 高效客服流程设计
设计高效的客服流程可以提升用户体验和客服效率:
分级响应机制:
- 第一级:自动回复和智能机器人
- 第二级:普通客服人员
- 第三级:专业技术支持或主管
预设场景流程:
- 咨询场景:产品信息 → 价格咨询 → 下单引导
- 售后场景:问题描述 → 解决方案 → 满意度确认
- 投诉场景:问题记录 → 道歉安抚 → 解决方案 → 补偿措施
服务时间管理:
- 明确客服服务时间
- 非服务时间自动回复处理方式
- 紧急问题escalation机制
# 8.2 智能客服机器人
结合AI技术,可以实现智能客服机器人:
基于规则的机器人:
- 关键词匹配
- 决策树对话流程
- 模板回复
基于NLP的机器人:
- 意图识别
- 实体提取
- 上下文理解
- 情感分析
混合模式:
- 机器人优先处理
- 无法解决时转人工客服
- 人工客服辅助训练机器人
// 简单的NLP意图识别示例
function identifyIntent(message) {
// 意图分类规则
const intents = [
{ name: 'greeting', patterns: ['你好', '您好', 'hello', 'hi', '嗨', '哈喽'] },
{ name: 'farewell', patterns: ['再见', '拜拜', '拜', 'bye', '下次见'] },
{ name: 'thanks', patterns: ['谢谢', '感谢', '多谢', 'thanks', 'thank you'] },
{ name: 'product_inquiry', patterns: ['产品', '商品', '货品', '有什么', '卖什么'] },
{ name: 'price_inquiry', patterns: ['价格', '多少钱', '费用', '价钱', '报价'] },
{ name: 'order_status', patterns: ['订单', '物流', '发货', '到哪了', '快递'] },
{ name: 'complaint', patterns: ['投诉', '不满', '差评', '退款', '不好'] },
{ name: 'help', patterns: ['帮助', '怎么用', '使用方法', '教程', '指南'] }
];
// 检查消息是否匹配某个意图
for (const intent of intents) {
if (intent.patterns.some(pattern => message.includes(pattern))) {
return intent.name;
}
}
// 默认意图
return 'unknown';
}
// 根据意图生成回复
function generateResponse(intent, userName) {
const responses = {
greeting: [`您好${userName},欢迎咨询,有什么可以帮助您的吗?`, `你好${userName},很高兴为您服务!`],
farewell: [`再见${userName},祝您有愉快的一天!`, `感谢您的咨询,再见!`],
thanks: [`不客气,为您服务是我的荣幸!`, `您的满意是我们最大的追求!`],
product_inquiry: [`我们有多种产品系列,您可以在首页查看详细分类,或者告诉我您想了解哪类产品?`, `您好,请问您对哪类产品感兴趣呢?我可以为您推荐。`],
price_inquiry: [`我们的产品价格从99元到999元不等,具体价格请查看商品详情页,您需要了解哪款产品的价格呢?`, `不同产品价格不同,请问您想了解哪款产品的价格呢?`],
order_status: [`请提供您的订单号,我可以为您查询最新物流状态。`, `您好,需要您提供订单号才能查询物流信息哦。`],
complaint: [`非常抱歉给您带来不便,请详细描述您遇到的问题,我们会尽快处理。`, `我们对您的体验感到抱歉,请告诉我具体情况,我会立即跟进解决。`],
help: [`您可以在"使用帮助"页面查看详细教程,或者告诉我您需要哪方面的帮助?`, `我们提供全面的使用指南,您可以在小程序首页底部找到"帮助中心",或者直接告诉我您的疑问。`],
unknown: [`抱歉,我不太理解您的意思,能否换个方式描述您的问题?`, `您的问题可能需要专业客服处理,正在为您转接人工客服...`]
};
// 随机选择一个回复
const intentResponses = responses[intent] || responses.unknown;
return intentResponses[Math.floor(Math.random() * intentResponses.length)];
}
// 智能客服处理流程
async function handleIntelligentService(message) {
const { FromUserName, Content } = message;
const userName = await getUserName(FromUserName) || ''; // 获取用户昵称的函数
// 识别用户意图
const intent = identifyIntent(Content);
console.log(`用户意图识别:${intent}`);
// 生成回复
const reply = generateResponse(intent, userName);
// 发送回复
await sendTextMessage(FromUserName, reply);
// 如果是未知意图或投诉,记录需要人工跟进
if (intent === 'unknown' || intent === 'complaint') {
await recordForHumanFollowUp(FromUserName, Content, intent);
}
}
# 8.3 性能优化建议
为了确保客服消息系统的高性能,可以采取以下措施:
消息队列:
- 使用消息队列处理高并发消息
- 避免直接同步处理消息
缓存机制:
- 缓存access_token
- 缓存常用回复内容
- 缓存用户信息
异步处理:
- 接收消息立即返回success
- 异步处理消息内容
- 异步发送回复
水平扩展:
- 设计支持多实例部署的架构
- 使用负载均衡分发请求
监控告警:
- 监控消息处理延迟
- 监控API调用频率和限额
- 设置异常告警机制
# 9. 常见问题与解决方案
# 9.1 消息发送失败问题
问题1:发送消息返回45015错误
- 原因:超出48小时消息时限
- 解决方案:
- 确保在用户发起会话后的48小时内回复
- 使用订阅消息作为替代方案
- 引导用户重新发起会话
问题2:发送消息返回40001错误
- 原因:access_token无效或已过期
- 解决方案:
- 刷新access_token
- 检查access_token获取逻辑
- 实现token自动刷新机制
问题3:发送消息返回45047错误
- 原因:客服接口调用频率超过限制
- 解决方案:
- 控制发送频率
- 实现请求排队机制
- 避免短时间内大量发送消息
# 9.2 消息接收异常处理
问题1:接收不到用户消息
- 原因:服务器配置不正确或URL不可访问
- 解决方案:
- 检查服务器URL是否可以正常访问
- 确认服务器配置的Token是否正确
- 检查服务器响应是否正确返回"success"
- 查看服务器日志,排查可能的错误
问题2:消息重复接收
- 原因:服务器未正确响应或响应超时
- 解决方案:
- 确保服务器在接收到消息后立即返回"success"
- 优化服务器处理逻辑,避免长时间处理
- 实现消息去重机制,根据MsgId判断重复消息
问题3:消息内容解析错误
- 原因:XML解析失败或格式不正确
- 解决方案:
- 使用可靠的XML解析库
- 增加错误处理和异常捕获
- 记录原始消息内容,便于排查问题
# 9.3 其他常见问题
问题1:如何判断用户是否已关注公众号?
- 解决方案:
- 通过接收事件消息中的Event字段判断
- 用户首次关注会收到"subscribe"事件
- 取消关注会收到"unsubscribe"事件
- 也可通过微信用户API查询关注状态
问题2:如何处理多客服协作?
- 解决方案:
- 实现客服分组和权限管理
- 设计会话转接机制
- 建立客服协作规范
- 使用第三方客服系统的多客服功能
问题3:如何提高客服效率?
- 解决方案:
- 预设快捷回复模板
- 建立完善的知识库
- 实现智能推荐回复
- 优化客服工作台界面
- 提供客服培训和绩效激励
# 总结
微信小程序客服消息是连接用户与开发者的重要桥梁,通过本文的详细介绍,我们了解了客服消息的基本概念、接入流程、接口使用、消息类型、实战开发、系统集成、安全合规以及最佳实践等方面的内容。
通过合理利用客服消息功能,开发者可以:
- 提升用户体验:及时响应用户需求,解决用户问题
- 增强用户粘性:通过良好的沟通建立用户信任和忠诚度
- 提高转化率:解答用户疑问,促进购买决策
- 收集用户反馈:了解用户需求和痛点,持续优化产品
- 降低运营成本:通过自动化和智能化降低人工客服成本
在实际应用中,建议开发者根据自身业务特点和用户需求,选择合适的客服消息解决方案,并不断优化完善,为用户提供更好的服务体验。