服務端
我們在入門小教程一節(jié)中以服務端為例講解了一個基本的消息的處理,這里就不再講服務器驗證的流程了,請直接參考前面的入門實例即可。
服務端的作用,在整個微信開發(fā)中主要是負責 接收用戶發(fā)送過來的消息,還有 用戶觸發(fā)的一系列事件。
首先我們得理清 消息與事件的回復邏輯,當你收到用戶消息后(消息由微信服務器推送到你的服務器),在你對消息進行一些處理后,不管是選擇回復一個消息還是什么不都回給用戶,你也應該給微信服務器一個 “答復”,如果是選擇回復一條消息,就直接返回一個消息 xml 就好,如果選擇不做任何回復,你也得回復一個 空字符串 或者 字符串 SUCCESS(不然用戶就會看到 該公眾號暫時無法提供服務)。
基本使用
在 SDK 中使用 $officialAccount->server->push(callable $callback) 來設置消息處理器:
<?php
$server = $officialAccount->server;
/** 注冊消息事件回調(diào) */
$server->push(function (\EasySwoole\WeChat\Kernel\Contracts\MessageInterface $message) {
// $message->getType(); // 消息類型:消息類型:event、text ......
return new \EasySwoole\WeChat\Kernel\Messages\Text("您好!歡迎使用 EasySwoole WeChat!");
});
這里我們使用 push 傳入了一個 閉包(Closure),該閉包接收一個參數(shù) $message 為消息對象(類型為實現(xiàn)了 \EasySwoole\WeChat\Kernel\Contracts\MessageInterface 接口的實例對象),你可以在全局消息處理器中對消息類型進行篩選:
<?php
$server = $officialAccount->server;
$server->push(function (\EasySwoole\WeChat\Kernel\Contracts\MessageInterface $message) {
switch ($message->getType()) {
case 'event':
$text = '收到事件消息';
break;
case 'text':
$text = '收到文字消息';
break;
case 'image':
$text = '收到圖片消息';
break;
case 'voice':
$text = '收到語音消息';
break;
case 'video':
$text = '收到視頻消息';
break;
case 'location':
$text = '收到坐標消息';
break;
case 'link':
$text = '收到鏈接消息';
break;
case 'file':
$text = '收到文件消息';
break;
// ... 其它消息
default:
$text = '收到其它消息';
break;
}
// ...
return new \EasySwoole\WeChat\Kernel\Messages\Text($text);
});
當然,因為這里 push 接收一個 callable 的參數(shù),所以你不一定要傳入一個 Closure 閉包,你可以選擇傳入一個函數(shù)名,一個 [$class, $method] 或者 Foo::bar 這樣的類型。
注冊多個消息處理器
有時候你可能需要對消息記日志,或者一系列的自定義操作,你可以注冊多個 handler:
<?php
$server = $officialAccount->server;
$server->push(MessageLogHandler::class);
$server->push(MessageReplyHandler::class);
$server->push(OtherHandler::class);
$server->push(...);
注意:
- 最后一個非空返回值將作為最終應答給用戶的消息內(nèi)容,如果中間某一個
handler返回值false, 則將終止整個調(diào)用鏈,不會調(diào)用后續(xù)的handlers。 - 傳入的自定義
Handler類需要實現(xiàn)\EasySwoole\WeChat\Kernel\Contracts\EventHandlerInterface接口。
注冊指定消息類型的消息處理器
我們想對特定類型的消息應用不同的處理器,可以在第二個參數(shù)傳入類型篩選:
注意,第二個參數(shù)必須是
\EasySwoole\WeChat\Kernel\Messages\Message類的常量。
<?php
use EasySwoole\WeChat\Kernel\Messages\Message;
$server = $officialAccount->server;
$server->push(ImageMessageHandler::class, Message::IMAGE); // 圖片消息
$server->push(TextMessageHandler::class, Message::TEXT); // 文本消息
// 同時處理多種類型的處理器
// 當消息為 三種中任意一種都可觸發(fā)
$server->push(MediaMessageHandler::class, [Message::VOICE, Message::VIDEO, Message::SHORT_VIDEO]);
請求消息的屬性
當你接收到用戶發(fā)來的消息時,可能會提取消息中的相關屬性,參考:
請求消息基本屬性 (以下所有消息都有的基本屬性):
-
ToUserName接收方帳號(該公眾號ID) -
FromUserName發(fā)送方帳號(OpenID, 代表用戶的唯一標識) -
CreateTime消息創(chuàng)建時間(時間戳) -
MsgId消息ID(64位整型)
文本:
-
MsgTypetext -
Content文本消息內(nèi)容
圖片:
-
MsgTypeimage -
MediaId圖片消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 -
PicUrl圖片鏈接
語音:
-
MsgTypevoice -
MediaId語音消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 -
Format語音格式,如amr、speex等 -
Recognition* 開通語音識別后才有
請注意,開通語音識別后,用戶每次發(fā)送語音給公眾號時,微信會在推送的語音消息
XML數(shù)據(jù)包中,增加一個Recongnition字段
視頻:
-
MsgTypevideo -
MediaId視頻消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 -
ThumbMediaId視頻消息縮略圖的媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。
小視頻:
-
MsgTypeshortvideo -
MediaId視頻消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。 -
ThumbMediaId視頻消息縮略圖的媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。
事件:
-
MsgTypeevent -
Event事件類型 (如:subscribe(訂閱)、unsubscribe(取消訂閱) ...,CLICK等)
掃描帶參數(shù)二維碼事件:
-
EventKey事件KEY值,比如:qrscene_123123,qrscene_為前綴,后面為二維碼的參數(shù)值 -
Ticket二維碼的ticket,可用來換取二維碼圖片
上報地理位置事件:
-
Latitude23.137466地理位置緯度 -
Longitude113.352425地理位置經(jīng)度 -
Precision119.385040地理位置精度
自定義菜單事件:
-
EventKey事件KEY值,與自定義菜單接口中KEY值對應,如:CUSTOM_KEY_001、www.qq.com
地理位置:
-
MsgTypelocation -
Location_X地理位置緯度 -
Location_Y地理位置經(jīng)度 -
Scale地圖縮放大小 -
Label地理位置信息
鏈接:
-
MsgTypelink -
Title消息標題 -
Description消息描述 -
Url消息鏈接
文件:
-
MsgTypefile -
Title文件名 -
Description文件描述,可能為null -
FileKey文件KEY -
FileMd5文件MD5值 -
FileTotalLen文件大小,單位字節(jié)
回復消息
回復的消息可以為 null,此時 SDK 會返回給微信一個 "SUCCESS",你也可以回復一個普通字符串,比如:歡迎關注 EasySwoole WeChat.,此時 SDK 會對它進行一個封裝,產(chǎn)生一個 \EasySwoole\WeChat\Kernel\Messages\Text 類型的消息并在最后的 $officialAccount->server->serve(); 時生成對應的消息 XML 格式。
如果你想返回一個自己手動拼的原生 XML 格式消息,請返回一個 \EasySwoole\WeChat\Kernel\Messages\Raw 實例即可。
消息轉(zhuǎn)發(fā)給客服系統(tǒng)
關于消息的使用,請參考 消息 章節(jié)。