在这篇微信公众平台开发教程中,我们将介绍如何使用开发模式实现多客服系统。

本文分为以下三个部分:

回复多客服消息

触发多客服会话

其他说明

一、回复多客服消息

在新的微信协议中,开发模式也可以接入客服系统。 开发者如果需要让用户使用客服系统,需要在接收到用户发送的消息时,返回一个MsgType为transfer_customer_service的消息,微信服务器在收到这条消息时,会把用户这次发送的和以后一段时间内发送的消息转发客服系统。

返回的消息举例如下

1399197672

该消息的实现如下//回复多客服消息

private function transmitService($object)

{

$xmlTpl = "

%s

";

$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());

return $result;

}

二、触发多客服会话

一般情况下,用户想要咨询问题是,经常会问“你好”,“在吗”,这样的问题。

我们以这些词为触发关键词,当用户发送的文本消息内容中包含这些词的时候,就返回多客服消息给用户(用户在微信端感觉不到任何内容,但微信公众账号会将用户本次及以后一段时间的消息都转发到客服)。

实现代码如下://接收文本消息

private function receiveText($object)

{

$keyword = trim($object->Content);

if (strstr($keyword, "投诉") || strstr($keyword, "你好") || strstr($keyword, "在吗")){

$result = $this->transmitService($object);

}

return $result;

}

三、完整代码<?php

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();

if (!isset($_GET['echostr'])) {

$wechatObj->responseMsg();

}else{

$wechatObj->valid();

}

class wechatCallbackapiTest

{

//验证消息

public function valid()

{

$echoStr = $_GET["echostr"];

if($this->checkSignature()){

echo $echoStr;

exit;

}

}

//检查签名

private function checkSignature()

{

$signature = $_GET["signature"];

$timestamp = $_GET["timestamp"];

$nonce = $_GET["nonce"];

$token = TOKEN;

$tmpArr = array($token, $timestamp, $nonce);

sort($tmpArr, SORT_STRING);

$tmpStr = implode($tmpArr);

$tmpStr = sha1($tmpStr);

if($tmpStr == $signature){

return true;

}else{

return false;

}

}

//响应消息

public function responseMsg()

{

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

if (!empty($postStr)){

$this->logger("R ".$postStr);

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

$RX_TYPE = trim($postObj->MsgType);

switch ($RX_TYPE)

{

case "event":

$result = $this->receiveEvent($postObj);

break;

case "text":

$result = $this->receiveText($postObj);

break;

}

$this->logger("T ".$result);

echo $result;

}else {

echo "";

exit;

}

}

//接收事件消息

private function receiveEvent($object)

{

switch ($object->Event)

{

case "subscribe":

$content[] = array("Title" =>"欢迎关注方倍工作室", "Description" =>"使用方法:\n1.发送快递单号,例如6367532560,可查询快递详情", "PicUrl" =>"http://www.3856.cc/weixin/weixin/logo.jpg", "Url" =>"");

break;

default:

$content = "receive a new event: ".$object->Event;

break;

}

if(is_array($content)){

if (isset($content[0])){

$result = $this->transmitNews($object, $content);

}else if (isset($content['MusicUrl'])){

$result = $this->transmitMusic($object, $content);

}

}else{

$result = $this->transmitText($object, $content);

}

return $result;

}

//接收文本消息

private function receiveText($object)

{

$keyword = trim($object->Content);

if($keyword == "时间" || $keyword == "测试"){

$content = date("Y-m-d H:i:s",time());

$result = $this->transmitText($object, $content);

}

//触发多客服模式

else if (strstr($keyword, "您好") || strstr($keyword, "你好") || strstr($keyword, "在吗") || strstr($keyword, "有人吗")){

$result = $this->transmitService($object);

return $result;

}

return $result;

}

private function transmitText($object, $content)

{

$textTpl = "

%s

";

$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);

return $result;

}

private function transmitNews($object, $newsArray)

{

if(!is_array($newsArray)){

return;

}

$itemTpl = "

";

$item_str = "";

foreach ($newsArray as $item){

$item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);

}

$newsTpl = "

%s

%s

$item_str

";

$result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));

return $result;

}

private function transmitMusic($object, $musicArray)

{

$itemTpl = "

";

$item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);

$textTpl = "

%s

$item_str

";

$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());

return $result;

}

//回复多客服消息

private function transmitService($object)

{

$xmlTpl = "

%s

";

$result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());

return $result;

}

private function logger($log_content)

{

if(isset($_SERVER['HTTP_APPNAME'])){ //SAE

sae_set_display_errors(false);

sae_debug($log_content);

sae_set_display_errors(true);

}else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL

$max_size = 10000;

$log_filename = "log.xml";

if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}

file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);

}

}

}

?>

四、其他注意事项

1. 经测试,在自定义菜单中返回多客服消息,无法让用户进入多客服状态。

2. 使用多客服消息后,后续所有消息在一段时间内都将作为客服消息转发,原来的开发模式下的自动回复都将失效!!!

