评论

关于自定义客服会话contact同时兼容自动和人工客服使用

用户打开客服会话,默认给出提示信息,并同时兼容自动和人工客服

首先,我们知道,可以通过button中的属性open-type="contact",实现小程序用户和小程序所有者客服对话。

			<button open-type="contact">客服</button>

在没有任何程序干预的情况下, 客服消息可直接在网页版客服工具(https://mpkf.weixin.qq.com/)和小程序版客服工具(客服小助 手)查看并回复用户消息。

但是,有时有特殊需求,比如:

1、用户打开客服会话,默认给出提示信息
2、需要自定义客服消息,类似电话语音输入1,2,3出现对应回复的功能
3、能否同时兼容自动和人工客服


本文以云函数自定义消息为例:

1、小程序新建两个云函数

1)message-auto(默认进入客服会话的消息处理)

2)message(用户输入后触发的消息处理)

2、在云函数设置中关联

云函数--设置--全局设置,打开云函数接收消息推送,如下图绑定:

3、代码实现

此处为了避免每次进入客户会话,默认发送提示消息给用户造成困扰,建议存库处理,避免重复发送,至于多久发送一次,由开发者自行处理存库逻辑。

message-auto/index.js

// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const contentArr = ["输入数字可以获得帮助哦~", "1 怎么知道是否中奖?", "2 如何兑换奖励?", "3 实物如何兑奖?"]
// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  let openid = wxContext.OPENID
   // 查看是否发送过
   let res = await db.collection('message_auto')
   .where({
     openid: openid
   })
   .get()
   console.log("message_auto res: ", res)
   if(res.data && res.data.length > 0){
     return
   }
  let messageResult = await cloud.openapi.customerServiceMessage.send({
    touser: openid,
    msgtype: 'text',
    text: {
      content: contentArr.join("\n"),
    },
  })
  console.log("message_auto send res: ", messageResult)
  if(messageResult.errCode == 0){
    let messageAddRes = await db.collection('message_auto').add({
      data: {
        "openid": openid,
        "create_time": new Date()
      }
    })
    console.log('messageAddRes: ', messageAddRes)
  }
}



在用户输入后,校验是否满足自动回复消息条件(输入非1,2,3),可通过transfer_customer_service直接转由人工处理,这样相同于同时兼容了自动和人工客服,如示例中,“你好”会自动转人工处理

message/index.js

// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const contentArr = ["开奖后,会公告中奖用户和对应奖励,并发送中奖通知", "奖励会在您发送兑奖信息后24小时内兑换", "填写好收件人信息,48小时内发货(暂不支持港澳台、新疆、西藏等地区)"]
// 云函数入口函数
exports.main = async (event, context) => {
  console.log('message event:', event)
  let content = event.Content
  if(!content || !content.trim()){
    console.log('message can not be empty!')
    return
  }
  if(!isNaN(content) && content % 1 == 0 && content > 0 && content <= contentArr.length){
    let res = cloud.openapi.customerServiceMessage.send({
      touser: event.FromUserName,
      msgtype: 'text',
      text: {
        content: contentArr[content - 1],
      },
    })
    return
  }
  return {
    MsgType: 'transfer_customer_service',
    ToUserName: event.FromUserName,
    FromUserName: event.ToUserName,
    CreateTime: parseInt(+new Date / 1000),
  }
}
代码粗糙,多多指教! ^_^
最后一次编辑于  2020-08-12  
点赞 5
收藏
评论

3 个评论

  • 陈宇明
    陈宇明
    2020-08-13

    不错,学习了

    2020-08-13
    赞同 1
    回复 1
    • 恒
      2020-08-13
      谢谢支持!
      2020-08-13
      回复
  • 苑博林
    苑博林
    2021-04-13

    请问我在发送客服消息接口时,报错数据加密不正确,请问您是怎么解决的?

    {"errcode":1019,"errmsg":"data encrypt is incorrect, please check the doc.","rid":"1c0daf82"}


    2021-04-13
    赞同
    回复
  • wang li
    wang li
    2020-08-13

    非常不错,收藏了

    2020-08-13
    赞同
    回复 1
    • 恒
      2020-08-13
      谢谢认可!
      2020-08-13
      回复
登录 后发表内容