大家都知道微信哈,但是不一定所有的人都玩過微信公眾平台,因為公司在弄的原因,我最近兩個月也在兼做這一個項目。
公司希望有一個微信公眾賬戶,能對自己產品做到一定的推廣作用。可是騰訊自己提供了官方的規則編輯很不好用並且還有限制,不如規則只能小於等於50條這樣的。所以市場部門那邊請我幫忙他們寫一個后台將公眾平台切換到開發模式中,今后只與我做的后台做交互;
進入到開發模式中可以閱讀到官方文檔http://mp.weixin.qq.com/wiki/index.php
懶得研究又想快速了解的可以聽我大概總結一下:
普通微信用戶發送一條消息背后產生的流程
1、一個普通用戶輸入消息可以有很多種類型(文本消息、圖文消息、地理位置消息、鏈接消息、事件消息),消息經過您的手機到達移動聯通電信的服務器然后轉到騰訊的服務器上。
2、騰訊服務器接收到你的消息后,從他的服務器中發現你發送的消息是應該送給微信公眾平台上,並且這個公眾平台還是調到了開發模式上。騰訊服務器就從他的database中去獲得你填入的 接口配置信息的URL 去request post一串數字到你自己在公網上架設的一台server上,比如像這樣:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
Content是你發送的正文內容、MsgType是(文本消息、圖文消息、地理位置消息、鏈接消息、事件消息)的任何一種。
3、你架設的那台server上接收到這個request之后,這里以php為后台開發語言
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postObj = simplexml_load_string($postStr); $MsgType = $postObj->MsgType; if($MsgType == "text") //文本消息 { //do something } else if($MsgType == "image") //圖片消息 { } else if($MsgType == "location") //地理位置消息 { } else if($MsgType == "link") //鏈接消息 { } else if($MsgType == "event") //事件推送 { }
具體針對什么類型的消息分別做不同的處理即可,只需帶入參數$postObj用->訪問內部的元素。
4、然后你自己的server上需要一個database,相應有什么關鍵字、來源是什么類型、是否精確匹配、回復什么內容 這幾個欄位即可,從中抓到內容之后回復騰訊服務器上(5秒鍾內如果不回復它的話本次消息就會失效,跟公眾平台發消息將收不到任何消息),回復文本消息會是長得這樣:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[content]]></Content> <FuncFlag>0</FuncFlag> </xml>
注意:這里的ToUserName 和FromUserName 與第2步中的是剛好相反的,CreateTime也是$CreateTime = time();獲得到,FunFlag的意思是,標記此消息,一般會在沒有找到回復規則的時候標記起來此條消息,這樣人工登陸微信公眾平台網站人工回復內容的時候就會很容易的看到它。
$ToUserName = $request->FromUserName; $FromUserName = $request->ToUserName; $CreateTime = time(); $MsgType = "text"; $Content = "你剛剛是不是說:\"" . $request->Content."\"?"; $responseXMLString=<<<STR <xml> <ToUserName><![CDATA[{$ToUserName}]]></ToUserName> <FromUserName><![CDATA[{$FromUserName}]]></FromUserName> <CreateTime>{$CreateTime}</CreateTime> <MsgType><![CDATA[{$MsgType}]]></MsgType> <Content><![CDATA[{$Content}]]></Content> <FuncFlag>0</FuncFlag> </xml> STR; //$responseXMLString 就是你回復給騰訊服務器的消息
5、騰訊服務器收到你的消息之后,它就知道你回復給用戶的是text文本消息,並且內容是 : 你剛剛是不是說: (你說的原話)?
它就會在准確及時的會給發送微信的用戶。一次消息就完成。
圖文消息也很簡單:只是生成回復給騰訊的xml字串的時候要注意item只能有10條之內,並且最頂上最大的圖是第一條記錄。
說到這里還忘了一個必須要重視的東西:驗證,因為騰訊需要確認這台服務器是不是當初你設置的這個地址,這樣做的原意是 萬一你的server被攻擊了,或者域名被挾持了,它能夠及時發現,不予以處理。
驗證的規則有:
參數 | 描述 |
---|---|
signature | 微信加密簽名 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字符串 |
下面附上經過我改過的php驗證代碼:
if($echoStr != false) //valid weixin { $this->valid($this->input->get(NULL,false)); return; } private function valid($request) { if($this->checkSignature($request)) { $this->output->set_output($request["echostr"]); } } private function checkSignature($request) { $signature = $request["signature"]; $timestamp = $request["timestamp"]; $nonce = $request["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ) { return true; } else { return false; } }