V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
AlexaZhou
V2EX  ›  程序员

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

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

    做微信相关开发时,需要用到 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   ·   实用小工具   ·   5363 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:59 · PVG 13:59 · LAX 21:59 · JFK 00:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.