• 请不要在回答技术问题时复制粘贴 AI 生成的内容
AlexaZhou
V2EX  ›  程序员

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

  •  
  •   AlexaZhou ·
    alexazhou · Nov 7, 2015 · 5480 views
    This topic created in 3864 days ago, the information mentioned may be changed or developed.

    做微信相关开发时,需要用到 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 replies    2015-11-09 09:44:11 +08:00
    kslr
        1
    kslr  
       Nov 7, 2015
    上午的时候我也在想做一个,没想到下午已经有了,好赞
    AlexaZhou
        2
    AlexaZhou  
    OP
       Nov 7, 2015
    😄,希望这东西能对其他人有用~
    :doge:
    TangMonk
        3
    TangMonk  
       Nov 7, 2015
    有用!多谢
    qinxi
        4
    qinxi  
       Nov 7, 2015
    我用 dubbo 写了个分布式服务....
    AlexaZhou
        5
    AlexaZhou  
    OP
       Nov 7, 2015
    @TangMonk 哈哈,好开森~ 话说那个 doge 怎么打出来有人知道么?
    Phant0m
        6
    Phant0m  
       Nov 7, 2015
    放到 redis 里设置过期时间,从 redis 里取,取不到再重新获取
    orFish
        7
    orFish  
       Nov 7, 2015
    :doge:
    :octocat:
    kslr
        8
    kslr  
       Nov 7, 2015   ❤️ 1
    @AlexaZhou " " 删掉双引号
    kslr
        9
    kslr  
       Nov 7, 2015   ❤️ 1
    hzm0318hzm
        10
    hzm0318hzm  
       Nov 7, 2015
    好东西,前几天想写个练手,现在有的参考了
    Sumkor
        11
    Sumkor  
       Nov 7, 2015
    之前是写一个工具类,定时读取或写入 xml 文件实现定时刷新 access_token 的

    https://github.com/Sumkor/WeixinDemo/blob/master/src/com/util/TokenUtil.java
    bazingaterry
        12
    bazingaterry  
       Nov 7, 2015
    AlexaZhou
        13
    AlexaZhou  
    OP
       Nov 7, 2015
    @Sumkor 嗯这样也可以,就是保存在文件系统里面的话,适合只有一台服务器,不适用于有多台服务器的情况
    exploitcat
        14
    exploitcat  
       Nov 7, 2015
    :doge:
    20150517
        15
    20150517  
       Nov 8, 2015
    我就是放在了 redis 里,然后设置 expire 就可以了,不是满简单的么, 不用这么造轮子
    restran
        16
    restran  
       Nov 8, 2015   ❤️ 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
       Nov 8, 2015
    @restran 呃,你说的对,赞眼力~
    我写的时候是一方面是考虑了通用性,比如我们现在有用到其他类似的接口,但是并没有返回 expire_in ,另外一方面是微信接口这种使用广泛的东西,不太可能会突然修改,所以就先按照固定时间刷新了。

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

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

    可能比较难测试出来,但一定有这样的可能
    aprikyblue
        19
    aprikyblue  
       Nov 8, 2015
    FingerLiu
        20
    FingerLiu  
       Nov 9, 2015
    200k00k3y9.jpg redis + 1
    zhangxiaoman
        21
    zhangxiaoman  
       Nov 9, 2015
    :doge: redis + 1
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2827 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 75ms · UTC 09:52 · PVG 17:52 · LAX 02:52 · JFK 05:52
    ♥ Do have faith in what you're doing.