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

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

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

分享到: