当前位置:首页 > PHP教程 > php高级应用 > 列表

如何使用微信公众平台开发模式实现多客服

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-04 00:17:16 浏览: 评论:0 

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

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

一、回复多客服消息

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

返回的消息举例如下:

  1. <xml> 
  2.   <ToUserName><![CDATA[touser]]></ToUserName> 
  3.   <FromUserName><![CDATA[fromuser]]></FromUserName> 
  4.   <CreateTime>1399197672</CreateTime> 
  5.   <MsgType><![CDATA[transfer_customer_service]]></MsgType> 
  6. </xml> 

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

  1.    //回复多客服消息 
  2.   private function transmitService($object) 
  3.   { 
  4.     $xmlTpl = "<xml> 
  5. <ToUserName><![CDATA[%s]]></ToUserName> 
  6. <FromUserName><![CDATA[%s]]></FromUserName> 
  7. <CreateTime>%s</CreateTime> 
  8. <MsgType><![CDATA[transfer_customer_service]]></MsgType> 
  9. </xml>"; 
  10.     $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time()); 
  11.     return $result; 
  12.   } 

二、触发多客服会话

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

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

实现代码如下:

  1. //接收文本消息 
  2.  private function receiveText($object) 
  3.  { 
  4.    $keyword = trim($object->Content); 
  5.    if (strstr($keyword, "投诉") || strstr($keyword, "你好") || strstr($keyword, "在吗")){ 
  6.      $result = $this->transmitService($object); 
  7.    } 
  8.    return $result; 
  9.  } 

