微信开发中的消息验证与消息回复
来源:互联网 发布:人工蜂群算法工具箱 编辑:程序博客网 时间:2024/06/05 08:35
微信开发中的消息验证与消息回复
处理逻辑
- 判断微信服务器传来的数据是否含有名为echostr的GET参数
- 有则进行服务器消息验证(valid)
- 没有则微信推送过来的是一条消息,需要我们处理。
消息类型分为
1)事件类型:用户关注/取消关注事件、扫描二维码事件……
2)被动回复类型:用户发送过来一条文字、图片、语音……
然后根据需求回复相应的文字、图片、图文….
代码示例
<?phpdefine("TOKEN","###your token###");require_once 'response.class.php';$res=new response();if(!isset($_GET['echostr'])){ responseMsg();}else{ valid();}function valid(){ /* @微信服务器消息验证 * * 1)将token、timestamp、nonce三个参数进行字典序排序 * 2)将三个参数字符串拼接成一个字符串进行sha1加密 * 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 * * */ $echoStr=$_GET['echostr']; $signature=$_GET['signature']; $timestamp=$_GET['timestamp']; $nonce=$_GET['nonce']; $token=TOKEN; $tmpArr=array($token,$timestamp,$nonce); sort($tmpArr,SORT_STRING); $tmpStr=implode($tmpArr); $tmpStr=sha1($tmpStr); if($tmpStr==$signature){ echo $echoStr; exit(); }}function responseMsg(){ /* @获取微信推送过来的post数据(xml) * * 以下旧的提取方式,php高版本已经废弃了 * $postStr=$GLOBALS['HTTP_RAW_POST_DATA']; * * */ $postStr=file_get_contents("php://input"); /* @将xml数据转化为obj * * */ $postObj=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA); /* @根据接收到的不同消息,进行相应回复 * 1.用户关注事件 * 2.用户发送消息被动回复 * * */ if(strtolower($postObj->MsgType)=='event'){ if(strtolower($postObj->Event)=='subscribe'){//用户关注事件 $content="欢迎关注XXXX"; responseText($postObj, $content); } }else if(strtolower($postObj->MsgType)=='text'){ switch(trim($postObj->Content)){ /*被动回复文本信息*/ case 'test': $content="this is test!"; responseText($postObj, $content); break; case 'time': $content="现在是北京时间:".date("Y-m-d H:i:s",time()); responseText($postObj, $content); break; case 'website': $content="<a href='http://www.hewie.cn'>乘风破浪</a>"; responseText($postObj, $content); break; /*被动回复图文信息*/ case 'news': $arr=array( array( 'title'=>'我的csdn博客', 'description'=>'欢迎访问我的csdn博客', 'picUrl'=>'http://avatar.csdn.net/9/5/4/1_somehow1002.jpg', 'url'=>'http://blog.csdn.net/somehow1002', ), array( 'title'=>'开源中国', 'description'=>'。。。。。', 'picUrl'=>'https://www.oschina.net/img/ie/logo_osc.png','', 'url'=>'https://www.oschina.net/', ), ); responseNews($postObj, $arr); break; default: $content="sorry, I don't understand!"; $res->responseText($postObj, $content); break; } }}function responseText($postObj,$content){ /* @文字消息回复格式 * * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>12345678</CreateTime> * <MsgType><![CDATA[text]]></MsgType> * <Content><![CDATA[你好]]></Content> * </xml> * * */ $fromUserName=$postObj->ToUserName; $toUserName=$postObj->FromUserName; $time=time(); $msgType='text'; $template="<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; echo sprintf($template,$toUserName,$fromUserName,$time,$msgType,$content);}function responseNews($postObj,$arr){ /* @图文消息回复格式 * #一个item一则图文消息 * * <xml> * <ToUserName><![CDATA[toUser]]></ToUserName> * <FromUserName><![CDATA[fromUser]]></FromUserName> * <CreateTime>12345678</CreateTime> * <MsgType><![CDATA[news]]></MsgType> * <ArticleCount>2</ArticleCount> * <Articles> * <item> * <Title><![CDATA[title1]]></Title> * <Description><![CDATA[description1]]></Description> * <PicUrl><![CDATA[picurl]]></PicUrl> * <Url><![CDATA[url]]></Url> * </item> * <item> * <Title><![CDATA[title]]></Title> * <Description><![CDATA[description]]></Description> * <PicUrl><![CDATA[picurl]]></PicUrl> * <Url><![CDATA[url]]></Url> * </item> * </Articles> * </xml> * * */ $fromUserName=$postObj->ToUserName; $toUserName=$postObj->FromUserName; $time=time(); $msgType='text'; $template="<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>".count($arr)."</ArticleCount> <Articles>"; foreach($arr as $v){ $template.=" <item> <Title><![CDATA[".$v[title]."]]></Title> <Description><![CDATA[".$v[description]."]]></Description> <PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl> <Url><![CDATA[".$v[url]."]]></Url> </item>"; } $template.=" </Articles> </xml>"; echo sprintf($template,$toUserName,$fromUserName,time());}
参考微信开发手册
原文地址:http://blog.csdn.net/somehow1002/article/details/76919270
个人见解,如有错误之处,欢迎指正。
阅读全文
0 0
- 微信开发中的消息验证与消息回复
- 微信开发中signature的验证,文本消息回复,单图文消息回复,多图文消息回复
- 微信公众号开发-接收与回复消息
- 微信消息回复
- PHP微信开发---模板消息回复
- [微信开发五]--图文消息回复
- 微信消息自动回复开发
- 微信开发 (一) 消息回复
- 微信开发之消息回复
- 微信开发基本消息回复
- php 微信开发回复消息
- 微信公众平台开发【发送消息】被动回复消息
- 微信开发_接收消息,回复消息(3)
- 微信公众号开发--消息的接收与被动回复消息
- 微信开发四 接受用户普通消息与回复消息
- 微信开发四 接受用户普通消息与回复消息
- 【微信】微信开发(2)微信消息接受与回复
- 基于PHP的微信公众平台开发(TOKEN验证,消息回复)
- Python语言入门学习笔记【智库2861】(不断更新)
- hdu 6092 Rikka with Subset
- [HDU
- RocketMQ存储篇——CommitLog
- LeetCode 367 Valid Perfect Square
- 微信开发中的消息验证与消息回复
- Socket InputStream读取无结束符且不等长数据
- Android相机预览方向
- 西门子PLC软/硬件故障判断和处理方法
- JAVA I/O
- Jenkins前期准备工作及环境变量配置
- Android 用intent 列出手机中全部的浏览器
- 在持久化类中声明多列作为联合主键
- J-04. 排除报错 Rescue configuration is not set ❀ 瞻博 (Juniper) 防火墙