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