微信入坑第二弹【自动回复消息下】
来源:互联网 发布:淘宝作图教程 编辑:程序博客网 时间:2024/06/09 16:47
微信回复原理:
当普通微信用户向公众账号发送消息时,微信服务器首先收到用户发送的消息;
然后将用户信息和消息打包成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;"><?phpdefine("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;"><?phpdefine("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>
0 0
- 微信入坑第二弹【自动回复消息下】
- 微信入坑第二弹【自动回复消息上】
- weiphp-自动回复消息
- 微信消息自动回复开发
- itchat微信自动回复消息
- 手机自动群发QQ消息自动回复消息群发
- 微信公众号相应消息 ,自动回复消息
- 第二节 消息和事件的接受和回复
- 微信公共平台 首次关注 自动回复消息
- WRKRPYLE-自动回复询问类消息(Inquiry Message)
- 微信公众平台 自动回复图文消息
- C#开发微信公众号之消息自动回复
- java微信开发-消息接收和自动回复
- 微信开发<二>接收普通消息、自动回复
- 微信开发消息自动回复和自定义菜单简述。
- 微信公众号首次关注自动回复图文消息
- 微信开发之自动回复图文消息
- 微信公众号开发之文本消息自动回复
- C#点滴
- python读取大文件并逐行写入另外一个文件
- Role 在存储过程中不可用
- centOS中mysql一些常用操作
- 局部加权回归
- 微信入坑第二弹【自动回复消息下】
- 保险丝爆断的一瞬间……
- JVM原理和优化
- 今日BBC
- TCP/IP详解学习笔记(2)-数据链路层
- 11. Container With Most Wate
- java反射
- 如何用Java编写一段代码引发内存泄露
- Android 文件工具FileUtil