如何使用微信公眾平台開發模式實現多客服_php執行個體

來源:互聯網
上載者:User
其實公眾平台的多客服功能已經出來好久了,並且一出來的時候我就已經為自己的公眾號實現了,原本以為大家都已經會了,但是今天還是有人問起這個多客服功能怎麼使用,我找了下網上也沒什麼好的教程,今天我就給大家發一篇比較簡單易懂的教程吧!

在這篇公眾平台開發教程中,我們將介紹如何使用開發模式實現多客服系統。

一、回複多客服訊息

在新的協議中,開發模式也可以接入客服系統。 開發人員如果需要讓使用者使用客服系統,需要在接收到使用者發送的訊息時,返回一個MsgType為transfer_customer_service的訊息,伺服器在收到這條訊息時,會把使用者這次發送的和以後一段時間內發送的訊息轉寄客服系統。

返回的訊息舉例如下

  touser  fromuser  1399197672  transfer_customer_service 

該訊息的實現如下(以方倍工作室的公眾平台PHP SDK為基礎)

   //回複多客服訊息  private function transmitService($object)  {    $xmlTpl = "%s%s%stransfer_customer_service";    $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 = "%s%s%stext%s";    $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);    return $result;  }  private function transmitNews($object, $newsArray)  {    if(!is_array($newsArray)){      return;    }    $itemTpl = "      <![CDATA[%s]]>    %s    %s    %s  ";    $item_str = "";    foreach ($newsArray as $item){      $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);    }    $newsTpl = "%s%s%snews%s$item_str";    $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));    return $result;  }  private function transmitMusic($object, $musicArray)  {    $itemTpl = "  <![CDATA[%s]]>  %s  %s  %s";    $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);    $textTpl = "%s%s%smusic$item_str";    $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());    return $result;  }  //回複多客服訊息  private function transmitService($object)  {    $xmlTpl = "%s%s%stransfer_customer_service";    $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);    }  }}?> 

本段代碼經過測試,在自訂菜單中返回多客服訊息,無法讓使用者進入多客服狀態,使用多客服訊息後,後續所有訊息在一段時間內都將作為客服訊息轉寄,原來的開發模式下的自動回複都將失效。

本文寫的不好,還望海涵,有好的意見歡迎分享,大家共同學習進步。同時,感謝大家一直以來對指令碼之家網站的支援。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.