thinkphp 之微信公众号(自定义菜单开发)

栏目: PHP · 发布时间: 6年前

内容简介:thinkphp 之微信公众号(自定义菜单开发)

前言:小编接触 PHP 2年前开始接触了 但是后面转了IOS 。还记得那个时候thinkPHP 还是2.3 的版本。现在回头看看 都已经是5.0.3 的版本了。这不最近又拿起来学习一下。才发现很多的结构和用法都变了。这不,小编这个小白就带着大家来研究下这个公众号。

1.首先你需要申请一个微信公众号:

https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=109320610

小编当然会给一个申请流程的连接:

http://jingyan.baidu.com/article/db55b609aaec1e4ba30a2fae.HTML

2. 然后你需要开启服务号:

小编当然也会当一个连接地址进来了:

http://jingyan.baidu.com/article/e9fb46e190a51a7521f766d7.HTML

3. 那么我们的微信公众号也开通了。服务号也可以使用了。接下来就是进入开发的阶段了。

>1   接入微信公众号:配置公众号的基本配置。

thinkphp 之微信公众号(自定义菜单开发)

在这里我们找到:AppID(应用ID)AppSecret(应用密钥)

thinkphp 之微信公众号(自定义菜单开发)

开发的时候要用到的哦

这里就是我们需要配置开发的地方了哦。

thinkphp 之微信公众号(自定义菜单开发)

thinkphp 之微信公众号(自定义菜单开发)

>2        下面我们来看看开发的时候需要如何配置呢:

我这里填写的地址是我的Index 控制器中的index  方法:

thinkphp 之微信公众号(自定义菜单开发)

//先截图发送下我的代码 然后下面在贴出代码来:

微信公众号对接方法:

thinkphp 之微信公众号(自定义菜单开发)

设置自定义菜单的函数:

thinkphp 之微信公众号(自定义菜单开发)

获取token的函数:注意这个token有一个失效时间。所以很多人都是保存到数据库的。

thinkphp 之微信公众号(自定义菜单开发)

get  请求方法:

thinkphp 之微信公众号(自定义菜单开发)

获取微信服务器IP地址:

thinkphp 之微信公众号(自定义菜单开发)

发送消息方法:

thinkphp 之微信公众号(自定义菜单开发)

thinkphp 之微信公众号(自定义菜单开发)

下面我来上干货:(代码了)

