php 微信公众平台开发模式实现多客服的实例代码


Posted in PHP onNovember 07, 2016

其实微信公众平台的多客服功能已经出来好久了,并且一出来的时候我就已经为自己的公众号实现了,原本以为大家都已经会了,但是今天还是有人问起这个多客服功能怎么使用,我找了下网上也没什么好的教程,今天我就给大家发一篇比较简单易懂的教程吧

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

一、回复多客服消息

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

返回的消息举例如下

<xml>
 <ToUserName><![CDATA[touser]]></ToUserName>
 <FromUserName><![CDATA[fromuser]]></FromUserName>
 <CreateTime>1399197672</CreateTime>
 <MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>

该消息的实现如下(以方倍工作室的微信公众平台PHP SDK为基础)

//回复多客服消息
 private function transmitService($object)
 {
  $xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>";
  $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
/*
 方倍工作室
 CopyRight 2014 All Rights Reserved
*/
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 = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
  $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
  return $result;
 }
 private function transmitNews($object, $newsArray)
 {
  if(!is_array($newsArray)){
   return;
  }
  $itemTpl = " <item>
  <Title><![CDATA[%s]]></Title>
  <Description><![CDATA[%s]]></Description>
  <PicUrl><![CDATA[%s]]></PicUrl>
  <Url><![CDATA[%s]]></Url>
 </item>
";
  $item_str = "";
  foreach ($newsArray as $item){
   $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
  }
  $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";
  $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
  return $result;
 }
 private function transmitMusic($object, $musicArray)
 {
  $itemTpl = "<Music>
 <Title><![CDATA[%s]]></Title>
 <Description><![CDATA[%s]]></Description>
 <MusicUrl><![CDATA[%s]]></MusicUrl>
 <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";
  $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);
  $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";
  $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
  return $result;
 }
 //回复多客服消息
 private function transmitService($object)
 {
  $xmlTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>";
  $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);
  }
 }
}
?>

本段代码经过测试,在自定义菜单中返回多客服消息,无法让用户进入多客服状态,使用多客服消息后,后续所有消息在一段时间内都将作为客服消息转发,原来的开发模式下的自动回复都将失效。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
PHP4之COOKIE支持详解
Oct 09 PHP
php中几种常见安全设置详解
Apr 06 PHP
破解图片防盗链的代码(asp/php)测试通过
Jul 02 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
Mar 18 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
Dec 19 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
Laravel关系模型指定条件查询方法
Oct 10 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
Oct 21 PHP
详解Go与PHP的语法对比
May 29 PHP
深入了解PHP中的Array数组和foreach
Nov 06 #PHP
PHP运行模式汇总
Nov 06 #PHP
PHP数组的定义、初始化和数组元素的显示实现代码
Nov 05 #PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
Nov 05 #PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
Nov 05 #PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
Nov 05 #PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 #PHP
You might like
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
PHP文件操作实现代码分享
2011/09/01 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
destoon复制新模块的方法
2014/06/21 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
php格式文件打开的四种方法
2018/02/24 PHP
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
Python 字符串中的字符倒转
2008/09/06 Python
Python开发的HTTP库requests详解
2017/08/29 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
python使用matplotlib绘制热图
2018/11/07 Python
python 输出所有大小写字母的方法
2019/01/02 Python
python获取交互式ssh shell的方法
2019/02/14 Python
Python八皇后问题解答过程详解
2019/07/29 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Django REST 异常处理详解
2020/07/15 Python
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
毕业生求职简历中的自我评价
2013/10/18 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
php双向队列实例讲解
2021/11/17 PHP