关于access_token过期的解决办法
最近在做微信的发送模版消息,在测试的时候发现有的时候能够发送,有时候无法发送,查了相关的日志(日志记录发送结果很重要!!),看到了微信返回的错误消息,发现是 invalid credential, access_token is invalid or not latest hint: [QM1DJA0040vr22],原来是assess_token过期了。
我想了问题可能出现在下面几点:
测试服和线上服使用同一个app_id和secret来获取,可能会存在其中一方获取的token是旧的;
代码中没有统一的从一个地方来获取,而是直接从官网获取,导致不统一(看了代码,没有发现单独获取token的地方);
请求获取新的token的时候失败(应该不可能,因为请求成功以后会在redis中缓存两个小时,但是发现没过多久又再次失效,因此主要原因应该不是这个);
异步队列等待的时间较长,正好执行的时候token已经更新(应该不可能,获取token是在异步函数中执行,而不是通过函数参数来传递);
但是实在想不出问题确切的原因,也只能先在其基础上进行fix了。
我的做法:是在内层函数中,如果执行失败,并且是access_token过期的异常,则会在request的时候抛出专门的异常。在外围函数如果接收到了这个异常,则会抛出让装饰器接收到,装饰器收到这个异常后会删掉缓存中的token,并且重新执行该函数,这样该函数在执行的时候,就会去主动的获取最新的token。我大致写了下代码,如下:
# -*- coding: utf-8 -*-
from functools import wraps
from django.utils.decorators import available_attrs
import logging
class WeiXinTokenExpiredException(Exception):
pass
def _delete_weixin_expired_access_token():
"""
删除微信过期的token
"""
pass
def _send_weixin_mini_template_msg(msg):
"""
发送微信模版信息
:param msg:
:return:
"""
return {}
def weixin_token_expired_decorator(func):
"""
捕获微信asess_token过期的装饰器
如果抛出WeiXinTokenExpiredException,则删除缓存中的token
并且重新执行
:param func: 执行函数
"""
def decorator(view_func):
@wraps(view_func, assigned=available_attrs(view_func))
def _wrapped_view(*args, **kwargs):
try:
return view_func(*args, **kwargs)
except WeiXinTokenExpiredException:
_delete_weixin_expired_access_token()
return view_func(*args, **kwargs)
return _wrapped_view
if func is None:
return decorator
return decorator(func)
@weixin_token_expired_decorator
def push_weixin_mini_template_msg(msg):
"""
发送模版消息
:param msg:
:return:
"""
result = {}
try:
result = _send_weixin_mini_template_msg(msg)
logging.info("_send_weixin_mini_result %s", result)
except:
if 'error_code' in result and result['error_code'] == 42001:
raise WeiXinTokenExpiredException
return result
吐槽一下,微信获取token的场景很多,别弄混了~
关于access_token过期的解决办法的更多相关文章
- Hybris license过期的解决办法
license过期编译是可以通过的,但是启动服务会报错: LICENSE VERIFICATION HAS FAILED! Your demo/develop license has expired, ...
- 使用history.back()出现"警告: 网页已过期的解决办法"
原因: 表单提交页面中使用了 session_start 函数.由于我们后退浏览的是缓存页,而该函数会强制当前页面不被缓存. 解决: PHP: 此提示出现在一个POST提交的页面,点到其它页面后,通过 ...
- 谷歌Chrome浏览器提示adobe flash player已过期完美解决办法
最近使用谷歌Chrome浏览器提示adobe flash player已过期,浏览网页时一些flash元素的东西都无法正常显示,在网上尝试寻找很多方法,都不能解决,最后,经测试有效方法如下:一:下载最 ...
- 【Oracle】ora-28001 ora-28002提示用户密码即将过期的解决办法
-- 1.首先查看用户的配置文件中的用户密码生命周期,一般情况下默认是180天.登录时系统提示ora-28002该用户即将过期 -- 可以先查看一下各用户的状态 SELECT username,PRO ...
- [经验交流] kubeadm 安装 kubernetes 一年过期的解决办法
kubeadm 是 kubernetes 提供的一个初始化集群的工具,使用起来非常方便.但是它创建的apiserver.controller-manager等证书默认只有一年的有效期,同时kubele ...
- Oracle提示密码快过期的解决办法
今天在使用ORACLE时报出如下错误:ORA-28002: the password will expire within 7 days================================ ...
- 更换mac电脑后证书过期的解决办法
http://stackoverflow.com/questions/32821189/xcode-7-error-missing-ios-distribution-signing-identity- ...
- Xshell、Xftp评估过期的解决办法
介绍一个 FTP客户端-IIS7服务器管理工具作为FTP客户端,它支持批量管理ftp站点.定时上传和定时下载,定时备份,且操作简洁.同时iis7服务器管理工具还是vnc客户端.并且支持批量管理 ...
- (转)苹果iOS开发者账号过期临时解决方法
苹果iOS开发者账号过期临时解决办法 苹果iOS开发者账号一年的费用是99美金,作者最近由于各种原因,导致renew没能在账号过期之前支付好,所以在账号过期等待renew的期间,试了试一些非正常手段, ...
随机推荐
- .net使用AsposeWord导出word table表格
本文为原创,转载请注明出处 1.前言 .net平台下导出word文件还可以使用Microsoft.Office.Interop和NPOI,但是这两者都有缺点,微软的Office.Interop组件需要 ...
- market1501的学习,跟着苏同学的博客学习
先看看官方文档:然后附上苏的博客链接http://bigbrothersue.com/index.php/2017/12/20/person-re-id/ The Market-1501 datase ...
- 高可用Redis服务架构分析与搭建
基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量 ...
- Rsync(远程同步): linux中Rsync命令的实际示例
rsync的 ( 远程同步 )为在Linux / Unix系统局部 拷贝和同步文件和目录远程以及一个最常用的命令. 随着rsync命令的帮助,您可以复制并在目录中远程和本地同步数据,在磁盘和网络,进行 ...
- [转]【C#】分享一个弹出浮动层,像右键菜单那样召即来挥则去
适用于:.net2.0+ Winform项目 背景: 有时候我们需要开一个简单的窗口来做一些事,例如输入一些东西.点选一个item之类的,可能像这样: 完了返回原窗体并获取刚刚的输入,这样做并没有什么 ...
- PHP入门学习精要
一.文件名 函数.配置文件等其他类库文件之外的一般是以.php为后缀(第三方引入的不做要求): ThinkPHP的模板文件默认是以.html 为后缀(可以通过配置修改): 二.其它命名 其它命名 规则 ...
- 工作笔记--自动切换host的python code
修改host代码: #coding:utf-8import os,timepwd = os.path.dirname(__file__) #获取当前文件夹的绝对路径pull_host_cmd = 'a ...
- FastDFS + Nginx 安装
1.安装FastDFS依赖lib包 cd /usr/local/src/ git clone https://github.com/happyfish100/libfastcommon.git cd ...
- mysql那些事
---恢复内容开始--- 登录 mysql登录 -u+用户 -p 密码 显示数据库 show databases; 使用某个数据库 use xxx; 显示数据库表 show tables 显示表结构 ...
- enable multi-tenancy on openstack pike
Multi-tenancy 是openstack ironic从Ocata版本开始支持的新特性,通过network-generic-switch插件控制交换机,Ironic可以实现在不同租户间机网络隔 ...