用 tornado 写了个定时刷新微信 access_token 的玩意儿 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
AlexaZhou
V2EX    程序员

用 tornado 写了个定时刷新微信 access_token 的玩意儿

 
  •   AlexaZhou
    alexazhou 2015-11-07 17:30:36 +08:00 5187 次点击
    这是一个创建于 3707 天前的主题,其中的信息可能已经有所发展或是发生改变。

    做微信相关开发时,需要用到 access_token ,而从微信服务器获取的 access_token ,有效期只有一段时间(目前为 7200 秒)。 access_token 过期后就无法使用,需要重新获取。而每次获取新的 access_token 之后,老的 access_token 自动失效。

    这种情况下如果在 web 应用的各个逻辑点对 token 进行刷新,很容易出现冲突。所以最好在一个单独的服务里面处理定时刷新 token 的工作。

    TokenBoy 就是为了解决这个问题而存在。

    TokenBoy 每隔一段时间自动去微信服务器刷新 Token ,保存在内存中,再通过一个 web 接口提供 token 给本地其他程序。

    传送门: https://github.com/alexazhou/TokenBoy

    21 条回复    2015-11-09 09:44:11 +08:00
    kslr
        1
    kslr  
       2015-11-07 17:31:27 +08:00
    上午的时候我也在想做一个,没想到下午已经有了,好赞
    AlexaZhou
        2
    AlexaZhou  
    OP
       2015-11-07 17:33:26 +08:00
    ,希望这东西能对其他人有用~
    :doge:
    TangMonk
        3
    TangMonk  
       2015-11-07 17:35:58 +08:00
    有用!多谢
    qinxi
        4
    qinxi  
       2015-11-07 17:36:35 +08:00
    我用 dubbo 写了个分布式服务....
    AlexaZhou
        5
    AlexaZhou  
    OP
       2015-11-07 17:40:33 +08:00
    @TangMonk 哈哈,好开森~ 话说那个 doge 怎么打出来有人知道么?
    Phant0m
        6
    Phant0m  
       2015-11-07 17:43:22 +08:00
    放到 redis 里设置过期时间,从 redis 里取,取不到再重新获取
    orFish
        7
    orFish  
       2015-11-07 17:45:50 +08:00
    :doge:
    :octocat:
    kslr
        8
    kslr  
       2015-11-07 17:48:18 +08:00   1
    @AlexaZhou " " 删掉双引号
    kslr
        9
    kslr  
       2015-11-07 17:48:54 +08:00   1
    hzm0318hzm
        10
    hzm0318hzm  
       2015-11-07 19:36:11 +08:00
    好东西,前几天想写个练手,现在有的参考了
    Sumkor
        11
    Sumkor  
       2015-11-07 19:43:25 +08:00
    之前是写一个工具类,定时读取或写入 xml 文件实现定时刷新 access_token 的

    https://github.com/Sumkor/WeixinDemo/blob/master/src/com/util/TokenUtil.java
    bazingaterry
        12
    bazingaterry  
       2015-11-07 19:48:46 +08:00
    AlexaZhou
        13
    AlexaZhou  
    OP
       2015-11-07 20:36:08 +08:00
    @Sumkor 嗯这样也可以,就是保存在文件系统里面的话,适合只有一台服务器,不适用于有多台服务器的情况
    exploitcat
        14
    exploitcat  
       2015-11-07 21:17:52 +08:00
    :doge:
    20150517
        15
    20150517  
       2015-11-08 07:22:37 +08:00
    我就是放在了 redis 里,然后设置 expire 就可以了,不是满简单的么, 不用这么造轮子
    restran
        16
    restran  
       2015-11-08 10:51:01 +08:00   1
    好像没有检查获取 access_token 时返回的 expire_in

    > 目前 access_token 的有效期通过返回的 expire_in 来传达,目前是 7200 秒之内的值。中控服务器需要根据这个有效时间提前去刷新新 access_token 。

    参考文档
    https://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html
    AlexaZhou
        17
    AlexaZhou  
    OP
       2015-11-08 12:56:57 +08:00
    @restran 呃,你说的对,赞眼力~
    我写的时候是一方面是考虑了通用性,比如我们现在有用到其他类似的接口,但是并没有返回 expire_in ,另外一方面是微信接口这种使用广泛的东西,不太可能会突然修改,所以就先按照固定时间刷新了。

    后面想办法给这个地方处理一下
    AlexaZhou
        18
    AlexaZhou  
    OP
       2015-11-08 13:10:21 +08:00
    @20150517
    你的方法是不是把 Token 放在 redis 里面,然后在业务逻辑中,先尝试从 redis 获取 token ,获取不到则从微信服务器刷新 token 再存入 redis 并设置有效期。

    这样一般没事,只是如果有多台 web 服务器,有可能在 token 过期的时候,同时都去刷新了 token ,就混乱了。

    可能比较难测试出来,但一定有这样的可能
    aprikyblue
        19
    aprikyblue  
       2015-11-08 14:09:02 +08:00
    FingerLiu
        20
    FingerLiu  
       2015-11-09 09:33:30 +08:00
    200k00k3y9.jpg redis + 1
    zhangxiaoman
        21
    zhangxiaoman  
       2015-11-09 09:44:11 +08:00
    :doge: redis + 1
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2949 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:28 PVG 18:28 LAX 02:28 JFK 05:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86