自动回复微信消息

<?php  
  
$testObj = new Wechat();  
  
if(!emptyempty($_GET[‘echostr‘])){  
      
    $testObj->valid();  
      
}else{  
      
    $testObj->responseMsg();  
}  
  
exit;  
  
class Wechat 
{  
    /** 
     * 绑定url、token信息 
     */  
    public function valid(){  
        $echoStr = $_GET["echostr"];  
        if ($this->checkSignature()) {  
            echo $echoStr;  
        }  
        exit();  
    }  
    /** 
     * 检查签名,确保请求是从微信发过来的 
     */  
    private function checkSignature()  
    {  
        $signature = $_GET["signature"];  
        $timestamp = $_GET["timestamp"];  
        $nonce = $_GET["nonce"];      
                  
        $token = "test123";//与在微信配置的token一致,不可泄露  
        $tmpArr = array($token, $timestamp, $nonce);  
        sort($tmpArr);  
        $tmpStr = implode( $tmpArr );  
        $tmpStr = sha1( $tmpStr );  
          
        if( $tmpStr == $signature ){  
            return true;  
        }else{  
            return false;  
        }  
    }  
  
    /** 
     * 接收消息,并自动发送响应信息 
     */  
    public function responseMsg(){  
          
        //验证签名  
        if ($this->checkSignature()){  
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
            $this->log_request_info();  
      
            //提取post数据  
            if (!emptyempty($postStr)){  
                    $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);  
                    $fromUsername = $postObj->FromUserName;//发送人  
                    $toUsername = $postObj->ToUserName;//接收人  
                    $MsgType = $postObj->MsgType;//消息类型  
                    $MsgId = $postObj->MsgId;//消息id  
                    $time = time();//当前时间做为回复时间  
                      
                    //如果是文本消息(表情属于文本信息)  
                    if($MsgType == ‘text‘){  
                        $content = trim($postObj->Content);//消息内容  
                        if(!emptyempty( $content )){  
                              
                            //如果文本内容是图文,则回复图文信息,否则回复文本信息  
                            if($content == "图文"){  
                                  
                                //回复图文消息,ArticleCount图文消息个数,多条图文消息信息,默认第一个item为大图  
                                $ArticleCount = 2;   
                                $newsTpl = "<xml>  
                                <ToUserName><![CDATA[%s]]></ToUserName>  
                                <FromUserName><![CDATA[%s]]></FromUserName>  
                                <CreateTime>%s</CreateTime>  
                                <MsgType><![CDATA[%s]]></MsgType>  
                                <ArticleCount>%s</ArticleCount>  
                                <Articles>  
                                <item>  
                                <Title><![CDATA[%s]]></Title>   
                                <Description><![CDATA[%s]]></Description>  
                                <PicUrl><![CDATA[%s]]></PicUrl>  
                                <Url><![CDATA[%s]]></Url>  
                                </item>  
                                <item>  
                                <Title><![CDATA[%s]]></Title>  
                                <Description><![CDATA[%s]]></Description>  
                                <PicUrl><![CDATA[%s]]></PicUrl>  
                                <Url><![CDATA[%s]]></Url>  
                                </item>  
                                </Articles>  
                                </xml>";  
                                $resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time, ‘news‘,   
                                            $ArticleCount,‘我是图文信息‘,‘我是描述信息‘,‘http://www.test.com/DocCenterService/image?photo_id=236‘,  
                                            ‘http://www.test.com‘,‘爱城市网正式开通上线‘,‘描述2‘,‘http://jn.test.com/ac/skins/img/upload/img/20131116/48171384568991509.png‘,  
                                            ‘http://www.test.com‘);  
                                echo $resultStr;  
                                $this->log($resultStr);  
                            }else{  
                                //回复文本信息  
                                $textTpl = "<xml>  
                                            <ToUserName><![CDATA[%s]]></ToUserName>  
                                            <FromUserName><![CDATA[%s]]></FromUserName>  
                                            <CreateTime>%s</CreateTime>  
                                            <MsgType><![CDATA[%s]]></MsgType>  
                                            <Content><![CDATA[%s]]></Content>  
                                            <FuncFlag>0</FuncFlag>  
                                            </xml>";               
                                $contentStr = ‘你发送的信息是:接收人:‘.$toUsername.‘,发送人:‘.$fromUsername.‘,消息类型:‘.$MsgType.‘,消息内容:‘.$content.‘ www.icity365.com‘;  
                                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, ‘text‘, $contentStr);  
                                echo $resultStr;  
                                $this->log($resultStr);  
                            }  
                        }else{  
                            echo "Input something...";  
                            $this->log($resultStr);  
                        }  
                          
                      //如果是图片消息  
                    }elseif ($MsgType == ‘image‘){  
                        $MediaId = $postObj->MediaId;//图片消息媒体id,可以调用多媒体文件下载接口拉取数据。  
                        $imageTpl = "<xml>  
                                    <ToUserName><![CDATA[%s]]></ToUserName>  
                                    <FromUserName><![CDATA[%s]]></FromUserName>  
                                    <CreateTime>%s</CreateTime>  
                                    <MsgType><![CDATA[%s]]></MsgType>  
                                    <Image>  
                                    <MediaId><![CDATA[%s]]></MediaId>  
                                    </Image>  
                                    </xml>";  
                        $resultStr = sprintf($imageTpl, $fromUsername, $toUsername, $time, $MsgType, $MediaId);  
                        echo $resultStr;  
                        $this->log("自动响应图片信息");  
                        $this->log($resultStr);  
                          
                    //如果是视频  
                    }else if($MsgType == ‘video‘){  
                        $MediaId = $postObj->MediaId;//视频消息媒体id,可以调用多媒体文件下载接口拉取数据。  
                        $ThumbMediaId = $postObj->ThumbMediaId;//视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。   
                        $videoTpl = "<xml>  
                                    <ToUserName><![CDATA[%s]]></ToUserName>  
                                    <FromUserName><![CDATA[%s]]></FromUserName>  
                                    <CreateTime>%s</CreateTime>  
                                    <MsgType><![CDATA[%s]]></MsgType>  
                                    <Video>  
                                    <MediaId><![CDATA[%s]]></MediaId>  
                                    <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>  
                                    <Title><![CDATA[%s]]></Title>  
                                    <Description><![CDATA[%s]]></Description>  
                                    </Video>   
                                    </xml>";  
                        $resultStr = sprintf($videoTpl, $fromUsername, $toUsername, $time, $MsgType, $MediaId,$ThumbMediaId,‘我是标题‘,‘我是描述‘);  
                        echo $resultStr;  
                        $this->log("自动响应视频信息".$ThumbMediaId);  
                        $this->log($resultStr);  
                          
                    //如果是地理位置  
                    }else if($MsgType == ‘location‘){  
                        $Location_X = $postObj->Location_X;//维度  
                        $Location_Y = $postObj->Location_Y;//经度  
                        $Scale = $postObj->Scale;//地图缩放大小  
                        $Label = $postObj->Label;//地里位置信息  
                          
                        //回复文本信息  
                        $textTpl = "<xml>  
                                    <ToUserName><![CDATA[%s]]></ToUserName>  
                                    <FromUserName><![CDATA[%s]]></FromUserName>  
                                    <CreateTime>%s</CreateTime>  
                                    <MsgType><![CDATA[%s]]></MsgType>  
                                    <Content><![CDATA[%s]]></Content>  
                                    <FuncFlag>0</FuncFlag>  
                                    </xml>";               
                        $msgType = "text";  
                        $contentStr = ‘经度:‘.$Location_Y.‘,维度:‘.$Location_X.‘,地图缩放大小‘.$Scale.‘,地理位置信息:‘.$Label;  
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);  
                        echo $resultStr;  
                        $this->log($resultStr);  
                          
                    //如果是事件  
                    }else if($MsgType == ‘event‘){  
                          
                        $Event = $postObj->Event;  
                          
                        //subscribe(关注,也叫订阅)  
                        if($Event == ‘subscribe‘){  
                              
                            $EventKey = $postObj->EventKey;//事件KEY值,qrscene_为前缀,后面为二维码的参数值  
                              
                            //未关注时,扫描二维码  
                            if(!emptyempty($EventKey)){  
                                $Ticket = $postObj->Ticket;//二维码的ticket,可用来换取二维码图片  
                                $this->log($fromUsername.‘扫描二维码关注!EventKey=‘.$EventKey.‘,Ticket=‘.$Ticket);  
                            }else{  
                                $this->log($fromUsername.‘关注我了!‘);  
                            }  
                              
                        //unsubscribe(取消关注)  
                        }elseif ($Event == ‘unsubscribe‘){  
                            $this->log($fromUsername.‘取消关注我了!‘);  
                              
                        //已关注时,扫描二维码事件  
                        }elseif($Event == ‘SCAN‘ || $Event == ‘scan‘){  
                            $EventKey = $postObj->EventKey;//事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id  
                            $Ticket = $postObj->Ticket;//二维码的ticket,可用来换取二维码图片  
                            $this->log($fromUsername.‘关注我了!EventKey=‘.$EventKey.‘,Ticket=‘.$Ticket);  
                          
                        //菜单点击事件  
                        }elseif($Event == ‘CLICK‘){  
                            $EventKey = $postObj->EventKey;//事件KEY值,与自定义菜单接口中KEY值对应  
                            //回复文本信息  
                            $textTpl = "<xml>  
                                        <ToUserName><![CDATA[%s]]></ToUserName>  
                                        <FromUserName><![CDATA[%s]]></FromUserName>  
                                        <CreateTime>%s</CreateTime>  
                                        <MsgType><![CDATA[%s]]></MsgType>  
                                        <Content><![CDATA[%s]]></Content>  
                                        <FuncFlag>0</FuncFlag>  
                                        </xml>";               
                            $contentStr = ‘你点击了菜单,菜单项key=‘.$EventKey;  
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, ‘text‘, $contentStr);  
                            echo $resultStr;  
                            $this->log($resultStr);  
  
                        //其他事件类型  
                        }else{  
                            $this->log(‘事件类型:‘.$Event);  
                        }  
                          
