最近在开发微信服务号,写了一个程序定时刷新 access_token 和 jsapi_ticket - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
goofansu
V2EX    分享创造

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

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

    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  
    PRO
       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     Solana     2879 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 14:51 PVG 22:51 LAX 06:51 JFK 09:51
    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