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 之微信公众号(自定义菜单开发)


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

查看所有标签

猜你喜欢:

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

Essential ActionScript 3.0

Essential ActionScript 3.0

Colin Moock / Adobe Dev Library / June 22, 2007 / $34.64

ActionScript 3.0 is a huge upgrade to Flash's programming language. The enhancements to ActionScript's performance, feature set, ease of use, cleanliness, and sophistication are considerable. Essentia......一起来看看 《Essential ActionScript 3.0》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试