                    //其他消息类型,链接、语音等  
                    }else{  
                        //回复文本信息  
                        $textTpl = "<xml>  
                                    <ToUserName><![CDATA[%s]]></ToUserName>  
                                    <FromUserName><![CDATA[%s]]></FromUserName>  
                                    <CreateTime>%s</CreateTime>  
                                    <MsgType><![CDATA[%s]]></MsgType>  
                                    <Content><![CDATA[%s]]></Content>  
                                    <FuncFlag>0</FuncFlag>  
                                    </xml>";               
                        $contentStr = ‘消息类型:‘.$MsgType.‘我们还没做处理。。。。【爱城市网】‘;  
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, ‘text‘, $contentStr);  
                        echo $resultStr;  
                        $this->log($resultStr);  
                    }  
      
            }else {  
                echo "";  
                exit;  
            }  
        }else{  
                $this->log("验证签名未通过!");        
        }  
    }  
    /** 
     * 记录请求信息 
     */  
    function log_request_info() {  
        $post = ‘‘;  
        foreach($_POST   as   $key   =>   $value)   {   
            $post = $post.$key.‘ : ‘.$value.‘ , ‘;   
        }   
        $get = ‘‘;  
        foreach($_GET   as   $key   =>   $value)   {   
            $get = $get.$key.‘ : ‘.$value.‘ , ‘;   
        }   
        $this->log("get信息:".$get);  
        $this->log("post信息:".$post);  
    }  
    /** 
     * 记录日志 
     * @param $str 
     * @param $mode 
     */  
    function log($str){  
        $mode=‘a‘;//追加方式写  
        $file = "log.txt";  
        $oldmask = @umask(0);  
        $fp = @fopen($file,$mode);  
        @flock($fp, 3);  
        if(!$fp)  
        {  
            Return false;  
        }  
        else  
        {  
            @fwrite($fp,$str);  
            @fclose($fp);  
            @umask($oldmask);  
            Return true;  
        }  
    }   
}  
  
