TP5开发微信公众号“被动回复”

浏览:556 发布日期: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...";
        }
    }
}
最佳答案
评论( 相关
后面还有条评论,点击查看>>