微擎開發文檔/微擎執行主流程介紹


微擎開發文檔之微擎執行主流程介紹

 

摘要: 首先對微擎的工作原理做簡單描述, 微擎使用規則和模塊的機制來處理公眾平台的請求數據並返回響應的結果.執行流程描述為: 粉絲用戶與公眾號碼進行對話或交互, 而后公眾平台將粉絲用戶的請求消息(當前包括: 文本, 圖片 ...

首先對微擎的工作原理做簡單描述, 微擎使用規則和模塊的機制來處理公眾平台的請求數據並返回響應的結果.

執行流程描述為: 粉絲用戶與公眾號碼進行對話或交互, 而后公眾平台將粉絲用戶的請求消息(當前包括: 文本, 圖片, 位置, 鏈接, 事件. 請參閱消息類型)傳遞給微擎系統, 微擎系統按照消息類型和對應的公眾號所設定的規則列表匹配到合適的規則(請參閱消息路由), 規則定義中包括處理此消息所使用的模塊和此模塊處理消息時所需要的其他附加數據(請參閱模塊定義), 而后模塊將會按照請求的消息數據和模塊附加數據進行相關業務處理並返回處理結果(請參閱響應類型), 微擎系統將處理結果返回給公眾平台, 而后經公眾平台返回給粉絲用戶.

微擎的主處理流程實現定義於: engine.php 中, 如有需要請參閱源碼.

消息類型

消息類型指粉絲用戶通過公眾平台與微擎進行交互時所提供的消息數據的類型. 消息類型基於微信公眾平台提供的數據接口, 微擎在其基礎上進行包裝處理, 方便PHP開發者進行業務處理. 保存消息的基本對象結構定義為:

$message => array( 'from' => '', //string: 發送消息方, 代表一個粉絲用戶(使用OpenID表示) 'to' => '', //string: 消息接收方, 對應當前的公眾號(使用OpenID表示) 'time' => '', //int: 消息發送時間, 使用Unix時間戳表示 'type' => '', //string: 消息類型, 用於區分不同類型的消息, 請參閱下文 'msgid' => '' //int: 消息ID, 公眾平台系統用於唯一標識一條請求消息 );

消息類型同公眾平台官方不同之處在於將event類型拆分開為獨立的消息類型, 避免了重復判斷. 根據消息類型不同, 消息對象結構還存在不同的附加數據, 按照類型定義如下:

文本消息

粉絲用戶向公眾號發送了一條普通文本消息(包括包含表情的消息, 或者純表情消息), 處理文本消息可以實現簡單的文本對話, 結合使用文本上下文(請參閱上下文處理)可以實現調查, 測試等復雜的交互.

$message => array( //....全局數據 'type' => 'text', //string: 代表當前消息為文本消息 'content' => '' //string: 文本消息內容 );
圖片消息

粉絲用戶向公眾號發送了一張圖片, 處理圖片消息可以實現分享用戶圖片的相關功能

$message => array( //....全局數據 'type' => 'image', //string: 代表當前消息為圖片消息 'url' => 'http://same.im/image.jpg' //string: 用戶所發送的圖片地址 );
地理位置消息

粉絲用戶向公眾號發送了一條地理位置, 處理地理位置消息可以實現lbs相關功能(參閱LBS方案)

$message => array( //....全局數據 'type' => 'location', //string: 代表當前消息為位置消息 'location_x' => '', //float: 代表位置經度 'location_y' => '', //float: 代表位置緯度 'scale' => '', //int: 表示地圖縮放倍數 'label' => '' //float: 表示地點描述 );
鏈接消息

粉絲用戶向公眾號發送了一條鏈接消息, 處理鏈接消息可以實現好友分享等社交功能

$message => array( //....全局數據 'type' => 'link', //string: 代表當前消息為鏈接消息 'title' => '', //float: 代表鏈接標題 'description' => '', //float: 代表鏈接描述信息 'scale' => 'url' //int: 表示鏈接的URL );
關注消息

粉絲用戶關注當前公眾號后將會獲得此消息, 處理此消息可以實現歡迎信息和粉絲增長統計

$message => array( //....全局數據 'type' => 'subscribe' //string: 代表當前消息為關注消息 );
取消關注消息

粉絲用戶取消關注當前公眾號后將會獲得此消息, 處理此消息可以實現粉絲數量增長分析

$message => array( //....全局數據 'type' => 'unsubscribe' //string: 代表當前消息為取消關注消息 );
菜單點擊消息

粉絲用戶點擊自定菜單后, 如果菜單設置為消息回復, 那么將會獲得此消息, 處理此消息能實現自定義菜單的特定回復

$message => array( //....全局數據 'type' => 'CLICK', //string: 代表當前消息為菜單點擊消息 'eventkey' => '' //string: 菜單點擊附加的菜單數據信息 );

消息路由

消息路由是指粉絲用戶經公眾平台發送消息內容至微擎時, 微擎系統查找對應的規則記錄, 並將消息分配至合適的模塊處理的過程. 微擎系統按照不同的消息類型, 進行不同的處理. 處理方式如下:

上下文消息路由

微擎支持上下文操作, 通過上下文支持微擎可將用戶對話鎖定至特定的模塊, 如果當前消息是上下文對話的消息, 那么將會自動路由至上下文鎖定的模塊. (請參閱 上下文處理)

'

文本消息規則匹配(重要)

針對文本消息, 微擎使用文本匹配來選擇合適的規則和模塊, 規則是指針對特定消息的處理方式. 微擎選擇規則的方式包括:

* 關鍵字包含 指粉絲用戶發送的消息內容含有指定的關鍵字就指派到特定規則. * 內容等價 指粉絲用戶發送的消息內容完全等於指定的內容才指派到特定規則. * 正則表達式 指粉絲用戶發送的消息類型符合指定正則表達式定義的模式時指派到特定規則.(高級模式, 需要有編程經驗)
其他類型消息路由規則

圖片消息, 位置消息, 鏈接消息等其他類型請求消息的路由支持正在緊張開發中

模塊定義

上下文處理

微擎現已支持上下文鎖定對話, 可以將粉絲用戶的對話鎖定至特定模塊. 用以實現在線調查, 在線測試等類似的功能. 微擎的上下文操作使用 $_SESSION + DB 來實現.上下文數據保存在$_SESSION['context']變量中,並與sessions表中數據做一對一的映射,用戶可通過操作sessions表中的數據進行上下文會話的基本管理. 要實現上下文操作主要使用 Processor 里的內定方法:

public inContext;
本次對話是否為上下文響應對話, 如果當前對話是由上下文鎖定而路由到的. 此值為 true, 否則為 false

protected function beginContext($expire = 3600);
請在模塊處理程序中調用此函數已開始一個新的上下文對話. 
附加的參數 $expire 說明本次會話的失效時間. 例如 $this->beginContext(1800) 就說明啟動一次上下文會話鎖定, 並且本次會話將會於30分鍾后釋放, 如果不固定超時的話, 請在每次請求時調用 beginContext

protected function endContext();
在模塊處理程序中調用 endContext 來結束一次會話, 並銷毀會話中保存的所有數據(當前為 $_SESSION)

protected function refreshContext($expire = 0); 在模塊處理程序中調用 refreshContext 來刷新用戶處於上下文的時限.超過時限用戶將會自動退出上文環境.

protected function addParamContext($var, $val = ''); 在模塊處理程序中調用 addParamContext 用於增加上下文中的附加數據,此數據將會一直存在於上下文消息中,用戶可通過 $this->context 變量來調用保存的數據.

下面的示例將演示根據血型查性格的簡單例子:

class BloodTestModuleProcessor extends WeModuleProcessor { //void: 所有處理程序必須實現虛函數 respond. 用以響應消息 public function respond() { if(!$this->inContext) { $reply = '請輸入你的血型(A, B, O, AB), 來分析你今年的運程. '; $this->beginContext(); // 如果是按照規則觸發到本模塊, 那么先輸出提示問題語句, 並啟動上下文來鎖定會話, 以保證下次回復依然執行到本模塊 } else { $btypes = array('a', 'b', 'o', 'ab'); $b = strtolower($this->message['content']); // 如果當前會話在上下文中, 那么表示當前回復是用戶回答提示問題的答案. if(in_array($b, $btypes)) { switch($b) { case 'a': $reply = 'A型血今年.....'; break; case 'b': $reply = 'B型血今年.....'; break; case 'o': $reply = 'O型血今年.....'; break; case 'ab': $reply = 'AB型血今年.....'; break; } $this->endContext(); // 如果當前回答符合答案格式, 那么進行保存並進行下一個問題. (可以保存至 SESSION 中) // 直到最后一個問題回答完成, 輸出測試結果給用戶, 並結束對話鎖定. 以保證用戶其他對話能正常路由. // 本示例只有一個問題, 因此不保存答案, 直接輸出測試結果. // 如果對話默認的超時不夠, 那么可以在每次提出下一個問題的時候重新調用 beginContext 來順延超時. } else { $reply = '請輸入正確的血型(A, B, O, AB). '; // 回答不符合答案格式, 那么重新顯示當前問題. } } return $this->respText($reply); // 返回至系統 } private function respText($content) { $response = array(); $response['FromUserName'] = $this->message['to']; $response['ToUserName'] = $this->message['from']; $response['MsgType'] = 'text'; $response['Content'] = htmlspecialchars_decode($content); return $response; } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM