最近在做公司的微信公众号开发,微信官方的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后就可以调用微信接口去实现自己想要的功能啦。