[php]微信测试号调取acces_token,自定义菜单以及被动响应消息
<?php
/**自己写的
*/
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
$wechatObj->responseMsg();//响应消息
$wechatObj->set_menu();//自定义菜单 class wechatCallbackapiTest
{
10 /**
11 * 绑定url、token信息
12 */
public function valid()
{
$echoStr = $_GET["echostr"]; //valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
} 24 /**
25 * 接收消息,并自动发送响应信息
26 */
public function responseMsg()
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data
//提取post数据
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;//发送人
$toUsername = $postObj->ToUserName;//接收人
$keyword = trim($postObj->Content);//消息内容
$time = time();//当前时间做为回复时间 $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>";
if(!empty( $keyword ))
{
$msgType = "text";
// 天气预报
if (strlen($keyword)==6) {
if ($keyword=='天气') {
$contentStr = "PengchongLee的商城欢迎你!\n温馨小提示:\n输入【天气+城市】可获取实时天气!\n例如:天气北京";
}else{
$contentStr = "PengchongLee的商城欢迎你!\n温馨小提示:\n输入【天气+城市】可获取实时天气!\n例如:天气北京";
}
}elseif (strlen($keyword)>=12) {
$city = substr($keyword,6);
$weather = $this->getWeather($city);
if ($weather['success']==0) {
$contentStr = "PengchongLee的商城欢迎你!\n温馨小提示:\n输入【天气+城市】可获取实时天气!\n例如:天气北京";
}elseif($weather['success']==1){
$contentStr = "实时天气:\n城市:【".$weather['result']['citynm']."】;\n日期:【".
$weather['result']['days']."】;\n星期:【".$weather['result']['week']."】;\n温度:【".
$weather['result']['temperature']."】;\n天气:【".$weather['result']['weather']."】;";
}
}else{
$contentStr = "PengchongLee的商城欢迎你!\n温馨小提示:\n输入【天气+城市】可获取实时天气!\n例如:天气北京";
}
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
} }else {
echo "";
exit;
}
} 66 /**
67 * 检查签名,确保请求是从微信发过来的
68 */
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;
}
} 88 /**
89 * 自定义菜单
90 */
public function set_menu()
{
$access_token = $this->check_token(); if ($access_token=='no') { }else{
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$access_token"; $post_data = '
{
"button":[
{
"type":"view",
"name":"首页",
"url":"http://www.lpcblog.com/weixin/shop/"
},
{
"name":"个人中心",
"sub_button":[
{
"type":"view",
"name":"个人信息",
"url":"http://www.lpcblog.com/weixin/shop/user.html"
},
{
"type":"view",
"name":"个人账户",
"url":"http://www.lpcblog.com/weixin/shop/myuser.html"
}]
},
{
"type":"click",
"name":"关于我们",
"key":"V1001_TODAY_MUSIC"
}
]
}'; //设置菜单也是post传值
return json_decode($this->curl($url,$post_data);
}
} //判断token值时效方法
public function check_token()
{
if (file_exists('token.txt'))
{
//判断token值时效,修改时间
$mtime=filemtime("token.txt");
if((time()-$mtime)<7000){
return $this->read_access_token();
}else{
$this->mem_token();
return $this->read_access_token();
}
}else{
$this->mem_token();
return $this->read_access_token();
}
} //curl封装类
public function curl($url,$data=array())
{
// 初始化curl
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 开启支持https
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// post数据
curl_setopt($ch, CURLOPT_POST, 1);
// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $output = curl_exec($ch);
// 关闭curl
curl_close($ch);
return $output;
} //获取access_token方法
public function get_token()
{
//加载常量文件(这里是定义的申请的appid等常量)
include('define.php');
//微信获取access_token地址
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APP_SECRET; //传值方式POST
$post_data = array(
'grant_type'=>'client_credential',
'appid'=>APPID,
'client_secret'=>APP_SECRET,
);
//curl方法模拟提交获取access_token(格式json)
$access_token = json_decode($this->curl($url,$post_data);
if($access_token['access_token']){
return $access_token;
}else{
return "获取access_token失败";
}
} //读取access_token的方法
public function read_access_token()
{
$token = unserialize(file_get_contents('token.txt'));
return $token['access_token'];
} //存token方法
public function mem_token()
{
//调用获取access_token的方法
$access_token = $this->get_token();
//序列化返回的access_token
$txt = serialize($access_token);
//保存access_token
file_put_contents('token.txt',$txt);
}
/**
* 获取天气
*/
public function getWeather($city='')
{
//加载常量文件
include('define.php');
//实时天气接口
$url = "http://api.k780.com/?app=weather.today&weaid=".$city."&appkey=".NOWAPI_APPKEY."&sign=".NOWAPI_SIGN."&format=json";
$post_data = '';
$weather = json_decode($this->curl($url),true);
return $weather;
}
}
[php]微信测试号调取acces_token,自定义菜单以及被动响应消息的更多相关文章
- C#微信开发之旅--自定义菜单
上一篇说道基本信息的回复<C#微信开发之旅--基本信息的回复>,当中就说到文本信息的回复,其他信息的回复,可以参考下开发文档中回复信息的格式进行修改就可以. 下面来实现下自定义菜单.据我了 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(74)-微信公众平台开发-自定义菜单
系列目录 引言 1.如果不借用Senparc.Weixin SDK自定义菜单,编码起来,工作量是非常之大 2.但是借助SDK似乎一切都是简单得不要不要的 3.自定义菜单无需要建立数据库表 4.自定义菜 ...
- 用c#开发微信(5)自定义菜单设置工具 (在线创建)
读目录 1 使用 2 原理 3. 错误 上次写了<用c#开发微信 (4) 基于Senparc.Weixin框架的接收事件推送处理 (源码下载)>,有园友问到如何创建菜单的问题,今天就介绍下 ...
- 微信利用PHP创建自定义菜单的方法
在使用通用接口前,你需要做以下两步工作:1.拥有一个微信公众账号,并获取到appid和appsecret(在公众平台申请内测资格,审核通过后可获得)2.通过获取凭证接口获取到access_token注 ...
- 微信公众平台创建自定义菜单的PHP代码
授人以鱼不如授人以渔.在方倍工作室上问了一下,创建自定义菜单的代码多少钱,一张口就一百,好吧,那我就给你们一人省一百块钱吧,你们说该如何谢谢我?事先说明一下啊,你的PHP版本要高于4.0.2才支持cU ...
- 微信公众平台开发----自定义菜单、消息处理及获取OpenID(C#)
一.成为开发者 服务器配置 登录微信公众平台官网后,在公众平台后台管理页面 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL).Token和EncodingAESKey,如下图所示: 其中 ...
- 使用Java语言开发微信公众平台(八)——自定义菜单功能
随着上一篇文章的结束,我们已经实现了所有消息的类型的回复功能.今天,我们来学习更加高大上,也更加重要的自定义菜单功能. 一.了解自定义菜单 自定义菜单是微信公众平台最常用也是最重要的功能之一.根据微信 ...
- 微信公众平台创建自定义菜单中文编码导致system error
创建包含了中文的自定义菜单时总是返回{"errcode":-1,"errmsg":"system error"},要将编码方式设置为UTF- ...
- 微信公众号-开发者-自定义菜单-CLICK事件处理
想点击菜单,推送消息.功能很简单,坑了我一天时间.在此笔记. 菜单代码: { "button":[ { "type":"click", &q ...
随机推荐
- Python第六章-函数05-迭代器&生成器
python作为一个既面向对象,又支持函数式编程的语言,函数的使用方面有很多特点. 比如:闭包,装饰器,迭代器等 函数的高级应用 容器:生活中常见的容器有哪些?袋子,盆子,水杯,书包,铅笔盒... 容 ...
- Mayor's posters POJ - 2528 线段树(离散化处理大数?)
题意:输入t组数据,输入n代表有n块广告牌,按照顺序贴上去,输入左边和右边到达的地方,问贴完以后还有多少块广告牌可以看到(因为有的被完全覆盖了). 思路:很明显就是线段树更改区间,不过这个区间的跨度有 ...
- HDU - 1160 最长上升子序列以及记录路径
题意:第一列,给出老鼠的重量,第二列,给出老鼠的速度,要证明老鼠的重量越大,速度越小,给出最多老鼠的数量,并说明第几只. 思路:先将老鼠按照重量从大到小排序,然后速度是从小到大,求最长上升子序列,学习 ...
- php基本数据类型解说
一.简介: php语言是弱类型语言,声明变量的时候不需要指定数据类型.但每个数值都是有数据类型的.PHP共有九种数据类型. php基本数据类型共有四种:boolean(布尔型),integer(整型) ...
- 树莓派扩展usb wifi-EPU-N8508GS
树莓派zero 扩展USB WIFI EPU-N8508GS 指令: sudo lsusb 终端显示如下,其中显示RTL8188CUS信息,说明系统已经成功识别到wifi模块 Bus 001 Devi ...
- 利用data文件恢复MySQL数据库
背景:测试服务器 MySQL 数据库不知何种原因宕机,且无法启动,而原先的数据库并没有备份,重新搭建一个新服务器把原data 复制出来 进行恢复 1 尽量把原data复制出来(一个都不要少以防意外 其 ...
- Reface.NPI 方法名称解析规则详解
在上次的文章中简单介绍了 Reface.NPI 中的功能. 本期,将对这方法名称解析规则进行详细的解释和说明, 以便开发者可以完整的使用 Reface.NPI 中的各种功能. 基本规则 方法名称以 I ...
- 解决浏览器看不到Flash文档(尤其某慕课)
最近遇到很多朋友说浏览器看不到网课资源的文档等等,就顺手写一篇说一下情况 为什么会文档空白 某课网站上面的文档是用flash进行展示的,同时flash被很多浏览器逐步抛弃(快凉了,都是H5了) fla ...
- 用python写项目之图书管理系统
1.功能介绍: (1).添加新书:输入要添加的书名.存放的书架号.价格. (2).修改书架:输入要书名,然后对其修改书架号.价格 (3).删除书架:输入书名,然后对应删除书名.书架号.价格 (4).查 ...
- JS中的栈和堆
一.栈和堆 栈(stack):栈会自动分配内存空间,会自动释放,存放基本类型,简单的数据段,占据固定大小的空间. 基本类型:String,Number,Boolean,Null,Undefined 堆 ...