1. 程式人生 > >微信公眾號開發踩坑指南(1)——伺服器驗證與Token獲取失敗原因

微信公眾號開發踩坑指南(1)——伺服器驗證與Token獲取失敗原因

最近在做公司的微信公眾號開發,微信官方的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後就可以呼叫微信介面去實現自己想要的功能啦。