Python 微信access_token url_link 获取
封装获取类
ERROR_MAP = {
40002: '暂无生成权限',
40013: '生成权限被封禁',
85079: '小程序未发布',
40165: '参数path填写错误',
40212: '参数query填写错误',
85401: '参数expire_time填写错误,时间间隔大于1分钟且小于1年',
44990: '生成URL Link频率过快(超过100次/秒)',
85400: '长期有效URL Link达到生成上限10万',
45009: '单天生成URL Link数量超过上限50万'
}
class WxUtils(object):
def __init__(self, appid, secret):
self.app_id = appid
self.secret = secret
self.cache_name = 'access_token'
self.base_url = 'https://api.weixin.qq.com'
def _request(self, url, method='post', **kwargs):
try:
response = requests.request(method=method, url=url, timeout=5, **kwargs)
except (requests.ConnectionError, requests.Timeout):
raise exceptions.ValidationError('连接微信超时')
except Exception as e:
raise exceptions.ValidationError('未知错误,请联系管理员')
response_data = response.json()
return response_data
def _url(self, url):
return urljoin(self.base_url, url)
def request_access_token(self, *args, **kwargs):
"""
获取access_token 设置过期时间为2小时
@return:
@rtype:
"""
url = '/cgi-bin/token?grant_type=client_credential&appid={}&secret={}'.format(
self.app_id, self.secret)
response_data = self._request(url=self._url(url), method='post', **kwargs)
if not response_data.get('access_token'):
raise exceptions.ValidationError("获取access_token失败")
cache.set(self.cache_name, response_data.get('access_token'), 60 * 60 * 2)
return self.get_access_token()
def get_access_token(self):
"""
获取 access_token 如果缓存存在就从缓存取
@return:
@rtype:
"""
if not cache.get(self.cache_name):
return self.request_access_token()
return cache.get(self.cache_name)
def get_url_link(self, **kwargs):
"""
获取 h5转小程序的 url_link
@param kwargs:
@type kwargs:
@return:
@rtype:
"""
url = '/wxa/generate_urllink?access_token={}'.format(self.get_access_token())
response_data = self._request(url=self._url(url), **kwargs)
if response_data.get('errcode'):
raise exceptions.ValidationError(
ERROR_MAP.get(response_data.get('errcode'), response_data.get('errmsg')))
return response_data