?>

时间: 2024-10-10 16:23:56

自动回复微信消息的相关文章

asp.net C# 微信消息自动回复 asp.net版

//asp.net C# 微信消息自动回复 asp.net版 protected void Page_Load(object sender, EventArgs e) { if (Request.HttpMethod == "POST") { string weixin = ""; weixin = PostInput();//获取xml数据 if (!string.IsNullOrEmpty(weixin)) { ResponseMsg(weixin);////调

详解微信开发者文档——3接收用户文本消息并自动回复文本消息

写在前面的话:上一篇介绍了如何将自己的服务器与微信公众平台进行连接,连接成功之后就可以与微信进行交互了,这一篇介绍最简单的情形,接收用户文本消息,并自动回复文本消息,如果能够实现这个功能,那么我们就能够轻松的实现接收不同的用户消息,并根据业务需要回复用户不同类型的消息,更复杂的在下一篇中讲解. =====正文开始===== 当微信用户向公众号发送消息时,微信服务器会将该消息发送至我们填写的URL中,我们在后台就能够写代码实现接收消息---处理消息----回复消息的操作. 这里有几点需要注意: 1

Python快速搭建自动回复微信公众号

Python快速搭建自动回复微信公众号 在之前的一篇文章 Python利用 AIML 和 Tornado 搭建聊天机器人微信订阅号 中用 aiml 实现了一个简单的英文聊天机器人订阅号.但是只能处理英文消息,现在用 图灵机器人 来实现一个中文的聊天机器人订阅号. 这里主要介绍如何利用 Python 的 Tornado Web框架以及wechat-python-sdk 微信公众平台 Python 开发包来快速搭建微信公众号. 完整的公众号代码 GitHub 地址:green ,由于目前此公众号有一

