TP5開發微信公眾號“被動回復”

瀏覽:400 發布日期:2019/06/01 分類:求助交流 關鍵字: 微信公眾號 被動回復
我看log能看到是能看到已經進行到最后一步了。


但是微信端始終沒辦法拿回我的xml,很奇怪,我在微信后臺的運維中心發現了這個。從微信日志可以看到,微信沒有從我服務器拿走最后的xml。


不太清楚是哪里出了差錯,我看了很多PHP和TP5的文檔,都是最后直接echo即可,但是微信不肯拿回我的消息,我是哪里沒設置好嘛?token的驗證是通過的<?php

namespace app\index\controller;
// header("Content-type:text/xml");
// header('Content-type: text/html; charset=utf-8');
use think\Controller;
use think\Request;
use think\Log;


// header("Content-type: text/html; charset=utf-8");
define("TOKEN","testtoken");//定義識別碼 需要跟微信公眾平臺上保持一致

class Wxtoken extends Controller{
    public function index(){
        // db('user') -> where('us_id','1') -> setField('us_ip','123');die;
        // 
        if (isset($_GET['echostr'])) {     //驗證微信
            $this->valid();
        }else{                     //回復消息
            $this->responseMsg();
        }
        // $this->responseMsg(); 
    }
 
    //微信驗證
    public function valid(){ 
        // dump($_GET);die;
        $echoStr = $_GET["echostr"]; 
        if($this->checkSignature()){ 
            echo $echoStr; 
            exit; 
        } 
    } 
 
    //檢查微信簽名
    private function checkSignature(){
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];    
                
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
// db('user') -> where('us_id','1') -> setField('us_ip','123');die;
// db('user') -> where('us_id','1') -> setField('us_ip',$RX_TYPE);
    //接收微信消息
    public function responseMsg(){
        // db('user') -> where('us_id','1') -> setField('us_ip',time());
        $poststr = file_get_contents('php://input'); 
        log::write("微信傳遞的數據".$poststr);
        // log::write();
        //如果推送消息 或者推送事件存在,進行處理
        if(!empty($poststr)){
            libxml_disable_entity_loader(true);
            $postObj = simplexml_load_string($poststr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $msgType = $postObj->MsgType;
            //判斷事件類型,進行對應事件類型處理
            switch ($msgType) {
                //當回復公眾號時
                case 'text':
                     $resultStr =  $this->handleText($postObj);
                    break;
                case 'image':
                    $resultStr =  $this->handleImage($postObj);
                    break;
                case 'voice':
                    $resultStr =  $this->handleVoice($postObj);
                    break;
                case 'video':
                    $resultStr =  $this->handleVideo($postObj);
                    break;
                case 'shortvideo':
                    $resultStr =  $this->handleShortVideo($postObj);
                    break;
                case 'location':
                    $resultStr =  $this->handleLocation($postObj);
                    break;
                case 'link':
                    $resultStr =  $this->handleLink($postObj);
                    break;
                case 'event':
                    $resultStr =  $this->handleEvent($postObj);
                    break;
                default:
                    $resultStr =  "Unknow msg type: ".$msgType;
                    break;
            }
            return $resultStr;
        }
    }
    //
    //回復消息
    public function handleText($postObj){
        $fromUsername = $postObj->FromUserName;
        $toUsername = $postObj->ToUserName;
        $keyword = trim($postObj->Content);
        $time = time();
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";             
        if(!empty( $keyword ))
        {
            $msgType = "text";
            $contentStr = "Welcome to wechat world!";
            
            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
            log::write("傳回微信的數據".$resultStr);
            // echo '12';
            echo $resultStr;
            // return $resultStr;
            // exit;
        }else{
            echo "Input something...";
        }
    }
}
最佳答案