1. 程式人生 > >微信公眾平臺開發例項文件 wx_sample.php 詳細解釋

微信公眾平臺開發例項文件 wx_sample.php 詳細解釋

<?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;
        }
    }
}