微信公众号开发中的access_token和jsapi_ticket

微信公众号开发中的access_token和jsapi_ticket

    • 一、两个access_token
      • 1.网页授权access_token
      • 2.全局access_token
      • 3.jsapi_ticket(注意在微信公众平台绑定域名和添加白名单)
    • 二、为什么要说jsapi_ticket
    • 三、代码逻辑(获取全局access_token和jsapi_ticket)
    • 四、注意事项
    • 五、附上连接

一、两个access_token

微信接口中有两个access_token,一个网页授权access_token,和一个全局的基础access_token,两个不一样。

1.网页授权access_token

用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息。
由微信返回的code换取access_token和openid,access_token和openid换取用户信息,具体参考:https://blog.csdn.net/G925010178/article/details/84962930

2.全局access_token

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。access_token的存储至少要保留512个字符空间(测试返回长度为157)。
获取access_token时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中。(小程序不需要)

3.jsapi_ticket(注意在微信公众平台绑定域名和添加白名单)

jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了。

二、为什么要说jsapi_ticket

全局access_token是后台调用api时经常使用的参数,jsapi_ticket时是前台js调用SDK的必要参数。
这里为什么要说jsapi_ticket呢,因为jsapi_ticket和全局access_token一样,具有时效性。而且同样调用次数有限制,需要缓存下来。我是把他们存储在数据同一张表里,调用统一的公共函数,统一刷新(jsapi_ticket测试返回长度86)。附上我的数据库表截图(小程序也有自己的access_token和jsapi_ticket,如果平台不止管理一个公众号或小程序可以依次往下添加)。
在这里插入图片描述

三、代码逻辑(获取全局access_token和jsapi_ticket)

AppID和AppSecret获取access_token
access_token获取jsapi_ticket

//获取access_token和jsapi_ticket
function getAccessToken($name='access_token'){
    $model = \think\Db::name('Wx_access_token');
    $recode = $model->where(['id'=>1])->find();
    if($recode['update_time']+60*60<time()){
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".\think\Config::get('site')['small_appid']."&secret=".\think\Config::get('site')['small_appSecret'];
        $json = json_decode(file_get_contents($url),true);
        $data['access_token'] = $json['access_token'];
        $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$data['access_token']."&type=jsapi";
        $json = json_decode(file_get_contents($url),true);
        $data['jsapi_ticket'] = $json['ticket'];
        $data['update_time'] = time();
        $model->where(['id'=>1])->update($data);
    }else{
        $data['access_token'] = $recode['access_token'];
        $data['jsapi_ticket'] = $recode['jsapi_ticket'];
    }
    return $data[$name];
}

四、注意事项

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

2、目前Access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

3、Access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

五、附上连接

微信官方文档(全局access_token):https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
微信官方文档(jsapi_ticket):https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

你可能感兴趣的:(微信公众号开发,#,微信JS-SDK接口,php)