微信小程序

手把手教你开发微信小程序之客服消息

2017-03-27  本文已影响22386人  码农随想录

1、客服消息功能概述


点击小程序客服消息进入的界面 小程序客服消息聊天界面 小程序客服消息聊天界面右上角按钮点击 点击自己小程序按钮进入的界面

2、网页版客服工具

具体可参考https://mp.weixin.qq.com/debug/wxadoc/introduction/custom.html#网页版客服工具

3、客服消息功能具体实现


登录https://mp.weixin.qq.com

点击设置
消息推送配置
消息推送配置

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:


参数详解
/**
 *  检验signature对请求进行校验
 */
function checkSignature(params){
    //token 就是自己填写的令牌
    var key=[token, params.timestamp, params.nonce].sort().join('');
    //将token (自己设置的) 、timestamp(时间戳)、nonce(随机数)三个参数进行字典排序
    var sha1 = crypto.createHash('sha1');
    //将上面三个字符串拼接成一个字符串再进行sha1加密
    sha1.update(key);

    return sha1.digest('hex') === params.signature;
    //将加密后的字符串与signature进行对比,若成功,返回echostr
}

客服会话按钮,用于在页面上显示一个客服会话按钮,用户点击该按钮后会进入客服会话。


屏幕快照 2017-03-27 下午4.45.51.png
<!--index.wxml-->
<view class="container">
  <view bindtap="bindViewTap" class="userinfo">
    <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
    <text class="userinfo-nickname">{{userInfo.nickName}}</text>
  </view>
  <view class="user motto">
     <contact-button type="default-light" size="30" session-from="weapp" class="guest-button">
    </contact-button>
  </view>
</view>
default-light
default-dark

用户在小程序“客服会话按钮”进入客服会话时将产生如下数据包:
{
"ToUserName": "toUser",
"FromUserName": "fromUser",
"CreateTime": 1482048670,
"MsgType": "event",
"Event": "user_enter_tempsession",
"SessionFrom": "sessionFrom"
}


参数说明

用户在客服会话中发送文本消息时将产生如下数据包:
{
"ToUserName": "toUser",
"FromUserName": "fromUser",
"CreateTime": 1482048670,
"MsgType": "text",
"Content": "this is a test",
"MsgId": 1234567890123456
}


参数说明

用户在客服会话中发送图片消息时将产生如下数据包:
{
"ToUserName": "toUser",
"FromUserName": "fromUser",
"CreateTime": 1482048670,
"MsgType": "image",
"PicUrl": "this is a url",
"MediaId": "media_id",
"MsgId": 1234567890123456
}


参数说明

用户在小程序“客服会话按钮”进入客服会话时将产生如下数据包:
{
"ToUserName": "toUser",
"FromUserName": "fromUser",
"CreateTime": 1482048670,
"MsgType": "event",
"Event": "kf_create_session",
"KfAccount": "kf2001@gh_93228be5b792"
}

参数说明

请参考手把手教你开发微信小程序之模版消息中获取 access_token

当用户和小程序客服产生特定动作的交互时(具体动作列表请见下方说明),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过POST一个JSON数据包来发送消息给普通用户。此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务。

目前允许的动作列表如下,不同动作触发后,允许的客服接口下发消息条数和下发时限不同。下发条数达到上限后,会收到错误返回码,具体请见返回码说明页:


屏幕快照 2017-03-27 下午5.42.15.png
{
    "touser":"OPENID",
    "msgtype":"text",
    "text":
    {
         "content":"Hello World"
    }
}

发送图片消息

{
    "touser":"OPENID",
    "msgtype":"image",
    "image":
    {
      "media_id":"MEDIA_ID"
    }
}

参数说明


参数说明

返回码说明


返回码说明
<!-- ih_request.js -->
const request = require('request');
var ih_request = {};
module.exports = ih_request;
ih_request.get = async function(option){
    var res = await req({
        url: option.url,
        method: 'get'
    });
    res.result?option.success(res.msg):option.error(res.msg);
}
<!-- wx_sendMessage.js -->
var router = require('koa-router')();
const request = require('../script/ih_request');
router.post('/', async function (ctx, next) {
    //这个access_token需要自己维护
    var access_token = 'gOyUImFWLoCWKZfssu9ompMQ7a4UR2npNx4ziHHMMzxjuQzD_XdCQu1UJwcxBQCbUl6owBdRqXk-QjagYzyA5Fb8bgCKuCkO63nKSPwy2ESSYwLoo1bInlg4UMOi2ToGLENaABAATC';
    var body = 'success';
    console.log(ctx.request.body);
    if (ctx.request.body.isCheck){
        var checkResult = checkSignature({
            'signature' : ctx.request.body.signature,
            'timestamp' : ctx.request.body.timestamp,
            'nonce' : ctx.request.body.nonce
        });
        body = checkResult?ctx.request.body.echostr :'err signature';
    }else {
        var data = JSON.parse(ctx.request.body.data);
        switch (data.MsgType){
            case 'text': {//用户在客服会话中发送文本消息
                await sendTextMessage("我知道了", data, access_token);
                break;
            }
            case 'image': { //用户在客服会话中发送图片消息
                await sendImageMessage(data.MediaId, data, access_token);
                break;
            }
            case 'event': {
                console.log('event');
                var content = '';
                if (data.Event == 'user_enter_tempsession'){  //用户在小程序“客服会话按钮”进入客服会话,在聊天框进入不会有此事件
                    await sendTextMessage("您有什么问题吗?", data, access_token);
                }else if (data.Event == 'kf_create_session'){ //网页客服进入回话
                   console.log('网页客服进入回话');
                }
                break;
            }
        }
    }
    console.log('end');
    ctx.body = body;
});

async function sendTextMessage(content, data, access_token){
    await request.postJson({
        url: 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='+access_token,
        body: {
            touser:data.FromUserName,
            msgtype:"text",
            text:
            {
                content:content
            }
        },
        success: function(res){
            console.log(res);
        },
        error: function(err){
            console.log(err);
        }
    });
}

async function sendImageMessage(media_id, data, access_token){
    await request.postJson({
        url: 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='+access_token,
        body: {
            touser:data.FromUserName,
            msgtype:"image",
            image:
            {
                media_id:media_id
            }
        },
        success: function(res){
            console.log(res);
        },
        error: function(err){
            console.log(err);
        }
    });
}

4、最后


如何大家看了文章还有不懂或者其他问题,欢迎私信我或者评论

上一篇下一篇

猜你喜欢

热点阅读