1.什么是Access_token
在访问微信平台api的时候,总会需要一个access_token这样一个参数。这个参数是一个令牌,因为微信平台是一个restful的api平台,请求是没有状态的,为了验证你有权限访问api,在一些列的操作有,需要你有一个令牌,拿着令牌就可以直接访问api接口,而不需要再次认证了。
对于token一般是有一个有效期的,认证得到令牌后有效期开始计时,到期前需要更新令牌并使用新的令牌进行api的访问。当然如果多次请求令牌那么上一次请求的令牌就会失效。
令牌失效的原理也有效防御了一个账号多次重复登录和多地点使用同一账号登录的问题,这个做法我们在之前的正特项目的api部分也用到了。
对于一个服务号,请求access_token的频率也是受限制的,所以也不用每次请求都重新请求一个新的access_token,一般来说使用一个独立的进程来获取这个参数,然后在其他进程或是app中读取这个进程请求的令牌的结果。也就是说需要一个进程来单独负责维护令牌有效。其他程序和进程就只管用这个结果就好了。
根据群内讨论,代码实现部分我把请求的结果放在数据库里面了。
2.如何获取到Access_token
在微信平台中你可以获得appid,和appsecrect这两个参数。使用这两个参数向微信平台进行请求,你就可以得到一个
{"access_token":"ACCESS_TOKEN","expires_in":7200}
类似这样的结论,其中access_token就是令牌,后边那个参数就是令牌的有效期。
3.代码如何实现
#coding:UTF-8
__author__ = 'jy@cjlu.edu.cn'
from SysCommon.tools import TimeStr
import urllib,json,thread,time
from config import AppId,AppSecret
from mako.template import Template
from web.utils import storage
from models.s_vars import S_vars
from iLibP.loger import *
#微信获取Access_token
target_url_t="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${apppsecret}"
def GetToken(appid,apppsecret):
"""
获取access_token的主函数
:param appid:
:param apppsecret:
:return:
"""
args = storage()
args.appid = appid
args.apppsecret = apppsecret
#构建模版
t = Template(target_url_t)
#渲染模版
target_url = t.render(**args)
#请求并得到返回值 {"access_token":"ACCESS_TOKEN","expires_in":7200}
json_result = urllib.urlopen(target_url).read()
json_result = json.loads(json_result)
return json_result
def work_ht():
while True:
result = GetToken(AppId,AppSecret)
result = storage(result)
#这里的秒要减去60个秒,提前一分钟更新token
result.expires_in -=60
#这里要更新全局变量
S_vars.SaveVarValue('access_token',result.access_token,'')
MSG = "中控进程更新Access_token:"+result.access_token+",下一次更新在"+str(result.expires_in)+"秒以后执行"
print TimeStr(fmt="%Y-%m-%d %H:%M:%S")+MSG
LogInfo(MSG)
#休眠准备下一次请求
time.sleep(result.expires_in)
if __name__=="__main__":
print "access_token process working...."
work_ht()
4.再次总结
拿到access_token之后就比较容易的可以调用其他的微信api了,当然还需要配合其他的参数。但是要知道,我们已经有令牌了,已经经过微信授权的api现在都可以使用了。如果想知道那些api能用,那些不能用,需要你从微信平台去查看一下授权情况。
代码已经放在https://git.coding.net/pcode/yl_ap.git,自己去迁出来看看吧。