用微信官方提供的demo验证token 老是失败, 但是我自己用IIS 加 .net , token就能登录成功, 后来debug, 找各种问题,总是不能解决.
最后还是再搜了搜. 找到这么一篇解决方案.原文在这里:
https://www.cnblogs.com/donlyn/p/5675483.html
解决方案:
最终在echo $_GET['echostr'];前添加了一句代码ob_clean();
1 <?php 2 //设置token 3 define("TOKEN", "sohovan2"); 4 5 //新建object 6 $wechatObj = new wechatCallbackapiTest(); 7 //没有得到echostr 回声, 先验证 8 //如果不是get操作. get有没有这个echostr. 9 if (!isset($_GET['echostr'])) { 10 11 }else{ 12 //如果是get操作, 并且是非空. 13 //验证消息; 14 $wechatObj->valid(); 15 } 16 17 class wechatCallbackapiTest 18 { 19 //验证消息 20 public function valid() 21 { 22 $echoStr = $_GET["echostr"]; 23 //返回的是简单,去掉参数 24 header("content-type:text;charset=utf-8"); 25 if($this->checkSignature()){ 26 ob_clean(); 27 echo $echoStr; 28 exit; 29 } 30 } 31 32 //检查签名 33 private function checkSignature() 34 { 35 $signature = $_GET["signature"]; 36 $timestamp = $_GET["timestamp"]; 37 $nonce = $_GET["nonce"]; 38 $token = TOKEN; 39 $tmpArr = array($token, $timestamp, $nonce); 40 //排序. 41 sort($tmpArr, SORT_STRING); 42 //数组的值转化成字符串. 43 $tmpStr = implode($tmpArr); 44 //sha1 45 $tmpStr = sha1($tmpStr); 46 47 if($tmpStr == $signature){ 48 return true; 49 }else{ 50 return false; 51 } 52 } 53 54 //是否是GET提交 55 public function isGet(){ 56 return $_SERVER['REQUEST_METHOD'] == 'GET' ? true : false; 57 } 58 ?>
这里面有关于php输出缓冲区, 和ob_clean() 的解释, 先没时间研究了, 感兴趣的可以仔细了解一下.