PHP語言開發微信公衆平臺(訂閱號)之開啓開發者模式(3)

(1)打開上一篇咱們從花生殼官網得到的外網網址就會看到localhost根目錄下的文件(這裏再也不贅述php環境的搭建)。注:由於外網網址在能聯網時,訪問外網網址的任何人都能看到根目錄下的全部文件,不只能看還能執行,故博主推薦實現內網穿透後不要把重要文件放在localhost目錄下,畢竟當心駛得萬年船。php

(2)在localhost根目錄新建一個wx文件夾,在文件夾裏面新建一個api.php打開新建的api.php並將如下代碼複製進去(以下代碼中都有至關詳細的註釋,在此再也不解釋如下代碼)算法

  1 <?php
  2 /**
  3   * wechat php test
  4   */
  5 header('Content-type:text');
  6 //define your token
  7 //定義TOKEN密鑰
  8 define("TOKEN", "weixin");
  9 //實例化微信對象
 10 $wechatObj = new wechatCallbackapiTest();
 11 //驗證成功後註釋掉valid方法
 12 $wechatObj->valid();
 13 //開啓自動回覆功能
 14 $wechatObj->responseMsg();
 15 //定義類文件
 16 class wechatCallbackapiTest
 17 {
 18     //實現valid驗證方法:實現對接微信公衆平臺
 19     public function valid()
 20     {
 21         //經過GET請求接收隨機字符串
 22         $echoStr = $_GET["echostr"];
 23         //調用checkSignature方法進行用戶(開發者)數字簽名驗證
 24         //valid signature , option
 25         if($this->checkSignature()){
 26             //若是成功,則返回接收到的隨機字符串
 27             echo $echoStr;
 28             //並退出
 29             exit;
 30         }
 31     }
 32 
 33     public function responseMsg()
 34     {
 35         //get post data, May be due to the different environments
 36         //接收用戶端(客戶)發送過來的XML數據
 37         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 38 
 39           //extract post data
 40         //判斷XML數據是否爲空
 41         if (!empty($postStr)){
 42                 /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
 43                    the best way is to check the validity of xml by yourself */
 44                 libxml_disable_entity_loader(true);
 45                 //經過simplexml進行xml解析     PHP中有兩大類能夠完成對XML的解析,1.PHP的Dom模型2.經過simplexml模型
 46                   $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
 47                 //手機端
 48                 $fromUsername = $postObj->FromUserName;
 49                 //微信公衆平臺
 50                 $toUsername = $postObj->ToUserName;
 51                 //接收用戶發送的關鍵詞
 52                 $keyword = trim($postObj->Content);
 53                 //時間戳
 54                 $time = time();
 55                 //文本發送模板
 56                 $textTpl = "<xml>
 57                             <ToUserName><![CDATA[%s]]></ToUserName>
 58                             <FromUserName><![CDATA[%s]]></FromUserName>
 59                             <CreateTime>%s</CreateTime>
 60                             <MsgType><![CDATA[%s]]></MsgType>
 61                             <Content><![CDATA[%s]]></Content>
 62                             <FuncFlag>0</FuncFlag>
 63                             </xml>";   
 64                 //判斷用戶發送關鍵詞是否爲空
 65                 if(!empty( $keyword ))
 66                 {
 67                     //回覆類型,若是爲"text",表明文本類型
 68                       $msgType = "text";
 69                     //回覆內容
 70                     $contentStr = "Welcome to wechat world!";
 71                     //格式化字符串(對xml進行格式化操做,把裏面相關的變量格式化成字符串)
 72                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
 73                     //把XML數據返回給手機端
 74                     echo $resultStr;
 75                 }
 76                 //若是用戶發送的關鍵詞爲空,則返回下列字符串
 77                 else{
 78                     echo "Input something...";
 79                 }
 80 
 81         }else {
 82             echo "";
 83             exit;
 84         }
 85     }
 86     
 87     //定義checkSignature方法
 88     private function checkSignature()
 89     {
 90         // you must define TOKEN by yourself
 91         
 92         //判斷TOKEN密鑰是否認義
 93         if (!defined("TOKEN")) {
 94             //若是沒有定義則拋出異常,返回'TOKEN is not defined!'字符串
 95             throw new Exception('TOKEN is not defined!');
 96         }
 97         //接收微信加密簽名
 98         $signature = $_GET["signature"];
 99         //接收時間戳信息
100         $timestamp = $_GET["timestamp"];
101         //接收隨機數
102         $nonce = $_GET["nonce"];
103         //把TOKEN常量賦值給$token變量    
104         $token = TOKEN;
105         //把相關參數組裝爲數組(密鑰文件、時間戳、隨機數)
106         $tmpArr = array($token, $timestamp, $nonce);
107         // use SORT_STRING rule
108         //經過字典法進行排序
109         sort($tmpArr, SORT_STRING);
110         //把排序後的數組轉化爲字符串
111         $tmpStr = implode( $tmpArr );
112         //經過哈希算法對字符串進行加密操做
113         $tmpStr = sha1( $tmpStr );
114         //與加密簽名進行對比
115         if( $tmpStr == $signature ){
116             return true;
117         }else{
118             return false;
119         }
120     }
121 }
122 
123 ?>

(3)打開微信公衆平臺"開發"菜單中的"基本配置"項,並點擊"修改配置"api

(4)1.進入修改配置頁面填寫配置信息。這裏假設得到的域名爲ww,baidu.com,url處填寫咱們上一篇得到的域名並詳細到第二步咱們建立的php文件,例:http://www.baidu.com/wx/api.php數組

2.token處填寫咱們第二步建立的php文件的第8行定義的token服務器

3.第三項隨機生成,第四項根據業務須要選擇微信

4.最後點擊提交按鈕微信公衆平臺

(5)提交後,頁面頂端會有提示,顯示提交成功,則爲提交成功;若顯示其餘,則爲提交不成功post

(6)此時,服務器配置旁邊會顯示"已啓用"字樣。至此微信公衆平臺的開發者模式已開啓,從此咱們就能夠經過修改api.php文件來修改公衆號的功能了注:驗證成功後請註釋掉api.php文件中的第十二行,由於valid方法僅僅具備驗證功能,若是不註釋,每運行一遍此文件,就會調一次驗證方法,可是驗證經過後,不須要再調用此方法){好吧,確實有點繞反正驗證經過後註釋掉就好了}this

 

注:未經容許,禁止轉載加密

相關文章
相關標籤/搜索