V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
goofansu
V2EX  ›  分享创造

最近在开发微信服务号,写了一个程序定时刷新 access_token 和 jsapi_ticket

  •  
  •   goofansu · 2015-06-06 05:02:39 +08:00 · 6534 次点击
    这是一个创建于 3457 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Wechat-Token

    根据微信文档,建议定时刷新access_token,逻辑服务器去取这个access_token,从而保证access_token调用不超过限制,并且总是有效。

    安装

    必要条件

    • 本机安装了redis,默认端口6379
    • 设置WECHAT_APP_ID和WECHAT_APP_SECRET环境变量

    可选条件

    • 从源码安装程序需要Erlang

    源码安装

    $ make install
    $ _rel/wt/bin/wt start
    

    从release中下载(当前仅支持linux和osx)

    $ mkdir wechat-token
    $ tar zxf linux-amd64.tar.gz -C wechat-token
    $ cd wechat-token
    $ ./bin/wt start
    

    原理

    • 每小时刷新一次access_token
    • 刷新access_token后立即刷新jsapi_ticket
    • 应用启动时判断access_token是否有效,无效则立即刷新

    数据保存格式

    $ redis-cli
    127.0.0.1:6379> HMGET access_token value expire_time
    1) "Z47I_cG9bgNm6Z44rStZd3nO6G5-c0kpBpJGdHoCfaf3Ct8R4WkuVy79FvkOgXr2CYTniDFLsmincjGtfEF7JQZU4y3ZCPDnjMmVMWLTStg"
    2) "1433506616"
    
    127.0.0.1:6379> HMGET jsapi_ticket value expire_time
    1) "sM4AOVdWfPE4DxkXGEs8VCdT_ZNcLoZWDBSBEduHE1WNupuOm2yNNmmRimx8u7lQCuD_5QpQhVSNNQ0vbRdoZw"
    2) "1433506616"
    

    项目地址: https://github.com/goofansu/wechat-token

    欢迎star, fork和pull request

    这个项目本身没难度,就是为了省去维护access_token的步骤。你的应用在调用微信api时,只需要从redis中读取access_token就行了。

    接下来考虑提供一个docker的镜像,做到传入appid和secret就能使用服务。

    说到docker就有一个问题:在阿里云上根据docker的官方文档安装docker,docker -d报错Could not find a free IP address range for interface 'docker0',这个问题有同学遇到过吗?

    12 条回复    2015-06-09 10:53:00 +08:00
    cevincheung
        1
    cevincheung  
       2015-06-06 05:45:48 +08:00
    为啥一个小daemon就可以解决的问题非得要搞这么复杂……- -#
    goofansu
        2
    goofansu  
    OP
       2015-06-06 06:24:25 +08:00
    @cevincheung 感谢回复。

    对,这是一个很简单的事情,实现方式很多,我只是想把这个封装得好一点,尽量做到开箱即用,现在安装还不算方便,所以我想如果做成docker可能会更好用。
    ETiV
        3
    ETiV  
       2015-06-06 06:40:26 +08:00 via iPhone
    我大nodejs写个setInterval 就搞定了
    cevincheung
        4
    cevincheung  
       2015-06-06 06:43:30 +08:00
    @goofansu

    一个python脚本就好了。sh也很简单,调用一下curl就可以完成的事。没必要。
    deben
        5
    deben  
       2015-06-06 07:08:57 +08:00 via Android
    随时用随时从数据库里面读出来,发现过期再请求一个并存入数据库,难道大家不这样做?
    goofansu
        6
    goofansu  
    OP
       2015-06-06 07:17:05 +08:00
    @deben 并发或者有多台逻辑服务器,都会导致重复刷新过期的access_token,单台服务器单线程肯定没问题
    deben
        7
    deben  
       2015-06-06 09:03:45 +08:00   ❤️ 1
    @goofansu 额,有道理……
    qiayue
        8
    qiayue  
       2015-06-06 09:32:44 +08:00
    @deben 我就是这么做的
    Dongdong36
        9
    Dongdong36  
       2015-06-06 09:56:45 +08:00   ❤️ 1
    文档说有效时间是7200s左右,所以每隔(7200 - 10)刷新一次access_token就可以了
    goofansu
        10
    goofansu  
    OP
       2015-06-06 10:02:18 +08:00
    @Dongdong36 对,我给的那个链接里建议1小时,所以我就定了1小时
    Culm
        11
    Culm  
       2015-06-07 19:12:17 +08:00
    看到必要条件,整个人都斯巴达了
    herold519
        12
    herold519  
       2015-06-09 10:53:00 +08:00
    过度设计了。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4555 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:53 · PVG 17:53 · LAX 01:53 · JFK 04:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.