access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
php中有个 “curl” 扩展工具,通过它可以发起模拟 http/https 请求,这里获取access_token 正是用这个扩展工具来获取。开发文档中有明确说明公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。因此在获取access_token钱先要拿到AppID和AppSecret,这两个参数都可以在公众平台后台中拿到。
拿到这两个参数后就可以获取access_token了:
private function _ch($url, $type='get', $res='json', $arr='') { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($type == 'post') { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $arr); } $cnt = curl_exec($ch); if (curl_errno($ch)) { return; } curl_close($ch); if ($res == 'json') { return json_decode($cnt, true); } return $cnt; } //获取access_token //把下面的 *** 换自己对应的 appid 和 appsecret private function _getAT() { $appid = '***'; $appsecret = '***'; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}"; $arr = $this->_ch($url); if (!$arr) { return; } return $arr['access_token']; } //因为每天调用接口获取 access_token 有次数限制, //所以第一次获取 access_token 后最好可以把存起来 //尽量避免每次都调用接口获取 access_token public function getWxAT() { if (Session::get('access_token') && Session::get('expire_time')>time() ) { return Session::get('access_token'); }else{ $accessToken = $this->_getAT(); Session::set('access_token',$accessToken); Session::set('expire_time',time()+7200); return $accessToken; } }
如果在获取 access_token 时出现 40164 错误,则需要把 invalid ip 后面的 ip 地址加入公众平台后台开发基本配置里的白名单里。