微信公众平台开发—access_token的获取存储与更新(Python开发)


access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。

正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务。


要解决的问题

1、如何获取access_token。


2、由于access_token的有效期为7200秒,即2小时,并且重复获取将导致上次获取的access_token失效,获取access_token的api调用次数非常有限,所以要解决如何全局存储与更新access_token。


解决方案


1、access_token放入数据库。


2、access_token在建立URL、Token链接时生成,放入缓存。


我们选择了放入缓存的方案。放入数据库也需要每次访问时刷新access_token,以保证数据的有效性。


access_token怎么更新呢?
access_token失效更新后,怎么判断access_token有没有失效呢?
使用当前的access_token请求微信接口,获取自定义菜单,如果返回的errcode为42001,则说明access_token已经失效,这时再重新获取access_token。


代码


python提供了缓存引入机制

from django.core.cache import cache

引入缓存后,定义和微信接口相关的变量

class AppItem(models.Model):
    Token = models.CharField(max_length=128,  unique=True, blank=True, null=True, verbose_name='token', db_index=True)
    Appid = models.CharField(max_length=128, blank=True, null=True, verbose_name='APPID')
    App_secret = models.CharField(max_length=128, blank=True, null=True, verbose_name='APP_SECRET')

建立和微信的基础链接,需要Token and AppID

Token = models.CharField(max_length=128,  unique=True, blank=True, null=True, verbose_name='token', db_index=True)

定义了Token

Appid = models.CharField(max_length=128, blank=True, null=True, verbose_name='APPID')

定义了AppID

App_secret = models.CharField(max_length=128, blank=True, null=True, verbose_name='APP_SECRET')

微信的加密结构



定义了和微信的基础接口关系后,开始定义access_token的函数


def get_token(self):
        token_cache_key = TOKEN_CACHE_PRE+'_'+self.token #对不同的app指定不同的缓存
        token = cache.get(token_cache_key)
        if token:
            return token
        else:
            url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' % (self.appid, self.app_secret)
            dict_data = method_get_api(url)
            token = dict_data.get('access_token')
            expires_in = dict_data.get('expires_in')
            if token and expires_in:
                cache.set(token_cache_key, token, expires_in-60)
            return token or ''


微信中的服务有很多,图文消息、支付、卡券、微店、红包等。不同的python的app都有不同的缓存。

针对不同的缓存提供不同的token_cache_key

token_cache_key = TOKEN_CACHE_PRE+'_'+self.token #对不同的app指定不同的缓存
        token = cache.get(token_cache_key)


token可能获得成功,也可能“过期(失效)”;失效后,重新创建微信的access_token。

 if token:
            return token
        else:
            url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' % (self.appid, self.app_secret)


access_token获得后,分配Python的app缓存和微信access_token的配对,并且在其它应用刷新了access_token后能够及时获得新的token。

dict_data = method_get_api(url)
            token = dict_data.get('access_token')
            expires_in = dict_data.get('expires_in')
            if token and expires_in:
                cache.set(token_cache_key, token, expires_in-60)
            return token or ''


特别提醒: 不同的微信应用 —— 如: 图文消息或者客服接口(48小时有效),与,卡券会遇到刷新access_token的情况;任何一个服务刷新的access_token其它服务调取的时候都要重新“生成或者读取最新的”access_token。



转发请注明原文链接: http://blog.csdn.net/yimich/article/details/42784439 
















你可能感兴趣的:(python,微信开发)