微信開發:wx_sample.php內容詳解

weixin_34249678發表於2018-06-23
<?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;
        }
    }
}

?>

相關文章