微信公眾號開發踩坑指南(1)——伺服器驗證與Token獲取失敗原因
阿新 • • 發佈:2019-02-16
最近在做公司的微信公眾號開發,微信官方的wiki寫的也不是很詳細,一不小心就入了一個坑。一開始入手的時候覺得有點混亂,開發完成之後發現其實不難,很多功能都是獲取access token然後到微信指定的URL去換取你需要的東西,比如自定義選單,帶參二維碼,模板訊息等等。此文記錄一下開發過程中遇到的坑,希望有緣看到這篇文章的人可以少踩些坑。
微信開發首先要進行伺服器介面的驗證,微信要確定填寫的域名是你自己的伺服器地址,所以這個部分只需要把微信伺服器發給你的str返回就可以驗證成功了。
這裡我用的是公司的伺服器地址,個人開發的話買個雲伺服器就可以了。AESKey隨機,加密模式預設明文模式,Token自己隨便設定即可。
根據上述的驗證方法:
private function checkSignature() { _GET["signature"]; _GET["timestamp"]; _GET["nonce"]; tmpArr = array(timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( signature ){ return true; }else{ return false; } } public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ echo $echoStr; exit; } }
controller中的handler_reques()函式直接呼叫valid函式即可完成驗證。
坑1:這個驗證的過程中是不能用瀏覽器開啟URL的,不然會驗證失敗,這個坑了我好久。(為什麼呢?我也不知道)
完成伺服器介面驗證之後,就可以用這個伺服器URL去獲取access_token了。
public function gettoken(){ $mem = new Memcache; $mem->connect('127.0.0.1', 11211); //本地memcache $appid = APPID; $secret= SECRET; $getTokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret; $accessTokenJson=file_get_contents($getTokenUrl); $accessTokenArr=json_decode($accessTokenJson,true); $accessToken=$accessTokenArr['access_token']; $mem->set('businesskfs_wx_access_token',$accessToken,0,6000); return $accessToken; } public function Token(){ $mem = new Memcache; $mem->connect('127.0.0.1', 11211); $res = $mem->get('access_token'); if(empty($res)){ $res = $this->gettoken(); } return $res; }
坑2:Access_token會2小時過期一次,每天有限制次數,所以不能一直請求獲取。這裡把獲取的access_token存在memcache中,設定過期時間為6000(小於7200即可)。
坑3:有時候會顯示token missing40001報錯,這個時候有兩種可能:
1,IP白名單沒新增
2,重置一下secretID
拿到access_token後就可以呼叫微信介面去實現自己想要的功能啦。