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