微信公眾號開發之客服訊息

Zhengkx發表於2019-10-30

完整程式碼地址: 微信公眾號開發之客服訊息

一、接入微信公眾號平臺

  • 從後臺得到 appIDappsecret, 以及自己填寫的 token

  • 通過微信伺服器的驗證

    開發者提交資訊後,微信伺服器將傳送 GET 請求到填寫的伺服器地址 URL 上,會攜帶引數 signaturetimestampnonceechostr

    根據開發文件給的校驗方式, 校驗是否由微信伺服器傳送的請求,確認之後傳送 echostr 引數,則接入成功,程式碼如下:

    <?php
    
    $wechat = new wechatCallBack();
    
    if (isset($_GET['echostr'])) {
      $wechat->checkSignature();
    }
    
    class wechatCallBack
    {
      public $appid  = 'wx35*****48137';
      public $sercet = 'dd227*******aefaf4';
      public $token  = 'token';
    
      /**
       * 檢驗簽名
       */
      public function checkSignature()
      {
          // 獲得引數 signature nonce token timestamp echostr
          $nonce     = $_GET['nonce'];
          $timestamp = $_GET['timestamp'];
          $echostr   = $_GET['echostr'];
          $signature = $_GET['signature'];
    
          $array = array();
    
          $array = array($nonce, $timestamp, $this->token);
    
          sort($array);
    
          $str = sha1(implode($array));
    
          if ($str == $signature) {
              echo  $echostr;
    
              exit;
          }
      }
    }

二、獲取 access_token

access_token 是公眾號的全域性唯一介面呼叫憑據,公眾號呼叫各介面時都需使用 access_token 。開發者需要進行妥善儲存。access_token 的儲存至少要保留512個字元空間。access_token 的有效期目前為2個小時,需定時重新整理,重複獲取將導致上次獲取的 access_token 失效。

程式碼如下:

public function getAccessToken()
{
    if (isset($_SESSION['access_token']) && time() < $_SESSION['expires_time']) {
        return $_SESSION['access_token'];
    } else {
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appid&secret=$this->sercet";

        $res = $this->getHttp($url);

        $resArr = json_decode($res, true);

        if (isset($resArr['access_token'])) {
            $_SESSION['access_token'] = $resArr['access_token'];
            $_SESSION['expires_time'] = time() + $resArr['expires_in'];

            return $resArr['access_token'];
        }
    }
}

三、對接客服訊息

有了上面的 access_token ,接下來就可以對接 客服訊息

當使用者和公眾號產生特定動作的互動時,微信將會把訊息資料推送給開發者,開發者可以在一段時間內(目前修改為48小時)呼叫客服介面,通過 POST 一個 JSON 資料包來傳送訊息給普通使用者。此介面主要用於客服等有人工訊息處理環節的功能,方便開發者為使用者提供更加優質的服務。

1. 客服帳號管理

新增客服帳號

修改客服帳號

刪除客服賬號

設定客服賬號的頭像

獲取所有客服賬號

以上介面,可能測試號沒有許可權操作,一直返回以下程式碼:

{"errcode":65400,"errmsg":"please enable new custom service, or wait for a while if you have enabled hint: [g7c2tA05131503]"}

查了好久,沒有找到為什麼,那就歸到官方不開放吧,等以後搞到個認證過的公眾號再來補充了。

2. 客服傳送介面

<?php
    /**
     * 傳送客服訊息
     */
    public function sendCustomerMsg($obj)
    {
        $accessToken = $this->getAccessToken();

        $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=$accessToken";

        // 不指定某個客服回覆
        $postData = array(
            'touser'  => "$obj->FromUserName",
            'msgtype' => 'text',
            'text'    => array (
                'content' => 'Hello a',
            )
        );

        // 指定某個客服回覆
        // $postData = array(
        //     'touser'  => "$obj->FromUserName",
        //     'msgtype' => 'text',
        //     'customservice' => array(
        //         "kf_account" => "test1@kftest"
        //     ),
        //     'text'    => array(
        //         'content' => 'Hello a',
        //     )
        // );

        $res = $this->postHttp($url, json_encode($postData));

        $resArr = json_decode($res, true);

        if (isset($resArr['errcode']) && $resArr['errcode'] == 0) {
            $this->logger("\r\n" . '傳送成功');

            return true;
        }

        $this->logger("\r\n" . $res);
    }

我這邊是由一個自定義選單 線上客服 按鈕觸發客服介面,你也可以自己設定其他事件來觸發,具體如下

1、使用者傳送資訊
2、點選自定義選單(僅有點選推事件、掃碼推事件、掃碼推事件且彈出“訊息接收中”提示框這3種選單型別是會觸發客服介面的)
3、關注公眾號
4、掃描二維碼
5、支付成功
6、使用者維權

3. 將訊息轉發到客服

如果公眾號處於開發模式,普通微信使用者向公眾號發訊息時,微信伺服器會先將訊息POST到開發者填寫的url上,如果希望將訊息轉發到客服系統,則需要開發者在響應包中返回MsgType為transfer_customer_service的訊息,微信伺服器收到響應後會把當次傳送的訊息轉發至客服系統。

/**
 * 將訊息轉發到客服
 *
 * @return void
 *
 * @author zhengkexin
 *
 * @created 2019-04-19 17:02:49
 */
public function forwardCustomerService($obj)
{
    // 不指定轉發
    $tmpXml = '<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[transfer_customer_service]]></MsgType>
            </xml>';

    // 指定轉發到某客服
    $tmpXml1 = '<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[transfer_customer_service]]></MsgType>
                <TransInfo>
                    <KfAccount><![CDATA[test1@test]]></KfAccount>
                </TransInfo>
            </xml>';

    $resultXml = sprintf($tmpXml, $obj->FromUserName, $obj->ToUserName, time());

    echo $resultXml;
}

四、注意

網上很多教程都是用 $GLOBALS["HTTP_RAW_POST_DATA"] 來接收微信伺服器發來的訊息,但可能有一些人說沒有接收到資訊。

www.php.net 裡關於這個預定義變數,有一個提醒

Warning This feature was DEPRECATED in PHP 5.6.0, and REMOVED as of PHP 7.0.0.

此功能在PHP 5.6.0中已棄用,從PHP 7.0.0開始已刪除。

所以他給出的是使用 php://input 來代替

望對你們有用,有什麼不對也歡迎大家向我反饋,請多指教

本作品採用《CC 協議》,轉載必須註明作者和本文連結

好好管教自己,不要管別人

相關文章