一、功能需求与场景分析
微信小程序的客服与在线聊天功能主要解决两大核心需求:用户即时咨询与服务闭环构建。根据业务场景不同,可分为三类:
- 基础客服场景:通过微信官方客服消息接口,实现用户点击按钮后跳转至客服会话(支持文字/图片/小程序卡片)。
- 实时聊天场景:需要双向即时通讯(如电商客服、社交应用),需集成WebSocket或第三方IM服务。
- 混合场景:基础客服+实时聊天组合,例如先通过客服按钮收集问题,再转接人工实时对话。
二、方案一:微信官方客服消息接口(推荐轻量级场景)
1. 配置流程
步骤1:开通客服功能
- 登录微信公众平台 → 小程序后台 → 客服消息 → 添加客服人员(需绑定微信号)。
- 每个小程序最多可添加100个客服账号,支持按部门分组。
步骤2:添加客服按钮
在WXML中插入<contact-button>组件:
<contact-buttontype="default-light"session-from="weapp"size="28"style="position: fixed; right: 20px; bottom: 80px;"/>
关键参数说明:
type:按钮样式(default-light/default-dark/mini)session-from:会话来源标识(用于区分入口)size:按钮尺寸(20-30px)
步骤3:处理客服消息
需在小程序后台配置服务器域名(request合法域名),并在后端接收微信推送的客服消息。消息格式示例:
{"FromUserName": "用户openid","MsgType": "text","Content": "你好,我想咨询订单问题"}
后端需在5秒内响应success,否则微信会重试3次。
2. 局限性
- 仅支持单向消息推送(用户→客服),客服回复需通过微信客服工具或API。
- 无历史消息存储,会话断开后无法追溯。
三、方案二:云开发集成实时聊天(适合中小型应用)
1. 云数据库设计
创建messages集合,字段示例:
{"_id": "自动生成","sender": "user/admin","openid": "用户标识","content": "消息内容","timestamp": 1625097600,"session_id": "会话ID"}
2. 前端实现
发送消息
wx.cloud.callFunction({name: 'sendMessage',data: {sender: 'user',openid: getApp().globalData.openid,content: '你好',session_id: 'session123'}})
接收消息
通过wx.onSocketMessage监听WebSocket消息:
const socketTask = wx.connectSocket({url: 'wss://your-cloud-domain/ws',success: () => console.log('连接成功')})socketTask.onMessage(res => {const data = JSON.parse(res.data)this.setData({ messages: [...this.data.messages, data] })})
3. 云函数示例
// 云函数入口文件exports.main = async (event, context) => {const db = cloud.database()await db.collection('messages').add({data: event})return { success: true }}
四、方案三:第三方IM服务集成(适合高并发场景)
1. 选型对比
| 服务商 | 优势 | 费用模式 |
|---|---|---|
| 腾讯云IM | 与微信生态深度整合 | 按DAU计费(0.003元/日) |
| 融云 | 支持多平台统一账号 | 免费版+增值服务 |
| 环信 | 私有化部署灵活 | 定制化报价 |
2. 腾讯云IM集成步骤
步骤1:创建IM应用
- 登录腾讯云控制台 → 即时通信IM → 创建应用 → 获取SDKAppID和密钥。
步骤2:初始化客户端
const TIM = require('tim-wx-sdk')const options = {SDKAppID: 1400000000 // 替换为实际值}const tim = TIM.create(options)tim.login({userID: 'user_' + Math.random().toString(36).substr(2),userSig: '通过后端生成的签名' // 需后端计算})
步骤3:发送消息
tim.createTextMessage({to: 'group_123', // 会话IDconversationType: 'GROUP',payload: { text: '你好' }}).then(msg => {tim.sendMessage(msg)})
五、高级功能实现
1. 消息已读状态
通过tim.on(TIM.EVENT.MESSAGE_READ, event => {...})监听已读回执。
2. 图片/文件传输
使用tim.createImageMessage或tim.createFileMessage,需配置COS存储桶。
3. 智能客服路由
结合NLP引擎实现自动分类:
// 伪代码示例function routeMessage(content) {if (content.includes('订单')) return 'order_queue'if (content.includes('退款')) return 'refund_queue'return 'default_queue'}
六、性能优化建议
- 消息分页加载:首次加载20条,滚动到底部时加载更多。
- WebSocket心跳:每30秒发送一次心跳包保持连接。
- 本地缓存:使用
wx.setStorageSync缓存最近100条消息。 - 图片压缩:上传前通过
canvas压缩图片(目标尺寸800px以内)。
七、安全合规要点
- 用户隐私保护:明确告知消息存储期限(不超过7天)。
- 内容过滤:对敏感词进行替换(如
*号处理)。 - 频率限制:单用户每秒最多发送5条消息。
- 证书配置:WebSocket域名需使用HTTPS且备案。
八、常见问题解决方案
- 客服按钮不显示:检查是否在
app.json中声明了contact-button权限。 - 消息延迟:优化云函数超时时间(默认3秒,可调至10秒)。
- IM连接失败:检查SDKAppID是否匹配,userSig是否过期。
- iOS键盘遮挡:在
<scroll-view>中添加adjust-position属性。
通过以上方案,开发者可根据业务规模(日均消息量500条以下用方案一,500-10万用方案二,10万+用方案三)和功能需求选择最适合的实现路径。建议初期采用微信官方客服按钮快速上线,待用户量增长后再升级为实时聊天系统。