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