<?php
class ReplyModel{
//验证token,
public function ValidationToken($token){
if(isset($_GET["echostr"])){
$tokenInfo["token"]=$token;
$tokenInfo["echostr"]=$_GET["echostr"];
$tokenInfo["signature"]=$_GET["signature"];
$tokenInfo["timestamp"]=$_GET["timestamp"];
$tokenInfo["nonce"]=$_GET["nonce"];
if($this->checkSignature($tokenInfo)){
return $tokenInfo["echostr"];
}
return false;
}else{
return true;
}
}
//封装检测函数
private function checkSignature($info)
{
$signature = $info["signature"];
$timestamp = $info["timestamp"];
$nonce = $info["nonce"];
$token = $info["token"];
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
} //得到xml数据并且解析成一个对象,成功返回$postObj,失败返回null
public function getXmlAnalysis(){
//1:获取到微信推送过来的POST数据(xml格式)
$postArr="<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[1]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>";
$postArr=$GLOBALS["HTTP_RAW_POST_DATA"];
/*$postArr="<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[5]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>";*/
if (!empty($postArr)){
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postArr, 'SimpleXMLElement', LIBXML_NOCDATA);
return $postObj;
}else{
return null;
}
} //返回纯文本信息,需要传入的参数为解析后的微信服务器数据对象$postObj,需要返回的内容(eg:$relText="你输入的是数字1,返回的是数字1";)
public function ReplyText($postObj,$relText){
$textArr=array("");
$textArr['template']=$relText;;
$textArr['toUser']=$postObj->FromUserName;
$textArr['fromUser']=$postObj->ToUserName;
$textArr['time']=time();
$textArr['MsgType']='text';
return $textArr;
} /*返回图文消息,需要传入的参数为解析后的微信服务器数据对象$postObj,需要返回的内容(eg:$relImageText=array(
array("title"=>"pqs",
"description"=>"pqs is user weixin",
"picurl"=>"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png",
"url"=>"http://www.scarecrowpqs.com/atmSystem/")
);;)*/
public function ReplyImageText($postObj,$relImageText){
$textArr=array("");
$textArr['toUser']=$postObj->FromUserName;
$textArr['fromUser']=$postObj->ToUserName;
$textArr['time']=time();
$textArr['MsgType']='news';
$textArr['template']=$relImageText;
return $textArr;
} //返回图片消息,//返回纯文本信息,需要传入的参数为解析后的微信服务器数据对象$postObj,需要返回的内容(eg:$relText="MediaId";)
public function ReplyImage($postObj,$relImage){
$textArr=array("");
$textArr['toUser']=$postObj->FromUserName;
$textArr['fromUser']=$postObj->ToUserName;
$textArr['time']=time();
$textArr['MsgType']='image';
$textArr['template']=$relImage;
return $textArr;
} //获取微信接口,需要传入的参数为appid和appsecret,返回值为$accessToken
private function getWxAccessToken($appid,$appsecret){
$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
$arr=$this->http_curl($url);
return $arr;
} //获取微信接口,判断是否在本地的过期没
public function getIsWxAccessToken(){
if($_SESSION['access_token'] && $_SESSION['expires_in']>time()){
return $_SESSION['access_token'];
}else{
$relStr=$this->getWxAccessToken("wx9e92e07e63ba07d9","d4624c36b6795d1d99dcf0547af5443d");
$_SESSION["access_token"]=$relStr['access_token'];
$_SESSION["expires_in"]=time()+7200;
return $relStr['access_token'];
} } //需要传入的参数为accessToken,返回值为微信服务器地址
public function getWxServerIp($accessToken){
$accessToken=$this->getIsWxAccessToken();
$url="https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$accessToken;
$arr=$this->http_curl($url);
return $arr;
} //curl请求函数
private function http_curl($url,$type='get',$res='json',$arr='',$header=0){
//初始化curl
$ch=curl_init();
//设置curl
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HEADER,$header);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//调用接口
if($type=='post'){
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);
}
$rel=curl_exec($ch);
//关闭curl
if(curl_errno($ch)){
var_dump(curl_error($ch));
}else{
curl_close($ch);
if($res=='json'){
$relStr=json_decode($rel,true);
return $relStr;
}else{
return $rel;
}
}
} //定义自定义菜单
public function setMenuItem($MenuArr,$Access_Token){
$url="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$Access_Token;
$MenuArr=urldecode(json_encode($MenuArr));
$rel=$this->http_curl($url,'post','json',$MenuArr);
return $rel;
} }