2.转发。基于itchat的微信消息同步机器人

原文:https://www.jianshu.com/p/7aeadca0c9bd# 看到了该网址有基于itchat的微信消息同步机器人,转过来继续研究.以下是转过来的: 最近 全栈数据工程师养成攻略 的微信群已经将近500人,开了二群之后为了打通不同微信群之间的消息,花了点时间做了个消息同步机器人,在任意群收到消息时同步到其他群,并且将聊天内容上传至数据库,以供进一步分析.统计和展示. 基本思路是,用 Python 模拟微信网页版登陆,接收到群里消息后,对文本.图片.分享等各类消息类型分别处理

一个还算简单的微信消息SDK(基于.Net Standard 2.0)

虽然微信公众号出现了好久,不过在SDK这件事情上感觉并没有多少人把它当成一个有技术含量的事情来做,很多SDK做的事情就是一个代码的堆叠,当然也可能写的好的并没有开源出来.所以在某个翻遍Github而无所获的下午我写了一个基础的基于事件的微信消息类,今年初我把它放到了github和开源中国上并逐步完善,这篇文章就是简单介绍OSS开源系列下的微信消息模块SDK的使用方式,主要围绕以下几个方面分解: 一. 全局介绍 二. 配置管理 三. 框架使用 1. 框架组成元素 2. 框架支持的模式 四. 生命周

微信消息的处理和应答

1.微信消息应答流程微信服务器是客户手机和开发服务器信息流通的桥梁.消息流程图如下: 2.微信服务器向开发服务器请求消息1)文本消息处理2)事件消息处理3)开发者认证处理 微信消息处理入口操作,代码示例如下: public void ProcessRequest(HttpContext context) { //WHC.Framework.Commons.LogTextHelper.Info("测试记录"); string postString = string.Empty; if (

微信消息回复

微信消息回复的实例代码 具体的看一下我带的simplexml_load_string()函数的博客解析 (数据的变化类型和数据传输才是数据的流向) <?php class IndexController extends CommonController{ //加载首页 public function Index(){ //define your token $wechatObj = new wechatCallbackapiTest(); //判定变量 if(isset($_GET['echos

脱离微信客户端发送微信消息(二)

Python版本:使用微信API发送微信消息 本文代码借用朋友编写的成品代码,使用Python3编写,配合上一篇文章:<脱离微信客户端发送微信消息(一)>经过试验完全可以发送微信消息. 文件:BaseData.py Python3代码: 1 # -*- coding: utf-8 -*- 2 3 corpid="XXXXXXX" # 设置-权限设置-部门-查看CorpID 4 corpsecret="YYYYYYYYYY" # 设置-权限设置-部门-查看

微信消息中的CreateTime转换成标准格式的时间

/** * 将微信消息中的CreateTime转换成标准格式的时间(yyyy-MM-dd HH:mm:ss) * * @param createTime 消息创建时间 * @return */ public static String formatTime(String createTime) { // 将微信传入的CreateTime转换成long类型,再乘以1000 long msgCreateTime = Long.parseLong(createTime) * 1000L; DateFo