内容简介: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 接入微信公众号:配置公众号的基本配置。
在这里我们找到:AppID(应用ID)AppSecret(应用密钥)
开发的时候要用到的哦
这里就是我们需要配置开发的地方了哦。
>2 下面我们来看看开发的时候需要如何配置呢:
我这里填写的地址是我的Index 控制器中的index 方法:
//先截图发送下我的代码 然后下面在贴出代码来:
微信公众号对接方法:
设置自定义菜单的函数:
获取token的函数:注意这个token有一个失效时间。所以很多人都是保存到数据库的。
get 请求方法:
获取微信服务器IP地址:
发送消息方法:
下面我来上干货:(代码了)
<?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; } } }
效果图:
怎么样,你的问题解决了么。解决了就点个赞->就冲下面这个表情。怎么样
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
- Web contextMenu 右键菜单 2.1,支持二级菜单
- .net core3.1 abp动态菜单和动态权限(动态菜单实现和动态权限添加) (三)
- BottomNavigationBar 导航菜单
- Alain 菜单权限控制
- Vue 递归多级菜单
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。