創建過程就需要做簽名校驗,描述如下:
公眾平台用戶提交資訊後,我們將以GET請求方式請求到填寫的Url上,並且帶上四個參數:
* signature — 微信加密簽章
* timestamp — 時間戳
* nonce — 隨機數字
* echostr — 隨機字串
開發者透過檢驗signature對網址存取合法性進行校驗。若此次GET請求原樣返回echostr參數內容,則接入生效,否則接入失敗。驗證signature將結合開發者填寫的token參數、timestamp參數和nonce參數等,加密流程:
* 將token、timestamp、nonce三個參數進行字典序排序
* 將三個參數字串拼接成一個字串進行SHA1加密
* 開發者取得加密後的字串可與signature對比,標識該請求來自微信。
程式碼:
<? $signature = $_GET['signature']; $timestamp = $_GET['timestamp']; $nonce = $_GET['nonce']; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return $_GET['echostr']; }else{ return false; } ?>
然而,微信不走json途徑傳遞資料:
所以要用simplexml_load_string裝XML資料為物件,另外發現POST方法不是urlencode,所以設定HTTP_RAW_POST_DATA,然後可以讀取資料.
ToUserName 訊息接收方微訊號,一般為公眾平台帳號微訊號
FromUserName 訊息傳送方微訊號
CreateTime 訊息建立時間
MsgType 文字訊息為text
Content 訊息內容
<?php $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //符合微信的POST规范 if (!emptyempty($postStr)) { $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); //XML转对象函数,可能最近这一两年入行的不太清楚XML函数 //数据从对象取出 $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $CreateTime = $postObj->CreateTime; $MsgType = $postObj->MsgType; $Content = $postObj->Content; $keyword = trim($postObj->Content); //安全Trim $time = time(); //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>"; if(!emptyempty( $keyword )) //如果发信息来了,不是空白POST,微信规定立即回复,不用推送. { $msgType = "text"; //定义类型 $contentStr = "Hello World,I am Tater!"; //回复 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); //记住,Tpl是要载入的 echo $resultStr; //输出,以便微信抓! } else { echo "What are you say!"; //输入信息有问题,提示输入! } } else { echo ""; exit; } ?>
以上是微信介面開發的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!