PHP微信开发ReplyModel(封装验证,数据获取,信息返回)的更多相关文章

  1. 《C#微信开发系列(4)-接收 / 返回文本消息》

    4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息 ...

  2. Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

    注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...

  3. Java企业微信开发_10_未验证域名归属,JS-SDK功能受限

    1.现象: 在企业微信后台填写可信域名后,提示:未验证域名归属,JS-SDK功能受限,如下图: 点击“申请域名校验”后, 注意:域名根目录 当时一直不清楚这个域名根目录在哪里,最后让我给试出来了 2. ...

  4. 解决:使用ajax验证登录信息返回前端页面时,当前整个页面刷新。

    源代码如下: function loginform(){ $.ajax({ url:"loginValidate.do", type:'post', data:{"nam ...

  5. 《C#微信开发系列(1)-启用开发者模式》

    1.0启用开发者模式 ①填写服务器配置 启用开发模式需要先成为开发者,而且编辑模式和开发模式只能选择一个(进入微信公众平台=>开发=>基本配置)就可以看到以下的界面: 点击修改配置,会出现 ...

  6. 《C#微信开发系列(3)-获取接口调用凭据》

    3.0获取接口调用凭据 ①接口说明 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留 ...

  7. 《C#微信开发系列(2)-自定义菜单管理》

    2.0自定义菜单管理 ①接口说明 微信服务号聊天窗口下面的菜单项(有的公众号有启用有的则没有),这个可以在编辑模式简单配置,也可以在开发模式代码配置.微信公众平台开发者文档:微信公众号开发平台创建自定 ...

  8. 《C#微信开发系列(Top)-微信开发完整学习路线》

    年前就答应要将微信开发的学习路线整理给到大家,但是因为年后回来这段时间学校还有公司那边有很多事情需要兼顾,所以没能及时更新文章.今天特地花时间整理了下,话不多说,上图,希望对大家的学习有所帮助哈. 如 ...

  9. Senparc.Weixin微信开发(1) 开发验证

    官方系列教程 http://www.cnblogs.com/szw/archive/2013/05/20/3089479.html 登录微信公众平台后-左侧找到开发--启用服务器配置 这样,我们才可以 ...

随机推荐

  1. 发送一个简单的HTTP GET请求并且取回响应。

    string uri="http//www.baidu.com"; WebClient wc = new WebClient(); Console.WriteLine(" ...

  2. 为什么浏览器User-agent总是有Mozilla字样(User-agent String里的历史故事)【搜藏】

    你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样? Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ...

  3. 统计计算与R语言的资料汇总(截止2016年12月)

    本文在Creative Commons许可证下发布. 在fedora Linux上断断续续使用R语言过了9年后,发现R语言在国内用的人逐渐多了起来.由于工作原因,直到今年暑假一个赴京工作的机会与一位统 ...

  4. leetcode@ [289] Game of Life (Array)

    https://leetcode.com/problems/game-of-life/ According to the Wikipedia's article: "The Game of ...

  5. -lrt

    在编写pthread有关的程序时,编译时老是报"undefined reference to `pthread_create'"的错误,原因是没有链接pthread相关的库,gcc ...

  6. Java修饰符关键词大全

    所以我以此主题写了这篇文章.这也是一个可用于测试你的计算机科学知识的面试问题. Java修饰符是你添加到变量.类和方法以改变其含义的关键词.它们可分为两组: 访问控制修饰符 非访问修饰符 让我们先来看 ...

  7. Fragment使用问题

    1.Fragment嵌套Fragment,子fragment使用了viewpager,发现fragment不显示,解决方案如下 //使用下面代码 getChildFragmentManager(); ...

  8. _doPostBack用法总结

    转载在以下两篇博客: http://www.cnblogs.com/yongtaiyu/archive/2011/05/13/2045746.html http://www.cnblogs.com/F ...

  9. 用EPOLL进行压力测试

    在以前的博客中提到的一个服务端,在以前压力测试的过程中,发现单核CPU最多能达到1000TPS 还以为是服务端性能不够好,所以一直想着怎么去优化它. 但优化的思路明显不多,所以就考虑换一种压力测试的方 ...

  10. Idea的Git使用

    在使用Git来pull和push代码的时候会发生冲突的情况,如果处理不当则会出现无法pull和push代码的情况.所以这个是十分有必要注意的. 那么我来说几句自己的总结吧: 1.先看下idea的Git ...