php:关于微信一直无法通过php token验证, ehcho echo $echoStr; 总是提示不对的问题.

用微信官方提供的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() 的解释,  先没时间研究了, 感兴趣的可以仔细了解一下.

posted @ 2018-11-16 18:03  黑衣迷之男  阅读(1021)  评论(0编辑  收藏  举报