更多微信公众平台开发 多客服相关文章请关注PHP中文网!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php 微信公众号客服,微信公众平台开发 多客服相关推荐

  1. 微信公众平台开发(73) 客服接口发送客服消息

    微信公众平台开发(73) 客服接口发送客服消息 原文:微信公众平台开发(73) 客服接口发送客服消息 微信公众平台开发 客服接口 发送客服消息 作者:方倍工作室  地址:http://www.cnbl ...

  2. 请签收裂变指南—公众号联动企业微信双向获客

    大家好,我是Linkflow增长黑客.最近很多客户都问,如何利用裂变海报功能进行公众号和企业微信双重裂变,既能带来公众号粉丝,又能沉淀企业微信好友.今天我就给大家拆解整套裂变玩法,如何通过Linkfl ...

  3. 选择Confluence,而不是有道云笔记、微信公众号、Git、Markdown、CSDN博客、记事本

    雷哥喜欢把事情.知识.任务,管理得紧紧有条,不喜欢乱糟糟的. 经常总结个人的经验教训,日常工作. 怎么很好地管理自己的知识,一直是个大难题. 现状如下: 浏览器收藏夹 用QQ浏览器,收藏有价值的网站. ...

  4. 微信公众号之接入微信公众号服务器开发(一)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一丶概述 公众号与公众平台 1. 微信账号类型 个人号 公众号 订阅号 服务号 企业号 2. 公众号 微信公众号主要面向名人.政府 ...

  5. 【分享】微信公众号在 “集简云平台“ 集成应用的常见问题与解决方案

    "function category of API need be confirmed by component rid"错误 是由于使用未认证的微信公众号或者个人微信公众号没有此 ...

  6. 微信公众号如何接入微信机器人

    微信对话开放平台文档 官方文档 平台简介 微信对话开放平台开放了微信在对话领域积累多年的的智能对话技术,开发者及非开发者可简单.快速地搭建智能对话机器人(智能客服), 并接入公众号.小程序等,为业务赋 ...

  7. 微信第三方平台公众号授权流程1—第三方平台概述概述

    一.概述 公众平台第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可以同时授权给多家第三方),通过第三方平台来完成业务,开放给所有通过开发者资质认证后的开发 ...

  8. 微信公众号支付java前后端分离开发

    微信公众号支付java前后端分离开发 微信公众号支付java前后端分离开发 我们开发的是基于河北银行的支付,支付宝微信都做了,这里就介绍一下微信公众号支付,这个公众号支付需要配置的东西太多了,官方文档 ...

  9. 微信公众号网页调用微信扫一扫功能

    目录 前言: 准备条件: 用到的微信接口 代码: 效果: 总结: 前言: 最近其他项目组需要在微信公众号里面调用微信的扫一扫功能,于是就帮忙一起搞了搞,一开始以为挺简单,从网上搜一下教程弄一下就可以了 ...

最新文章

  1. 新冠肺炎疫情把科研推上“云端”
  2. LINUX检测服务并自动运行,一种Linux下的开机自动检测硬件信息的方法与流程
  3. 成功解决AttributeError: ‘Series‘ object has no attribute ‘name’
  4. pta段错误怎么办_雅思50问 | 07:雅思写作时间不够怎么办?写不完会给分吗?...
  5. mysql 百度地图插件_GitHub - huizhong/grafana-baidumap-panel: Grafana 百度地图插件
  6. cocos2d-x3.0 相对布局(一)
  7. 模拟登录新浪微博(Python)
  8. linux下LAMP环境的搭配
  9. 深度学习斯坦福cs231n 课程笔记
  10. BMP测试图片及显示源码
  11. 爬虫碰到状态码412的解决办法
  12. 金杉号:2022什么工作最赚钱,未来十年最吃香的4个稳定的工作
  13. 20172303 2017-2018-2 《程序设计与数据结构》第10周学习总结
  14. Kotlin 启用新 Logo,似乎更有寓意?
  15. linux查看jdk版本_linux环境查看jdk版本
  16. vivo X Note暗藏黑科技,三麦降噪让开黑更安心
  17. 【Joy of Cryptography 读书笔记】Chapter 6 伪随机函数(Pseudorandom Function)分组密码(Block Cipher)
  18. ubuntu 1604 修改mac地址
  19. 车辆底盘自动集中润滑系统的研究分析
  20. 读书笔记 --《算法图解》

热门文章

  1. android+代码调用+相册+小米,Android调用系统相册选择图片,支持小米4云相册
  2. Counterfactual 项目:广义的以太坊状态通道
  3. python批量修改图片名
  4. 面试程序员被问“你的缺点是什么”,我该怎么回答?
  5. android 系统儿童锁,儿童锁-家长助手
  6. 微机原理8253计数初值计算
  7. 狂神JUC——CAS
  8. 有道云笔记Markdown编辑器 基础操作使用说明
  9. 【LVGL(6)】显示中文设置,制作中文字库
  10. android 调出键盘表情_android 表情,软键盘冲突解决方案(仿微博等SNS应用)