微信二次開發 接入伺服器
阿新 • • 發佈:2019-02-18
本文實現的是將微信伺服器連線到處理伺服器
開發者提交資訊後,微信伺服器將傳送GET請求到填寫的伺服器地址URL上,引數有四個:
signature | 微信加密簽名,signature結合了開發者填寫的token引數和請求中的timestamp引數、nonce引數。 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字串 |
將token、timestamp、nonce三個引數進行字典序排序 ,將三個引數字串拼接成一個字串進行sha1加密 ,開發者獲得加密後的字串可與signature對比,標識該請求來源於微信。
通過signature檢查請求是否來自微信伺服器,若是,返回$echostr,則接入成功。
接通兩個伺服器
define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->run(); class wechatCallbackapiTest { public function run(){ $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } }
//返回$echostr 接入成功
public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; file_put_contents('msg.txt', $postStr,FILE_APPEND); //extract post data if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); $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(!empty( $keyword )) { $msgType = "text"; $contentStr = "Welcome to wechat world!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; file_put_contents('msg.txt', $resultStr,FILE_APPEND); }else{ echo "Input something..."; } }else { echo ""; exit; } }
//判斷請求是否來自微信伺服器 (簽名是否一致)
private function checkSignature()
{
$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 true;
}else{
return false;
}
}