微信入坑第二弹【自动回复消息下】

微信回复原理:

当普通微信用户向公众账号发送消息时,微信服务器首先收到用户发送的消息;

然后将用户信息和消息打包成XML格式的数据包,再将这个XML数据包通过POST方法提交到开发者设置的URL上。


疑问一:为何使用$GLOBALS["HTTP_RAW_POST_DATA"]保存POST过来的数据,而非$_POST数组?
回答:

POST只能保存标准的数据类型,对于XML、SOAP或Application/Octet-steam之类的内容则无法解析。
而$GLOBALS["HTTP_RAW_POST_DATA"]和$_POST是一样的,如果POST过来的数据PHP能够识别,则可以用$GLOBALS["HTTP_RAW_POST_DATA"]来接收。

疑问二:simplexml_load_file()各参数和返回值是什么?
回答:
参数含义
string:需要处理的XML字符串。
class:用来指定新对象,通常设置为"SimpleXMLElement",生成一个简单XML元素的类。
options:指定附加的Libxml参数,通常设置为常量LIBXML_NOCDATA,表示把CDATA设置为文本节点。
ns:一般省略
is_prefix:一般省略
函数执行完成后返回SimpleXMLElement类的一个对象。

功能:公众号只接受文字消息,且做出相应的文字回复。

<span style="font-family:Courier New;font-size:14px;"><?php
define("TOKEN","weixin");
$weixinObj = new Wechat();
$weixinObj->valid();

class Wechat{
	public function valid(){
		$echoStr = $_GET['echostr'];
		//如果是第一次接入
		if($this->checkSignature() && $echoStr ){
			echo $echoStr;
			exit;
		}else{
	    $this->responseMsg();
	   }
	}
	//校验方法
	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;
		}
	}
/* 普通文本消息
<xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 </xml>
*/
	public function responseMsg(){
	    //获取微信服务器POST请求中的数据	    
	    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
	    if( !empty($postStr) ){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);	
            $fromUser = $postObj->FromUserName;
            $toUser = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $time = time();
            
    	    $template = "<xml>
                         <ToUserName><![CDATA[%s]]></ToUserName>
                         <FromUserName><![CDATA[%s]]></FromUserName>
                         <CreateTime>%s</CreateTime>
                         <MsgType><![CDATA[%s]]></MsgType>
                         <Content><![CDATA[%s]]></Content>    	        
                         </xml>";
    	    if( strtolower($postObj->MsgType)!='text' ){
    	        $msgType = "text";
    	        $content = "我只接受文本消息";
    	    }else{
    	        $msgType = "text";
    	        if( !empty($keyword) ){
    	            $content = "您发送的消息是:".$postObj->Content;
    	        }else{
    	            $content = "请输入关键字";//消息为空
    	        }
    	    }    	    
    	    $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content);
    	    echo $info;
    	}else{
    	    echo "";
    	    exit;
    	}
    }
}</span>


功能:公众号只接受图片消息,且做出相应的文字回复。

<span style="font-family:Courier New;font-size:14px;"><?php
define("TOKEN","weixin");
$weixinObj = new Wechat();
$weixinObj->valid();

class Wechat{
	public function valid(){
		$echoStr = $_GET['echostr'];
		//如果是第一次接入
		if($this->checkSignature() && $echoStr ){
			echo $echoStr;
			exit;
		}else{
	    $this->responseMsg();
	   }
	}
	//校验方法
	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;
		}
	}
/* 接收图片消息格式
	<xml>
	<ToUserName><![CDATA[toUser]]></ToUserName>
	<FromUserName><![CDATA[fromUser]]></FromUserName>
	<CreateTime>1348831860</CreateTime>
	<MsgType><![CDATA[image]]></MsgType>
	<PicUrl><![CDATA[this is a url]]></PicUrl>
	<MediaId><![CDATA[media_id]]></MediaId>
	<MsgId>1234567890123456</MsgId>
	</xml>
*/
	public function responseMsg(){
	    //获取微信服务器POST请求中的数据	    
	    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
	    if( !empty($postStr) ){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);	
            $fromUser = $postObj->FromUserName;
            $toUser = $postObj->ToUserName;
            $time = time();
            $msgType= $postObj->MsgType;
            $picUrl = $postObj->PicUrl;
            $mediaId = $postObj->MediaId;           
            $template = "<xml>
                         <ToUserName><![CDATA[%s]]></ToUserName>
                         <FromUserName><![CDATA[%s]]></FromUserName>
                         <CreateTime>%s</CreateTime>
                         <MsgType><![CDATA[%s]]></MsgType>
                         <Content><![CDATA[%s]]></Content>
                         </xml>";
            
    	    if( strtolower($msgType)!='image' ){
    	        $msgType = "text";
    	        $content = "我只接受图片消息";
    	    }else{
    	        $msgType = "text";
    	        if( !empty( $picUrl ) ){
    	            $content = "图片链接为:".$picUrl."\n";
    	            $content .= "媒体id:".$mediaId;
    	        }else{
    	            $content = "请发送图片";//消息为空
    	        }
    	    }    	    
    	    $info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content);
    	    echo $info;
    	}else{
    	    echo "";
    	    exit;
    	}
    }
}</span>















微信入坑第二弹【自动回复消息下】

上一篇:微信小程序 新增events 用于 页面间通信接口,用于监听被打开页面发送到当前页面的数据 仅wx.navigateTo有


下一篇:微信小程序-超出显示省略号