微信公衆號開發踩坑指南(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後就可以調用微信接口去實現自己想要的功能啦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章