微信小程序——用原有接口实现智能客服

关于微信小程序的客服,自带的有两种模式。一种是自定义配置客服人员的微信,将小程程序中的消息传入各个客服的微信中。另一种是在设置--消息推送中进行配置。需要注意的是,这两种模式不能共存,如果配置消息推送,则会将小程序收到的所有信息,传入配置的接口中。

本文不讨论以上两种方式。因为使用消息推送,对接口的格式有要求。而公司原先就有智能客服的接口,并正在使用不方便更改。且该接口并不适合接收所有来自小程序的消息。因此,是采用普通request的方式请求接口,借用环信的界面,稍加修改做成的智能客服

放张图,给大家看看,直接配置微信客服。
image.png

好了,下面才是正经事儿。

公司接口返回的是个答案列表,所以我的智能客服回答的内容,是列表中的答案标题。具体的详情,需要点击标题跳转url查看。其实功能挺简单的咯。效果图:
image.png

环信的Demo做的是即时通讯的功能,而我的只是用户对机器人的简单问答,所以要删减的还是很多的,代码是在用的代码,公司的接口不方便PO。

<!--pages/robot-service/robot-service.wxml-->
<view class="main">
<!--对话框内容  -->
    <scroll-view scroll-y="true" class="scroll_view" scroll-into-view="{{ toView }}">
        <view class="message" wx:for="{{ chatMsg }}"  wx:key="{{mid}}" id="{{item.mid}}">
            <view class="main" class="{{ item.type==1?'self':null }}">
                <view class="user">
                    <text>{{ item.username }}</text>
                </view>
                <image class="avatar" src="../../images/number.png"/>
                <view class="msg">
                   <view wx:if="{{item.type==2}}"  wx:for-item="answer" wx:for="{{item.data}}">
                    <view data-web-url="{{answer.dizhi}}" bindtap="toWebview" style="margin-top: 2px;">{{ index+1 +"."+ answer.title }}</view>
                  </view> 
                  <text wx:if="{{item.type==1}}" style="float: left;margin-top: 2px;">{{ item.data }}</text>
                </view>
            </view>
        </view>
    </scroll-view>

<!--输入框和发送按钮  -->
    <view class="room_bar">
        <form>
            <view class="f-row">
                <input class="f news" type="text" value="{{ inputMessage }}"
                       placeholder="输入新消息" placeholder-style="color:#CFCFCF;padding-left:5px;" bindinput="bindMessage"/>
                <button class="send_btn" bindtap="sendMessage" formType="reset">发送</button>
            </view>
        </form>
    </view>
</view>
// pages/robot-service/robot-service.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    myName:'',//用户名
    chatMsg:[],//对话框中的聊天内容
    userMessage:'',//输入框中的内容
    toView: ''//对话框中最后一条会话id,将对话框定位滑动到新消息位置
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    let _this = this;
    let myName = options.username; //获取用户名
    _this.setData({
      myName: myName
    })
  },
  bindMessage: function (e) {
    this.setData({
      userMessage: e.detail.value
    })
  },
  sendMessage: function () {
    if (!this.data.userMessage.trim()) return;
    let date = new Date();
    let _this = this;
    let chatMsg = _this.data.chatMsg;
    let msgData = {
      username: _this.data.myName,
      data: _this.data.userMessage,
      type:1,
      mid: 'chat_' + date.getTime()
    };
    chatMsg.push(msgData);
    _this.setData({
      chatMsg: chatMsg
    });
    _this.receiveMsg(msgData.data);
    setTimeout(function () {
      _this.setData({
        toView: chatMsg[chatMsg.length - 1].mid
      })
    }, 100)
    _this.setData({
      userMessage: ''
    });
  },
  receiveMsg: function (queryValue) {
    let date = new Date();
    let _this = this;
    let msgData = {};
    let chatMsg = _this.data.chatMsg;
    wx.request({
      url: '获取问题答案的接口',
      data: {
        action: 'search',
        queryValue: queryValue
      },
      header: {
        'content-type': 'application/json' // 默认值
      },
      success: function (ret) {
        let searchValue = ret.data;
        if(!searchValue.data.searchResList.length){
          msgData = {
            username: '智能客服',
            data: [{id:0,title:'没有找到相关数据',dizhi:''}],
            type: 2,
            mid: 'chat_' + date.getTime()
          };
        } else {
          msgData = {
            username: '智能客服',
            data: searchValue.data.searchResList,
            type: 2,
            mid: 'chat_' + date.getTime()
          };
        };
        chatMsg.push(msgData);
        _this.setData({chatMsg: chatMsg});
        setTimeout(function () {
          _this.setData({
            toView: chatMsg[chatMsg.length - 1].mid
          })
        }, 100);
      },
      fail: function () {
        msgData = {
          username: '智能客服',
          data: [{ id: 0, title: '答案走丢了,请稍后再试', dizhi: '' }],
          type: 2,
          mid: 'chat_' + date.getTime()
        };
        chatMsg.push(msgData);
        _this.setData({ chatMsg: chatMsg });
      }
    })
  },
  toWebview:function(event){
    let url = event.currentTarget.dataset.webUrl;
    url ?
      wx.navigateTo({
        url: '../../pages/web-view/web-view?url=' + url,
      })
      : wx.showToast({
        title: "无详情页",
        icon: 'none'
      })
  }
})
/* pages/robot-service/robot-service.wxss */

.f-row {
  display: flex;
  flex-direction: row;
}

.main {
  width: 100%;
  height: 50%;
}

.scroll_view, .scroll_view_change {
  width: 100%;
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 75px;
}

.scroll_view_change {
  bottom: 220px;
}

.message {
  width: 92%;
  height: auto;
  padding: 10px 15px;
}

.user text {
  margin: auto auto 4px 0;
  font-size: 12px;
  color: #dcdcdc;
  display: block;
}

.avatar {
  width: 32px;
  height: 30px;
  margin: 0 10px 0 0;
  padding-top: 3px;
  border-radius: 3px;
  float: left;
}

.msg {
  display: inline-block;
  position: relative;
  padding: 5px 10px;
  max-width: calc(85% - 40px);
  font-size: 12px;
  overflow: hidden;
  text-align: left;
  word-break: break-all;
  background-color: #EDEDED;
  border-radius: 4px;
}

.msg text {
  line-height: 1.5;
}

.msg :before {
  content: " ";
  position: absolute;
  top: 9px;
  right: 100%;
  border: 6px solid transparent;
  border-right-color: #EDEDED;
}

.self {
  text-align: right;
}

.self .avatar {
  float: right;
  margin: 0 0 0 10px;
}

.self .user {
  margin: auto 2px 4px auto;
  font-size: 12px;
  color: #dcdcdc;
}

.self .msg {
  background-color: #b2e281;
}

.self .msg :before {
  right: inherit;
  left: 100%;
  border-right-color: transparent;
  border-left-color: #b2e281;
}

.room_bar {
  width: 100%;
  height: auto;
  border-top: 1px solid #CFCFCF;
  position: fixed;
  bottom: 0;
  right: 0;
  z-index: 1;
  background-color: #FFFFFF;
}

.send_btn {
  width: 40px;
  height: 30px;
  line-height: 30px;
  font-size: 14px;
  color: #000;
  padding: 0;
  margin: 4px 8px auto auto;
  background-color: #fff;
}

.room_bar form {
  width: 100%;
  height: 40px;
  padding: 0;
  display: block;
}

.news {
  width: 79%;
  height: 30px;
  border: 1px solid #CFCFCF;
  border-radius: 5px;
  font-size: 14px;
  padding-left: 4px;
  margin: 4px 2px 4px 6px;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容