完整程式碼地址: 微信公眾號開發之客服訊息
一、接入微信公眾號平臺
-
從後臺得到
appID
、appsecret
, 以及自己填寫的token
-
通過微信伺服器的驗證
開發者提交資訊後,微信伺服器將傳送
GET
請求到填寫的伺服器地址URL
上,會攜帶引數signature
、timestamp
、nonce
、echostr
根據開發文件給的校驗方式, 校驗是否由微信伺服器傳送的請求,確認之後傳送
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 協議》,轉載必須註明作者和本文連結