(php)公众号与服务器之间的沟通处理

声明:这里我用的服务器是新浪SEA(实在没得备案域名啊),你的接口配置已经配置好


一、如果是php版本5以上就一定要用 $postStr=file_get_contents("php://input"); 来接收微信给你的xml消息  ($_post接收不了xml这种消息格式,  $GLOBALS['HTTP_RAW_POST_DATA'] 这个虽然可以接收下xml消息,但是对于php高版本已经没用了,况且这个效率没有 file_get_contents("php://input"); 高


二、用  $arr=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA); 这个函数来解析xml格式的数据(得到一个对象)



三、$msgType=trim($arr->MsgType);  就能得到用户发送的是什么消息过来,然后switch一下进行相应的处理


四、然后用

$res="<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";  

sprintf($res,$arr->FromUserName,$arr->ToUserName,time(),$content);

  组装好了数据以后用这种形式echo出去   (注意空格,微信官方给出的代码,里面有空格      发送到的时候,ToUserName  FromUserName的身份一定要弄明白   接收的时候To是你自己,那么发出去,From也是你自己


五、注意 发送的时候<Content><![CDATA[%s]]></Content>这里面一定要有东西  不然微信报错:无法提供服务,请稍后再试




下面是源码:


<?php
$wechatObj = new wechatCallbackapiTest();
$wechatObj->responseMsg();


class wechatCallbackapiTest
{
    




    //响应接受到微信发来的用户消息
    public function responseMsg(){
        //接受到的消息
        $postStr=file_get_contents("php://input");
        
        if(!empty($postStr)){
            //回复的消息
            $result='';
            //回复用户之前把微信发来的消息写入日志
            $handleStr=iconv('utf-8','gb2312','微信进来 '.$postStr);
            $this->logger($handleStr);
            $arr=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);
            $msgType=trim($arr->MsgType);


            switch ($msgType) {
                case 'text':
                    //处理文本消息
                    $result=$this->handleText($arr);
                    break;
                
                case 'image':
                    break;


                case 'location':
                    break;


                case 'link':
                    break;


                case 'video':
                    break;




            }


            //回复给用户的消息写入日志
            $handleStr1=iconv('utf-8','gb2312',"回复给用户的消息 \n".$result);
            $this->logger1($handleStr1);


            echo $result;

        }else{

            //    没有发送消息,官方给出的回复空串

            echo '';
            exit;
        }
        
    }


    //向用户发送消息的格式处理
    public function handleRule($arr,$content){
        $res="<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";


        return sprintf($res,$arr->FromUserName,$arr->ToUserName,time(),$content);
    }


    //处理文本消息
    public function handleText($arr){
        $keyword=trim($arr->Content);
        if(strstr($keyword,'文本')){//有文本关键字
            $content="你有点帅哦";

        }else{

                //一定要给content一个默认,不然报错

                $content='你输的什么啊,不认识你';

        }

        return $this->handleRule($arr,$content);
    }


    //写日志微信进来
    public function logger($res){
        //写入日志进文件
        file_put_contents( "saestor://domain/file/log.txt",date('Y:m:d H:i:s').' '.$res);
    }
    //写日志回复出去
    public function logger1($res){
        //写入日志进文件
        file_put_contents( "saestor://domain/file/log1.txt",date('Y:m:d H:i:s').' '.$res);
    }
}


?>



猜你喜欢

转载自blog.csdn.net/qq_36984017/article/details/81052849