获取token,绑定微信号,自定义菜单,事件响应demo
摘要: 这个demo包含了获取token,绑定微信号,设置自定义菜单,响应文本和事件
这个教程的基础篇和提升篇都看完了,总感觉有点隔靴挠痒的感觉,讲的东西我都懂,没有吸收多少新鲜的知识。貌似还没有我这个一年前写的脚本好呢,估计也是照顾新人吧。期待高级篇的讲解,不过现在高级篇估计还在录制当中,所以对微信公众平台开发的学习就先到这里吧。
下面介绍一下我很久以前写的这个脚本。基本上常用的几个功能都有了,access_token的获取,用户的微信号和公司的账号的绑定,查询公司服务器上的数据,自定义表单什么。不过随着水平的提高,现在返回头来看,确实有很多的不足,比较最明显的就是token获取之后,没有保存下载,而是每一次访问都会获取一次,这个问题可以把token放入memcache中来解决。把代码贴上:
<?php //获取ACCESS_TOKEN
$appid = "xxxxxxxxxxxxxxxxxxxxx";
$appsecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}"; $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$jsoninfo = json_decode($output, true);
$access_token = $jsoninfo["access_token"];
//获取ACCESS_TOKEN end //define my token
define("TOKEN", "xxxxxxxxxx");
//define my ACCESS_TOKEN
define("ACCESS_TOKEN",$access_token); class IndexAction extends Action { public function index(){
$this->responseMsg();
$this->createMenu(); } public function valid()
{
$echoStr = $_GET["echostr"]; //valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
} /*
description of 文本展示
@param none
@return none
@author act
@vision
*/ public function responseMsg()
{
//获取微信发来的数据
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data if (!empty($postStr)){
//将这个xml编程一个对象
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $openid=$postObj->FromUserName;
$openid=(string)$openid; $text_type = trim($postObj->MsgType); //获取消息类型 switch ($text_type) {
case 'text': $content=trim($postObj->Content); //功能:绑定用户
//微信号,公司账号内容绑定,格式: 用户名+手机号+身份证后四位
$user_info=explode('+',$content); $username=$user_info[0]; //用户提交的用户名
$phone=$user_info[1]; //提交的手机号码
$card_id=$user_info[2]; //提交的电话号码 $user_info_count=count($user_info); if( $user_info_count==3){ //如果数组的元素为三个,说明就是验证微信号
$model=new Model();
$sql="select a.user_id,a.username,b.phone,c.card_id from deayou_users as a
left join deayou_users_info as b on a.user_id=b.user_id
left join deayou_approve_realname as c on a.user_id=c.user_id
where a.username='{$username}' and b.phone='{$phone}' and right(c.card_id,4)='{$card_id}'";
$res=$model->query($sql); $cond['openid']=$openid;
$is_openid=M('weixin_user_bind')->where($cond)->find(); //是否已经绑定过 if($res && $is_openid){ //此刻 说明是修改
/*
以下注释的代码不要删除,万一哪天还要改回来,删掉注释即可。
*/
// $where1['openid']=array('eq',$openid);
// $where['users_table_id']=$res[0]['user_id'];
// $res=M('weixin_user_bind')->where($where1)->data($where)->save();
// if($res){
// $resultStr=$this->responseText($postObj,'恭喜您,修改绑定成功');
// }else{
// $resultStr=$this->responseText($postObj,'修改绑定失败,请检查用户名、手机号、身份证号码是否一致');
// }
$resultStr=$this->responseText($postObj,'您已经绑定过账号了,请不要再次绑定');
}elseif ($res && empty($is_openid)) { //此刻说明是添加
$cond['users_table_id']=$res[0]['user_id'];
$cond['openid']=$openid;
$result=M('weixin_user_bind')->where($cond)->add($cond);
if($result){
$resultStr=$this->responseText($postObj,'恭喜您,账号绑定成功');
}else{
$resultStr=$this->responseText($postObj,'账号绑定失败,请检查用户名、手机号、身份证号码是否一致');
}
}else{
$resultStr=$this->responseText($postObj,'请输入正确格式,并且请检查用户名、手机号、身份证号码是否一致');
}
}else{
$resultStr=$this->responseText($postObj,'您好,感谢您关注xxx官方微信服务号!');
} break;
case 'event':
$cond['openid']=$openid;
$res=M('weixin_user_bind')->where($cond)->find();
if($res){
$_SESSION['user_id']=$res['users_table_id'];
}
$resultStr = $this->handleEvent($postObj); default:
# code...
break;
}
echo $resultStr;
}else {
echo "";
exit;
}
} /*
description of 文本调用
@param $Obj 用户传入数据对象
@return 一个返回给用户的xml字符串
@author act
@vision
*/ public function handleText($obj){
$postObj = $obj;
$toUsername = $postObj->ToUserName;
$fromUsername = $postObj->FromUserName;
$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';
$Content='欢迎加入xxx';
$resultStr=sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$Content);
return $resultStr;
} } /*
description of 事件调用
@param $Obj 用户传入数据对象
@return 一个返回给用户的xml字符串
@author act
@vision
*/ public function handleEvent($obj){
$content=''; /**
* 判断账户是否已经绑定
*/
$openid=$obj->FromUserName;
$openid=(string)$openid;
$data['openid']=$openid;
$is_bind=M('weixin_user_bind')->where($data)->select(); switch (strtolower($obj->Event)) {
case 'subscribe':
$content="您好,感谢您关注xxx官方微信服务号!";
break;
case 'click':
$key=$obj->EventKey;
switch($key){ //switch 判断出key值 依次判断
case 'zhbd':
if($is_bind){
$content = '您已经绑定过账户了哦~';
}else{
$content = '请输入验证信息'."\n".'格式(加号也要写上哦~):'."\n"."用户名+手机号+身份证后4位"."\n"."例如:"."\n"."iloveyou+13800000000+1111";
}
break;
case 'xxzh':
if(empty($_SESSION['user_id'])){
$resultStr=$this->responseText($obj,'请先进行账号绑定');
return $resultStr;
}
$content = R('Info/select_account');
break;
case 'jrxyb':
if(empty($_SESSION['user_id'])){
$resultStr=$this->responseText($obj,'请先进行账号绑定');
return $resultStr;
}
$content = R('Info/select_xinyibao');
break;
case 'sbxx':
if(empty($_SESSION['user_id'])){
$resultStr=$this->responseText($obj,'请先进行账号绑定');
return $resultStr;
}
$content = R('Info/select_sanbiao');
break;
case 'jkxx':
if(empty($_SESSION['user_id'])){
$resultStr=$this->responseText($obj,'请先进行账号绑定');
return $resultStr;
}
$content = R('Info/select_jiekuan');
break;
default:
$content = '即将推出,敬请期待^_^';
break;
} break;
default:
$content='不知道这个'.$obj->Event;
break;
} $resultStr=$this->responseText($obj,$content);
return $resultStr;
} /*
description of 返回文本
@param $Obj 用户传入数据对象
@param $cont 返回给用户的内容
@param $flag 不太了解(貌似没有多大作用)
@return 一个返回给用户的xml字符串
@author act
@vision
*/ public function responseText($Obj,$cont,$flag=0){
$postObj = $Obj;
$toUsername = $postObj->ToUserName;
$fromUsername = $postObj->FromUserName; $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>"; $MsgType='text';
$resultStr=sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$cont);
return $resultStr; } /*
description of 系统验证 不用管
@param none
@return none
@author I don't know
@vision none
*/ private function checkSignature()
{
$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 ){
return true;
}else{
return false;
}
} /*
description of 自定义菜单
@param $data 传入自定义菜单的json数组
@return post提交执行结果
@author act
@vision
*/ function createMenu($data){
$data = '{
"button":[
{
"name":"业务咨询",
"sub_button":[
{
"type":"view",
"name":"我要理财",
"url":"http://www.baidu.com"
},
{
"type":"view",
"name":"我要贷款",
"url":"http://www.baidu.com"
},
{
"type":"view",
"name":"我要加盟",
"url":"http://www.baidu.com"
},
{
"type":"view",
"name":"我要建议",
"url":"http://www.baidu.com"
}
]
},
{
"name":"xxx在线",
"sub_button":[
{
"type":"click",
"name":"账户绑定",
"key":"zhbd"
},
{
"type":"click",
"name":"查询账户",
"key":"xxzh"
},
{
"type":"click",
"name":"加入xxx",
"key":"jrxyb"
},
{
"type":"click",
"name":"散投信息",
"key":"sbxx"
},
{
"type":"click",
"name":"借款信息",
"key":"jkxx"
}]
},
{
"name":"关于我们",
"sub_button":[
{
"type":"view",
"name":"公司简介",
"url":"http://www.baidu.com"
},
{
"type":"view",
"name":"安全保障",
"url":"http://www.baidu.com"
},
{
"type":"view",
"name":"联系我们",
"url":"http://www.baidu.com"
}]
}]
}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".ACCESS_TOKEN);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmpInfo = curl_exec($ch);
if (curl_errno($ch)) {
return curl_error($ch);
}
curl_close($ch);
return $tmpInfo;
} }
获取token,绑定微信号,自定义菜单,事件响应demo的更多相关文章
- C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权
通俗来讲VIEW其实就是我们在C#中常用的a标签,可以直接在自定义菜单URL的属性里面写上需要跳转的链接,也即为单纯的跳转. 但更多的情况下,我们是想通过VIEW来进入指定的页面并进行操作. 举一个简 ...
- C#微信公众号开发 -- (六)自定义菜单事件之CLICK
微信公众号中当用户手动点击了按钮,微信公众号会被动的向用户发送文字消息或者图文消息. 通过C#微信公众号开发 -- (五)自定义菜单创建 我们知道了如何将CLICK类型的按钮添加到自己的微信公众平台上 ...
- iOS 学习 - 18.TextField 自定义菜单事件,复制和微信分享
菜单事件包括,剪切.拷贝.全选.分享...,此 demo 只有 copy.share 1.定义 field 继承与 UITextField - (BOOL)canPerformAction:(SEL) ...
- node.js 微信开发2-消息回复、token获取、自定义菜单
项目结构 >config/wechat.json 微信公众号的配置文件 >controllers/oauth.js 微信网页授权接口(下一篇再细讲讲) >controllers/we ...
- 利用AccessibilityService自动获取微信号(Android)
前言: 最近遇到一个需求,要求写一个小插件,能够自动在微信的页面弹出一个窗口,展示用户的相关信息(与我们公司有关的信息,方便运营快速了解用户信息). 当时我第一反应是不可能,如果能够在别的app中获取 ...
- 微信公众平台开发(99) 自定义菜单获取OpenID
关键字 微信公众平台 自定义菜单 OpenID作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html 在这篇微信 ...
- [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
引言及内容概要 距离写上一篇文章<自定义菜单的创建及菜单事件响应>整整过了两个月的时间,那时公众平台还没有开放view类型的菜单.在不久前,微信公众平台悄悄开放了view类型的菜单,却没有 ...
- 微信定时获取token
为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相 ...
- Java企业微信开发_03_自定义菜单
一.本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装. 这里需要格外注意的是,企业微信中请求包的数据是Json字符串格式的,而不是xml格式.关于json序列 ...
随机推荐
- FIO 测试磁盘iops 以及读写
最近在做mariadb的性能,感觉io 有瓶颈,就使用fio 来测试一下磁盘.下文为转载文章(温馨提示:此命令很伤硬盘,测试前请备份数据,- -我就写坏了一个.) FIO 是测试IOPS的非常好的工具 ...
- 20145334实验三《敏捷开发与XP实践》
实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 1.敏捷开发与XP 敏捷开发(Agile Dev ...
- 20145337实验四Android开发基础
20145337实验四Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理器的使用: 掌握Android中事件处 ...
- 《JAVA开发环境的熟悉》实验报告——20145337
- Android课程---寄存器与存储器的区别
存储器在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是50MB/S左右.内存和寄存器就是为了解决存储器读写速度慢而产生的 ...
- IOS第七天(3:UiTableView 模型和数据的分组的显示)
*************UiTableView模型和数据的分组的显示 #import "HMViewController.h" #import "HMHero.h&qu ...
- 20145218&20145240 《信息安全系统设计基础》实验一 开发环境的熟悉
20145218&20145240 <信息安全系统设计基础>实验一 开发环境的熟悉 课程:信息安全系统设计基础 班级:1452 姓名:(按贡献大小排名)刘士嘉 张晓涵 学号:(按贡 ...
- angularJs实现信息数据提交功能
如下简单的报名提交的实现 1.数据绑定 2.$http.post()提交数据 一.数据绑定 <!--报名部分--> <div class="attend_box" ...
- WINFORM 打开PDF
这里使用 Adobe Read 组件 的方式 首先电脑上需要安装AdobeRead VS中添加COM引用 再在工具选项卡中添加Adobe PDF Read 组件即可 从工具箱中直接拖动组件到窗体中即可
- Linux下查看某个软件安装路径
1:如果包是通过yum或者rpm方式安装 [root@localhost yum.repos.d]# rpm -qa //找出系统所有的包,找到对应的文件名 [root@localhost yum.r ...