最近在做公司的微信公衆號開發,微信官方的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後就可以調用微信接口去實現自己想要的功能啦。