三、完整代码

  1. <?php 
  2. /* 
  3.   方倍工作室 
  4.   CopyRight 2014 All Rights Reserved 
  5. */ 
  6. define("TOKEN", "weixin"); 
  7. $wechatObj = new wechatCallbackapiTest(); 
  8. if (!isset($_GET['echostr'])) { 
  9.   $wechatObj->responseMsg(); 
  10. }else{ 
  11.   $wechatObj->valid(); 
  12. } 
  13. class wechatCallbackapiTest 
  14. { 
  15.   //验证消息 
  16.   public function valid() 
  17.   { 
  18.     $echoStr = $_GET["echostr"]; 
  19.     if($this->checkSignature()){ 
  20.       echo $echoStr; 
  21.       exit; 
  22.     } 
  23.   } 
  24.   //检查签名 
  25.   private function checkSignature() 
  26.   { 
  27.     $signature = $_GET["signature"]; 
  28.     $timestamp = $_GET["timestamp"]; 
  29.     $nonce = $_GET["nonce"]; 
  30.     $token = TOKEN; 
  31.     $tmpArr = array($token, $timestamp, $nonce); 
  32.     sort($tmpArr, SORT_STRING); 
  33.     $tmpStr = implode($tmpArr); 
  34.     $tmpStr = sha1($tmpStr); 
  35.     if($tmpStr == $signature){ 
  36.       return true; 
  37.     }else{ 
  38.       return false; 
  39.     } 
  40.   } 
  41.   //响应消息 
  42.   public function responseMsg() 
  43.   { 
  44.     $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
  45.     if (!emptyempty($postStr)){ 
  46.       $this->logger("R ".$postStr); 
  47.       $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 
  48.       $RX_TYPE = trim($postObj->MsgType); 
  49.       switch ($RX_TYPE) 
  50.       { 
  51.         case "event": 
  52.           $result = $this->receiveEvent($postObj); 
  53.           break; 
  54.         case "text": 
  55.           $result = $this->receiveText($postObj); 
  56.           break; 
  57.       } 
  58.       $this->logger("T ".$result); 
  59.       echo $result; 
  60.     }else { 
  61.       echo ""; 
  62.       exit; 
  63.     } 
  64.   } 
  65.   //接收事件消息 
  66.   private function receiveEvent($object) 
  67.   { 
  68.     switch ($object->Event) 
  69.     { 
  70.       case "subscribe": 
  71.         $content[] = array("Title" =>"欢迎关注方倍工作室", "Description" =>"使用方法:\n1.发送快递单号,例如6367532560,可查询快递详情", "PicUrl" =>"http://www.3856.cc/weixin/weixin/logo.jpg", "Url" =>""); 
  72.         break; 
  73.       default: 
  74.         $content = "receive a new event: ".$object->Event; 
  75.         break; 
  76.     } 
  77.     if(is_array($content)){ 
  78.       if (isset($content[0])){ 
  79.         $result = $this->transmitNews($object, $content); 
  80.       }else if (isset($content['MusicUrl'])){ 
  81.         $result = $this->transmitMusic($object, $content); 
  82.       } 
  83.     }else{ 
  84.       $result = $this->transmitText($object, $content); 
  85.     } 
  86.     return $result; 
  87.   } 
  88.   //接收文本消息 
  89.   private function receiveText($object) 
  90.   { 
  91.     $keyword = trim($object->Content); 
  92.     if($keyword == "时间" || $keyword == "测试"){ 
  93.       $content = date("Y-m-d H:i:s",time()); 
  94.       $result = $this->transmitText($object, $content); 
  95.     } 
  96.     //触发多客服模式 
  97.     else if (strstr($keyword, "您好") || strstr($keyword, "你好") || strstr($keyword, "在吗") || strstr($keyword, "有人吗")){ 
  98.       $result = $this->transmitService($object); 
  99.       return $result; 
  100.     } 
  101.     return $result; 
  102.   } 
  103.   private function transmitText($object, $content) 
  104.   { 
  105.     $textTpl = "<xml> 
  106. <ToUserName><![CDATA[%s]]></ToUserName> 
  107. <FromUserName><![CDATA[%s]]></FromUserName> 
  108. <CreateTime>%s</CreateTime> 
  109. <MsgType><![CDATA[text]]></MsgType> 
  110. <Content><![CDATA[%s]]></Content> 
  111. </xml>"; 
  112.     $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content); 
  113.     return $result; 
  114.   } 
  115.   private function transmitNews($object, $newsArray) 
  116.   { 
  117.     if(!is_array($newsArray)){ 
  118.       return; 
  119.     } 
  120.     $itemTpl = "  <item> 
  121.     <Title><![CDATA[%s]]></Title> 
  122.     <Description><![CDATA[%s]]></Description> 
  123.     <PicUrl><![CDATA[%s]]></PicUrl> 
  124.     <Url><![CDATA[%s]]></Url> 
  125.   </item> 
  126. "; 
  127.     $item_str = ""; 
  128.     foreach ($newsArray as $item){ 
  129.       $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']); 
  130.     } 
  131.     $newsTpl = "<xml> 
  132. <ToUserName><![CDATA[%s]]></ToUserName> 
  133. <FromUserName><![CDATA[%s]]></FromUserName> 
  134. <CreateTime>%s</CreateTime> 
  135. <MsgType><![CDATA[news]]></MsgType> 
  136. <Content><![CDATA[]]></Content> 
  137. <ArticleCount>%s</ArticleCount> 
  138. <Articles> 
  139. $item_str</Articles> 
  140. </xml>"; 
  141.     $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray)); 
  142.     return $result; 
  143.   } 
  144.   private function transmitMusic($object, $musicArray) 
  145.   { 
  146.     $itemTpl = "<Music> 
  147.   <Title><![CDATA[%s]]></Title> 
  148.   <Description><![CDATA[%s]]></Description> 
  149.   <MusicUrl><![CDATA[%s]]></MusicUrl> 
  150.   <HQMusicUrl><![CDATA[%s]]></HQMusicUrl> 
  151. </Music>"; 
  152.     $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']); 
  153.     $textTpl = "<xml> 
  154. <ToUserName><![CDATA[%s]]></ToUserName> 
  155. <FromUserName><![CDATA[%s]]></FromUserName> 
  156. <CreateTime>%s</CreateTime> 
  157. <MsgType><![CDATA[music]]></MsgType> 
  158. $item_str 
  159. </xml>"; 
  160.     $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time()); 
  161.     return $result; 
  162.   } 
  163.   //回复多客服消息 
  164.   private function transmitService($object) 
  165.   { 
  166.     $xmlTpl = "<xml> 
  167. <ToUserName><![CDATA[%s]]></ToUserName> 
  168. <FromUserName><![CDATA[%s]]></FromUserName> 
  169. <CreateTime>%s</CreateTime> 
  170. <MsgType><![CDATA[transfer_customer_service]]></MsgType> 
  171. </xml>"; 
  172.     $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time()); 
  173.     return $result; 
  174.   } 
  175.   private function logger($log_content) 
  176.   { 
  177.     if(isset($_SERVER['HTTP_APPNAME'])){  //SAE 
  178.       sae_set_display_errors(false); 
  179.       sae_debug($log_content); 
  180.       sae_set_display_errors(true); 
  181.     }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL 
  182.       $max_size = 10000; 
  183.       $log_filename = "log.xml"; 
  184.       if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);} 
  185.       file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND); 
  186.     } 
  187.   } 
  188. } 
  189. ?> 

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

Tags: 微信公众平台开发模式

分享到: