请注意:本页内容发布于 3581 天前,内容可能已经过时,请注意甄别。
最近给单位做了一个微信活动,由于要求甚多,现成的服务无法满足需求,最后决定从头开始开发。
由于自己的PHP、HTML和JS都是半瓶子醋(JS更是按滴算),所以编写代码的过程中遇到了不少磕磕绊绊。感谢这个信息便利的时代,大部分问题在查找资料后都得到了解决,最后活动于前两天正式上线了,除了一开始一点小意外,运行还算正常。
但是有一个问题从一开始就困扰着自己:调用微信的API需要先用微信公众号的APP ID和Secret向微信服务器申请Access Token,然后用这个Token去调用API,官方的文档中指出目前的Access Token有效期是7200秒(2小时),但是调试时Token的有效期一直在10分钟左右摇摆,活动上线后变得更加糟糕,几乎每7-8分钟就会在日志中看到某个Session下出现Token超时的记录。
最后终于找到了问题的原因,很蠢:我将Access Token理解成了一个per user而不是per APP的令牌,代码中为每个进入的用户都重复申请了token,并存储在了缓存中,于是一个新token没有失效前,如果有另一个用户进入了活动,那么这个跟公众号关联的token就会被刷新,其它用户再使用之前的token访问时,由于旧令牌已经失效,又会再次进行申请,于是陷入了恶性循环。
直到这时我才明白微信API文档中为什么要让一个「中控服务器」对Token进行存储,因为Access Token(和JS-SDK Ticket)是与公众号、而不是微信用户相关联的。
现在的问题是:由于多设计了这些没有必要的东西,数据表变得很庞大(没错,为了调用微信的JS-SDK我还为每个用户存储了JS Ticket,这同样也导致了毫无意义的频繁刷新),所以准备如果本次活动期间不出问题,就等到结束后对所有内容进行重写。
受教了