最近在做微信公众平台的服务器端,测试什么的都比较顺利,申请一个沙盒测试号就能满足一切正式环境的需求。
然而昨天在配置到正式环境中的时候出了问题了,一直都是验证token失败,第一次偶尔会出现URL超时,查了一整晚,一开始以为是权限的问题无法修改配置(我是运营者),但后来看了下安全中心,我们未开启配置权限限制。后来又列了很多原因,最后想起我们的正式环境曾经配置过一个微信管家jeewx(一个java写的微信公众平台管理平台,可视化,很方便,然而没什么卵用,微信已经推出了很多方便开发者的功能,而且我们的项目需要获取openid绑定链接,这个管家也没有直接实现的途径),遂百度之,百度了很久终于找到了C站的一个帖子,看到了我想要的答案。
好了不废话了,先大致讲下这个问题的原因:
由于正式环境绑定过java环境的服务器,于是在腾讯服务器的输出缓存区留下了对应本账号的验证缓存,导致我第二次想去验证我sae上用php搭建的服务器时,验证被阻断(log里面有记录,自己调试也能返回echostr(随机字符串,签名生成材料之一),但就是验证不通过)。我是一只小前端,php和java都不熟,不敢妄自装X,所以以上为大致推测,不敢保证是否完全如我所述,但可以肯定的是,原因肯定在之前那个微信管家上面(好坑啊,有这种问题用户手册里也不写),因为我在微信管家上又验证了3个测试号,结果都是本来用自己的服务器验证的正常,在第三方管理平台验证后,自己的服务器就没办法通过验证了。
讲完了原因,重点来了,怎么解决呢?
很简单,php下是ob_clean(); 没错,就是这一小搓API,其目的是为了清除输出缓存区,在自己的代码里添加这个之后自己的代码就能正常验证了。这段代码具体放置位置的话在官方demo里是在valid方法的echo $echoStr之前
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
<span style="background-color: rgb(255, 255, 51);">echo $echoStr;</span>
exit;
}
}
我用的是LaneWechat的框架,也能找到相似的函数isValid,也是在return前加下就好了,不加的话,微信就直接pass你的验证请求,重要的话说三遍,直接pass,直接pass。
java的话我不清楚,但遇到这个问题应该也有对应的解决方案。
关于输出缓冲区,这里有一篇关于c++的blog挺直白的--C++编程对缓冲区的理解。
特此留念,防止被坑。