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

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

 

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

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

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

微擎的主處理流程實現定義於: engine.php 中, 若有須要請參閱源碼.正則表達式

消息類型

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

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

消息類型同公衆平臺官方不一樣之處在於將event類型拆分開爲獨立的消息類型, 避免了重複判斷. 根據消息類型不一樣, 消息對象結構還存在不一樣的附加數據, 按照類型定義以下:微信

文本消息

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

$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 );
關注消息

粉絲用戶關注當前公衆號後將會得到此消息, 處理此消息能夠實現歡迎信息和粉絲增加統計this

$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; } }
相關文章
相關標籤/搜索