<?php namespace Home/Controller; use Think/Controller; class IndexController extends Controller {       public function index(){         //获得参数 signature nonce token timestamp echostr         $nonce     = $_GET['nonce'];         $token     = 'mk_weixin';         $timestamp = $_GET['timestamp'];         $echostr   = $_GET['echostr'];         $signature = $_GET['signature'];         //形成数组,然后按字典序排序         $array = array();         $array = array($nonce, $timestamp, $token);         sort($array);         //拼接成字符串,sha1加密 ,然后与signature进行校验         $str = sha1( implode( $array ) );         if( $str  == $signature && $echostr ){             //第一次接入weixin api接口的时候             // echo  $echostr;             exit;         }else{             $this->definedItem();             $this->reponseMsg();         }     }       //消息处理函数     public function reponseMsg(){         //1.获取到微信推送过来post数据(xml格式)         $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];         //2.处理消息类型,并设置回复类型和内容         $postObj = simplexml_load_string( $postArr );                       $access_token=$this ->getWxAccessToken();         $fromUser = $postObj->ToUserName;         $ToUser = $postObj->FromUserName;         $url='https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$ToUser;         $result=$this->http_curl($url,'get','json');          //存入session         // session_start();         $_SESSION['weixin_openid']=$result['openid'];         if( strtolower( $postObj->MsgType) == 'event'){             //如果是关注 subscribe 事件             if( strtolower($postObj->Event == 'subscribe') ){                 //回复用户消息(纯文本格式)                 $toUser   = $postObj->FromUserName;                 $fromUser = $postObj->ToUserName;                 $time     = time();                 $msgType  =  'text';                 $content  = '欢迎关注我们的微信公众账号'.$postObj->FromUserName.'-'.$postObj->ToUserName;                 $template = "<xml>                             <ToUserName><![CDATA[%s]]></ToUserName>                             <FromUserName><![CDATA[%s]]></FromUserName>                             <CreateTime>%s</CreateTime>                             <MsgType><![CDATA[%s]]></MsgType>                             <Content><![CDATA[%s]]></Content>                             </xml>";                 $info     = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);               }         }         //根据用户输入消息进行回复         else if(strtolower( $postObj->MsgType) == 'text'){             $toUser   = $postObj->FromUserName;             $fromUser = $postObj->ToUserName;             $time     = time();             $msgType  =  'text';             //$content  = 'imooc is very good'.$postObj->FromUserName.'-'.$postObj->ToUserName;             $template = "<xml>                             <ToUserName><![CDATA[%s]]></ToUserName>                             <FromUserName><![CDATA[%s]]></FromUserName>                             <CreateTime>%s</CreateTime>                             <MsgType><![CDATA[%s]]></MsgType>                             <Content><![CDATA[%s]]></Content>                             </xml>";             switch( trim($postObj->Content)){                 case 1:                     $content = '您输入的数字是1';                   break;                 case 2:                     $content = '您输入的数字是2';                 break;                 case 3:                     $content = '<a href="http://www.tcode.me">淘代码</a>';                 break;                 case tuwen:                         $arr=array(                             array('title'=>'imooc',                                 'description'=>'imooc描述',                                 'picUrl'=>'http://www.tcode.me/static/home/images/logo.png',                                 'url'=>'http://www.tcode.me'),                             array('title'=>'hao123',                                 'description'=>'hao123描述',                                 'picUrl'=>'http://www.tcode.me/static/home/images/logo.png',                                 'url'=>'http://www.hao123.com'),                             array('title'=>'baidu',                                 'description'=>'baidu描述',                                 'picUrl'=>'http://www.tcode.me/static/home/images/logo.png',                                 'url'=>'http://www.tcode.me'),                          );                     $content = '<a href="http://www.tcode.me">淘代码</a>';                     $template_tuWen = "<xml>                                 <ToUserName><![CDATA[%s]]></ToUserName>                                 <FromUserName><![CDATA[%s]]></FromUserName>                                 <CreateTime>%s</CreateTime>                                 <MsgType><![CDATA[%s]]></MsgType>                                 <ArticleCount>".count($arr)."</ArticleCount>                                 <Articles>";                     foreach($arr as $k=>$v){                         $template_tuWen .= "<item>                                 <Title><![CDATA[".$v['title']."]]></Title>                                 <Description><![CDATA[".$v['description']."]]></Description>                                 <PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl>                                 <Url><![CDATA[".$v['url']."]]></Url>                                 </item>";                     }                       $template_tuWen .="</Articles>                                 </xml>";                     $info     = sprintf($template_tuWen, $toUser,$fromUser,$time,'news');                     // echo $info;                     break;             }             $info     = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);             echo $info;         }     }       //$url  接口url string     //$type 请求类型string     //$res  返回类型string     //$arr= 请求参数string     public function http_curl($url,$type='get',$res='json',$arr=''){           //1.初始化curl         $ch  =curl_init();         //2.设置curl的参数         curl_setopt($ch,CURLOPT_URL,$url);         curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);           if($type == 'post'){             curl_setopt($ch,CURLOPT_POST,1);             curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);         }         //3.采集         $output =curl_exec($ch);           //4.关闭         curl_close($ch);         if($res=='json'){             if(curl_error($ch)){                 //请求失败,返回错误信息                 return curl_error($ch);             }else{                 //请求成功,返回错误信息                   return json_decode($output,true);             }         }         echo var_dump( $output );     }       //获取微信服务器IP地址     function  getWxServerIp(){          $accessToken=$this ->getWxAccessToken();         // $accessToken ="Y7cYto0UvJz1U-9NpN04lhQuBkO5BO7Sim6hCZ0GkZlLLfisnvXLjg6VTX_v7veESGX24zAIlu31GD5YXjQFWd5AYXkQTv5a1iGIwk9oxL4gPeWC3fCciWTp2e5ftVZvUXFcAHAHKS";         $url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$accessToken;         $ch  =curl_init();         curl_setopt($ch,CURLOPT_URL,$url);         curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);         $res =curl_exec($ch);         //5.关闭curl         curl_close($ch);         if(curl_error($ch)){             var_dump(curl_error($ch));         }         $arr=json_decode($res,true);         echo "<pre>";         var_dump($arr);         echo "</pre>";     }         //返回access_token *session解决办法 存mysql memcache     public function  getWxAccessToken(){         if( $_SESSION['access_token'] && $_SESSION['expire_time']>time()){           //如果access_token在session没有过期             echo "111";             // echo $_SESSION['access_token'];;             return $_SESSION['access_token'];         }         else{             //如果access_token比存在或者已经过期,重新取access_token             //1 请求url地址             $AppId='你的AppId';             $AppSecret='你的AppSecret';             $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$AppId."&secret=".$AppSecret;             $res=$this->http_curl($url,'get','json');             $access_token =$res['access_token'];             //将重新获取到的aceess_token存到session             $_SESSION['access_token']=$access_token;             $_SESSION['expire_time']=time()+7000;             return $access_token;         }     }         public function  definedItem(){         //创建微信菜单         //目前微信接口的调用方式都是通过 curl post/get         header('content-type:text/html;charset=utf-8');         $access_token=$this ->getWxAccessToken();         $url ='https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$access_token;         $postArr=array(             'button'=>array(                 array(                     'name'=>urlencode('坚果糖果'),                     // 'type'=>'click',                     'type'=>'view',                     // 'key'=>'item1',                     'url'=>'http://www.tcode.me'                 ),                 array(                     'name'=>urlencode('点外卖'),                      'type'=>'view',                       'url'=>'http://www.tcode.me'                     // 'sub_button'=>array(                     //     array(                     //         'name'=>urlencode('歌曲'),                     //         'type'=>'view',                     //         // 'key'=>'songs',                     //         'url'=>'http://www.tcode.me'                     //     ),//第一个二级菜单                     //     array(                     //         'name'=>urlencode('电影'),                     //         'type'=>'view',                     //         'url'=>'http://www.tcode.me'                     //     ),//第二个二级菜单                     // )                 ),                 array(                     'name'=>urlencode('视频游戏'),                     'type'=>'view',                     'url'=>'http://www.tcode.me',                 ),//第三个一级菜单           ));         echo  $postJson = urldecode(json_encode($postArr));         $res = $this->http_curl($url,'post','json',$postJson);         var_dump($res);     }           public function checkSignature(){         $signature = $_GET["signature"];         $timestamp = $_GET["timestamp"];         $nonce = $_GET["nonce"];             echo "获取到的值:".$signature;             $token = “mk_weixin”;         $tmpArr = array($token, $timestamp, $nonce);         sort($tmpArr, SORT_STRING);         $tmpStr = implode( $tmpArr );         $tmpStr = sha1( $tmpStr );                   if( $tmpStr == $signature ){             return true;         }else{             return false;         }     } }

效果图:

thinkphp 之微信公众号(自定义菜单开发)

怎么样,你的问题解决了么。解决了就点个赞->就冲下面这个表情。怎么样

thinkphp 之微信公众号(自定义菜单开发)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Linux内核完全剖析

Linux内核完全剖析

赵炯 / 机械工业出版社 / 2008.10 / 99.00元

本书对早期Linux内核(v0.12)全部代码文件进行了详细、全面的注释和说明,旨在帮助读者用较短的时间对Linux的工作机理获得全面而深刻的理解,为进一步学习和研究Linux打下坚实的基础。虽然选择的版本较低,但该内核已能够正常编译运行,并且其中已包括了Linux工作原理的精髓。书中首先以Linux源代码版本的变迁为主线,介绍了Linux的历史,同时着重说明了各个内核版本的主要区别和改进,给出了......一起来看看 《Linux内核完全剖析》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码