xujing6
摘要: 这个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; } }

 

分类:

技术点:

相关文章: