tp5连接微信公众号的问题

在一个业务需求的驱使下,笔者尝试着处理把微信公众号的服务器配置的url绑定到tp5中,就是以tp5作为后端服务,提供API服务。

网上找了很多都不是自己要找的,天随人愿,终于看到了这么一篇文章:微信公众号连接thinkphp5

正是自己想要找的,如果大家想要关注的话,请关注他(QQ:820032120),也是在这个作者的帮助下,解决了这个问题,很热心的一个小伙。

好的,基于他提供的方案,应该是没有问题,但是我根据这个实践,发现有问题,老是报错:

为了方便测试,我新建了一个模块,命名为:weixin

然后在这个模块的控制器中把以下代码贴进去:

<?php 
 namespace app\weixin\controller;
 use think\Controller;
 use think\Loader;
 use think\Session;

class Index extends Controller{

public function Index(){

//验证消息
 if(isset($_GET['echostr'])){
 $echoStr = $_GET["echostr"];
 if($this->checkSignature()){
 header('content-type:text');
 echo $echoStr;
 exit;
 }
 }else{
 
 }
 }

//检查签名
 private function checkSignature()
 {
 $signature = $_GET["signature"];
 $timestamp = $_GET["timestamp"];
 $nonce = $_GET["nonce"];
 $token = 'zuijiadaxueweixin';
 $tmpArr = array($token, $timestamp, $nonce);
 sort($tmpArr, SORT_STRING);
 $tmpStr = implode($tmpArr);
 $tmpStr = sha1($tmpStr);

if($tmpStr == $signature){
 return true;
 }else{
 return false;
 }
 }

}

?>

这个注意与原创作者相互区别,做个对比的话,这里其实也就是把响应消息删除了。

原创的写法如下:

<?php
namespace app\weixin\controller;
use \think\Request;
use think\Db;

class Index {

public function Index(){
 //验证消息
 if(isset($_GET['echostr'])){ //微信服务器和你的服务器第一次通讯会带上echostr
 $echoStr = $_GET["echostr"];
 if($this->checkSignature()){
 header('content-type:text');
 echo $echoStr;
 exit;
 }
 }else{
 $this -> responseMsg();
 }
 }

//检查签名
 private function checkSignature()
 {
 $signature = $_GET["signature"];
 $timestamp = $_GET["timestamp"];
 $nonce = $_GET["nonce"];
 $token = '123456798';
 $tmpArr = array($token, $timestamp, $nonce);
 sort($tmpArr, SORT_STRING);
 $tmpStr = implode($tmpArr);
 $tmpStr = sha1($tmpStr);

if($tmpStr == $signature){
 return true;
 }else{
 return false;
 }
 }

//响应消息
 public function responseMsg()
 { 
     $postStr = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS["HTTP_RAW_POST_DATA"]  : "" ;
     if (!empty($postStr)){
         $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
         $RX_TYPE = trim($postObj->MsgType);
         switch ($RX_TYPE)
         {
             case "event":
                 $result = $this->receiveEvent($postObj);
                 break;
             case "text":
                 $result = $this->receiveText($postObj);
                 break;
             case "image":
                 $result = $this->receiveImage($postObj);
                 break;
             case "location":
                 $result = $this->receiveLocation($postObj);
                 break;
             case "voice":
                 $result = $this->receiveVoice($postObj);
                 break;
             case "video":
                 $result = $this->receiveVideo($postObj);
                 break;
             case "link":
                 $result = $this->receiveLink($postObj);
                 break;
             default:
                 $result = "unknown msg type: ".$RX_TYPE;
                 break;
         }
         echo $result;
     }
 }

public function testinfo(){
 echo "hello world";
 }
}

在笔者的实践下,发现这个有点问题,就是报错,但是排查了,错误没有消除。后来就有了我上面的那个精简版。这个是在实践中获得验证的,没有报错。其实阅读起来也很容易理解:一个是检查消息、另一个是验证签名。

如果还需要有响应消息,应该是要把原创作者的后面那部分加上去。但是根据自己的实践,当我们把响应消息加上去的时候,又报错了,所以之所以作者写的方法报错,那么报错的地方应该是响应消息那块。大家在实践的时候,多多留意。

这里来个题外话,在解决这个问题的过程中,花了很长时间处理git的排错,笔者开着两台电脑,两边都编辑着同一个文件夹下的内容,然后就是两边提交,后面就发生冲突了。后面总是报错,什么冲突没有解决之类的,或者是提交之类的,但是还有一种情况也发生了,情况是这样的,我其中一台是用的linux桌面版,另一台是用的是windows,结果当我从windows系统编辑完成后提交的东西,我在linux上打开会多了一些符号:^M,这个是windows的换行符,平常我们是看不到的,需要特殊的编辑器才行。

本来这里一直发现没有啥问题的,可是一直报错,却不知道哪里有问题,这个时候,我们不妨用linux的Emditor编辑器.

未经允许不得转载:哈勃私语 » tp5连接微信公众号的问题

本文共2987个字 创建时间:2018年3月25日0:43   

分享到:更多 ()