摘要: 这个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的更多相关文章

  1. C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权

    通俗来讲VIEW其实就是我们在C#中常用的a标签,可以直接在自定义菜单URL的属性里面写上需要跳转的链接,也即为单纯的跳转. 但更多的情况下,我们是想通过VIEW来进入指定的页面并进行操作. 举一个简 ...

  2. C#微信公众号开发 -- (六)自定义菜单事件之CLICK

    微信公众号中当用户手动点击了按钮,微信公众号会被动的向用户发送文字消息或者图文消息. 通过C#微信公众号开发 -- (五)自定义菜单创建 我们知道了如何将CLICK类型的按钮添加到自己的微信公众平台上 ...

  3. iOS 学习 - 18.TextField 自定义菜单事件,复制和微信分享

    菜单事件包括,剪切.拷贝.全选.分享...,此 demo 只有 copy.share 1.定义 field 继承与 UITextField - (BOOL)canPerformAction:(SEL) ...

  4. node.js 微信开发2-消息回复、token获取、自定义菜单

    项目结构 >config/wechat.json 微信公众号的配置文件 >controllers/oauth.js 微信网页授权接口(下一篇再细讲讲) >controllers/we ...

  5. 利用AccessibilityService自动获取微信号(Android)

    前言: 最近遇到一个需求,要求写一个小插件,能够自动在微信的页面弹出一个窗口,展示用户的相关信息(与我们公司有关的信息,方便运营快速了解用户信息). 当时我第一反应是不可能,如果能够在别的app中获取 ...

  6. 微信公众平台开发(99) 自定义菜单获取OpenID

    关键字 微信公众平台 自定义菜单 OpenID作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html 在这篇微信 ...

  7. [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)

    引言及内容概要 距离写上一篇文章<自定义菜单的创建及菜单事件响应>整整过了两个月的时间,那时公众平台还没有开放view类型的菜单.在不久前,微信公众平台悄悄开放了view类型的菜单,却没有 ...

  8. 微信定时获取token

    为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相 ...

  9. Java企业微信开发_03_自定义菜单

    一.本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装. 这里需要格外注意的是,企业微信中请求包的数据是Json字符串格式的,而不是xml格式.关于json序列 ...

随机推荐

  1. python生成器

    eg1: >>> (i*i for i in range(5))<generator object <genexpr> at 0x16b8fa0>>&g ...

  2. java客户端调用c#的webservice服务

    此处使用到了CXF框架,可以使用以下坐标从maven仓库中获取相关jar包: <dependency> <groupId>org.apache.cxf</groupId& ...

  3. 关于oracle的笔记

    1.查看一个表暂用的表空间大小: SELECT bytes/1024/1024||'MB',a.*FROM user_segments a WHERE a.segment_name ='TL_SP_N ...

  4. 【iCore3 双核心板_ uC/OS-III】例程三:任务的挂起与恢复

    实验指导书及代码包下载: http://pan.baidu.com/s/1jIctRVo iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  5. RHEL/CentOS/Fedora各种源(EPEL、Remi、RPMForge、RPMFusion)配置

    最新文章:Virson’s Blog CentOS默认自带CentOS-Base.repo源,但官方源中去除了很多有版权争议的软件,而且安装的软件也不是最新的稳定版.Fedora自带的源中也找不到很多 ...

  6. [troubleshoot][archlinux][X] GPU HANG

    前言:如下内容已经是在hang完大概半个多月后了,当时想写,一直没过来写,写blog果然也是已经花费时间的事情. 最近一直在休假,电脑的使用频率也不多.后来还是为了生活,不情愿的去开始上班了,上班的第 ...

  7. JAVA 打出jar包

    1.eclipse下导出 jar包:选择项目右键--->Export...----> 选择java下的JAR file---->next--->选择存入路径--->nex ...

  8. 用Appium进行android自动化测试

    appium是开源的移动端自动化测试框架,可以测试ios,android应用.appium让移动端自动化测试不必限定在某种语言和某个具体的框架:也就是说任何人都可以使用自己最熟悉最顺手的语言以及框架来 ...

  9. SQL基础巩固2

    日期函数 函数名称 含义 示例 GetDate 返回当前系统日期和时间,返回值类型为datetime select GETDATE()//输出当前日期 YEAR 返回指定日期的年份 YEAR('08/ ...

  10. What is the difference between parameterized queries and prepared statements?

    Both parameterized queries and prepared statements are exactly the same thing. Prepared statement se ...