微信公眾平臺開發例項文件 wx_sample.php 詳細解釋
阿新 • • 發佈:2018-12-08
<?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest();//將11行的class類例項化 $wechatObj->valid();//使用-》訪問類中valid方法,用來驗證開發模式 //11--23行程式碼為簽名及介面驗證。 class wechatCallbackapiTest { public function valid()//驗證介面的方法 { $echoStr = $_GET["echostr"];//從微信使用者端獲取一個隨機字元賦予變數echostr //valid signature , option訪問地61行的checkSignature簽名驗證方法,如果簽名一致,輸出變數echostr,完整驗證配置介面的操作 if($this->checkSignature()) { echo $echoStr; exit; } } //公有的responseMsg的方法,是我們回覆微信的關鍵。以後的章節修改程式碼就是修改這個。 public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//將使用者端放鬆的資料儲存到變數postStr中,由於微信端傳送的都是xml,使用postStr無法解析,故使用$GLOBALS["HTTP_RAW_POST_DATA"]獲取 //extract post data如果使用者端資料不為空,執行30-55否則56-58 if(!empty($postStr)) { $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);//將postStr變數進行解析並賦予變數postObj。simplexml_load_string()函式是php中一個解析XML的函式,SimpleXMLElement為新物件的類,LIBXML_NOCDATA表示將CDATA設定為文字節點,CDATA標籤中的文字XML不進行解析 $fromUsername = $postObj->FromUserName;//將微信使用者端的使用者名稱賦予變數FromUserName $toUsername = $postObj->ToUserName;//將你的微信公眾賬號ID賦予變數ToUserName $keyword = trim($postObj->Content);//將使用者微信發來的文字內容去掉空格後賦予變數keyword $time = time();//將系統時間賦予變數time //構建XML格式的文字賦予變數textTpl,注意XML格式為微信內容固定格式,詳見文件 $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; //39行,%s表示要轉換成字元的資料型別,CDATA表示不轉義 //40行為微信來源方 //41行為系統時間 //42行為回覆微信的資訊型別 //43行為回覆微信的內容 //44行為是否星標微信 //XML格式文字結束符號 if(!empty($keyword))//如果使用者端微信發來的文字內容不為空,執行46--51否則52--53 { $msgType = "text";//回覆文字資訊型別為text型,變數型別為msgType $contentStr = "Welcome to wechat world!";//我們進行文字輸入的內容,變數名為contentStr,如果你要更改回覆信息,就在這兒 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);//將XML格式中的變數分別賦值。注意sprintf函式 echo $resultStr;//輸出回覆資訊,即傳送微信 } else { echo "Input something...";//不傳送到微信端,只是測試使用 } } else { echo "";//回覆為空,無意義,除錯用 exit; } } //簽名驗證程式 ,checkSignature被18行呼叫。官方加密、校驗流程:將token,timestamp,nonce這三個引數進行字典序排序,然後將這三個引數字串拼接成一個字串驚喜shal加密,開發者獲得加密後的字串可以與signature對比,表示該請求來源於微信。 private function checkSignature() { $signature = $_GET["signature"];//從使用者端獲取簽名賦予變數signature $timestamp = $_GET["timestamp"];//從使用者端獲取時間戳賦予變數timestamp $nonce = $_GET["nonce"]; //從使用者端獲取隨機數賦予變數nonce $token = TOKEN;//將常量token賦予變數token $tmpArr = array($token, $timestamp, $nonce);//簡歷陣列變數tmpArr sort($tmpArr, SORT_STRING);//新建排序 $tmpStr = implode($tmpArr);//字典排序 $tmpStr = sha1($tmpStr);//shal加密 //tmpStr與signature值相同,返回真,否則返回假 if($tmpStr == $signature) { return true; } else { return false; } } }