PHP微信公众号开发(一)

一、access_token的使用

获取access_token微信官方文档

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

1、建议公众号开发者使用中控服务器统一获取和刷新Access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;

2、公众号需要使用AppID和AppSecret调用本接口来获取access_token。并且需要将调用此接口的服务器IP加到微信后台 “微信公众平台-开发-基本配置”的IP白名单中


1
2
3
4
5
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

返回JSON
{"access_token":"ACCESS_TOKEN","expires_in":7200}`

获取的access_token可存储于文件、缓存或数据库中,保存其过期时间,当获取的时候判断是否过期,过期则更新access_token的值。

yii代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class WeChatAccessToken
{

//获取微信Access_Token
public static function getAccessToken()
{
//检测本地是否已经拥有access_token,并且检测access_token是否过期
$accessToken = self::_checkAccessToken();

if($accessToken === false){
$accessToken = self::_getAccessToken();
}

return isset($accessToken['access_token'])?$accessToken['access_token']:'';
}

//从微信服务器获取微信ACCESS_TOKEN
private static function _getAccessToken()
{
$appid = \Yii::$app->params['wechat']['appid'];
$appsecret = \Yii::$app->params['wechat']['appsecret'];

$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
$accessToken = Helper::curlGet($url);

$accessTokenArr = json_decode($accessToken,true);
if(!isset($accessTokenArr['access_token'])){
return '';
}
$accessTokenArr['time'] = time();

//缓冲 token
Yii::$app->redis_cache->set('weixin_access_token',json_encode($accessTokenArr),7260);
return $accessTokenArr;
}

//检测微信ACCESS_TOKEN是否过期
private static function _checkAccessToken()
{
$data = Yii::$app->redis_cache->get('weixin_access_token');
$accessToken['value'] = $data;
if(!empty($accessToken['value'])){
$accessToken = json_decode($accessToken['value'], true);

if(time() - $accessToken['time'] < $accessToken['expires_in']-10){
return $accessToken;
}
}
return false;
}
}


class Helper
{
//GET 请求
public static function curlGet($url){
$oCurl = curl_init();
if(stripos($url,"https://")!==FALSE){
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
$sContent = curl_exec($oCurl);
$aStatus = curl_getinfo($oCurl);
curl_close($oCurl);
if(intval($aStatus["http_code"])==200){
return $sContent;
}else{
return false;
}
}
}
踏浪 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!