1.引言:最近兩天玩了一把微信公眾平台開發,在此把環境配置過程記錄一下,期間遇到一些曲折,主要是BAE和SAE主機的問題,折騰了一天最后實在不行用自己實驗室的主機作為服務器,唉,免費的東西就是不穩定,如果想要長期玩微信的話,最好買些好的空間。
2.參考資料:
A.微信消息接口指南:http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97
B.方倍工作室的一些教程:http://www.cnblogs.com/txw1958/
3.環境配置:
3.1 如果想配置BAE和SAE作為主機,
BAE配置可以參考:http://www.cnblogs.com/txw1958/p/wechat-tutorial.html
SAE配置可以參考:http://coolwb.com/2460.html
3.2 自己主機的話,簡單些:直接把文件放到主機服務器的網站根目錄進行訪問即可: http://www.example.com/weixin/
4. 微信公眾賬號申請:
公眾賬號有兩個模式:編輯模式和開發模式。編輯模式下可以設置簡單的消息自動回復和關鍵字自動回復,但功能太局限;由於我是想嘗試開發模式的,所以開啟開發者模式,在此之前,先把編輯模式關閉,再開啟。
開發者模式開啟之后,即可配置接口參數。如下圖所示:URL處填寫你主機的地址,TOKEN填寫要驗證的Token值,可以自己設定,但必須同所需驗證的index.php中的token一致。 token驗證成功后會提示"提交成功", 並且顯示您已成為開發者;如果驗證不成功,則要檢查是否是你程序寫的有問題,還是你所填主機的地址無法成功訪問問題,網上有一篇相關說明是關於Token驗證不成功的情形下去跟蹤微信IP地址的方法(鏈接地址:方倍工作室),以檢查是哪類問題.
(備注:我在配置過程中,雖然能驗證成功,但用微信給公眾賬號發消息,就是無法按照設定返回給我的普通微信消息(不是公眾賬號),最后沒辦法換成自己實驗室現有的一台主機作為服務器,域名用一個買過的域名作為URL)
5. 功能測試
驗證成功后,上述Index.php中的相關驗證口令即沒用了,可以將其內容替換成自己想要處理的內容。微信目前開通給開發者的接口有限,只能處理文本、聲音和圖文三類消息。根據官網消息接口說明制定相應的功能。
6. 附錄代碼
6.1 接口驗證代碼
1 <?php 2 define("TOKEN", "weixin"); //TOKEN值,此處填寫你所設定的Token 3 $wechatObj = new wechat(); 4 $wechatObj->valid(); 5 class wechat { 6 public function valid() { 7 $echoStr = $_GET["echostr"]; 8 if($this->checkSignature()){ 9 echo $echoStr; 10 exit; 11 } 12 } 13 14 private function checkSignature() { 15 $signature = $_GET["signature"]; 16 $timestamp = $_GET["timestamp"]; 17 $nonce = $_GET["nonce"]; 18 $token = TOKEN; 19 $tmpArr = array($token, $timestamp, $nonce); 20 sort($tmpArr); 21 $tmpStr = implode( $tmpArr ); 22 $tmpStr = sha1( $tmpStr ); 23 if( $tmpStr == $signature ) { 24 return true; 25 } else { 26 return false; 27 } 28 } 29 } 30 ?>
6.2 功能測試代碼
1 <?php 2 $wechatObj = new wechat(); 3 $wechatObj->responseMsg(); 4 class wechat { 5 public function responseMsg() { 6 7 //---------- 接 收 數 據 ---------- // 8 9 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //獲取POST數據 10 11 //用SimpleXML解析POST過來的XML數據 12 $postObj = simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA); 13 14 $fromUsername = $postObj->FromUserName; //獲取發送方帳號(OpenID) 15 $toUsername = $postObj->ToUserName; //獲取接收方賬號 16 $keyword = trim($postObj->Content); //獲取消息內容 17 $time = time(); //獲取當前時間戳 18 19 20 //---------- 返 回 數 據 ---------- // 21 22 //返回消息模板 23 $textTpl = "<xml> 24 <ToUserName><![CDATA[%s]]></ToUserName> 25 <FromUserName><![CDATA[%s]]></FromUserName> 26 <CreateTime>%s</CreateTime> 27 <MsgType><![CDATA[%s]]></MsgType> 28 <Content><![CDATA[%s]]></Content> 29 <FuncFlag>0</FuncFlag> 30 </xml>"; 31 32 $msgType = "text"; //消息類型 33 $contentStr = 'welcome my account'; //返回消息內容 34 35 //格式化消息模板 36 $resultStr = sprintf($textTpl,$fromUsername,$toUsername, 37 $time,$msgType,$contentStr); 38 echo $resultStr; //輸出結果 39 } 40 } 41 ?>