IndexController.class.php

  1. <?php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5. /* public function index(){
  6. $this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p><br/>版本 V{$Think.version}</div><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_55e75dfae343f5a1"></thinkad><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script>','utf-8');
  7. }*/
  8. public function __construct(){
  9.  
  10. }
  11. public function index(){
  12. //获得参数 signature nonce token timestamp echostr
  13. $nonce = $_GET['nonce'];
  14. $token = 'imooc';
  15. $timestamp = $_GET['timestamp'];
  16. $echostr = $_GET['echostr'];
  17. $signature = $_GET['signature'];
  18. //形成数组,然后按字典序排序
  19. $array = array();
  20. $array = array($nonce, $timestamp, $token);
  21. sort($array);
  22. //拼接成字符串,sha1加密 ,然后与signature进行校验
  23. $str = sha1( implode( $array ) );
  24. if( $str == $signature && $echostr ){
  25. //第一次接入weixin api接口的时候
  26. echo $echostr;
  27. exit;
  28. }else{
  29. $this->definedItem();
  30. $this->reponseMsg();
  31.  
  32. }
  33.  
  34. }
  35.  
  36. public function show(){
  37. echo 'imooc';
  38. }
  39.  
  40. //消息处理函数
  41. public function reponseMsg(){
  42. //1.获取到微信推送过来post数据(xml格式)
  43. $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
  44. //2.处理消息类型,并设置回复类型和内容
  45. /*<xml>
  46. <ToUserName><![CDATA[toUser]]></ToUserName>
  47. <FromUserName><![CDATA[FromUser]]></FromUserName>
  48. <CreateTime>123456789</CreateTime>
  49. <MsgType><![CDATA[event]]></MsgType>
  50. <Event><![CDATA[subscribe]]></Event>
  51. </xml>*/
  52. $postObj = simplexml_load_string( $postArr );
  53. //$postObj->ToUserName = '';
  54. //$postObj->FromUserName = '';
  55. //$postObj->CreateTime = '';
  56. //$postObj->MsgType = '';
  57. //$postObj->Event = '';
  58. // gh_e79a177814ed
  59. //判断该数据包是否是订阅的事件推送
  60. if( strtolower( $postObj->MsgType) == 'event'){
  61. //如果是关注 subscribe 事件
  62. if( strtolower($postObj->Event == 'subscribe') ){
  63. //回复用户消息(纯文本格式)
  64. $toUser = $postObj->FromUserName;
  65. $fromUser = $postObj->ToUserName;
  66. $time = time();
  67. $msgType = 'text';
  68. $content = '欢迎关注我们的微信公众账号'.$postObj->FromUserName.'-'.$postObj->ToUserName;
  69. $template = "<xml>
  70. <ToUserName><![CDATA[%s]]></ToUserName>
  71. <FromUserName><![CDATA[%s]]></FromUserName>
  72. <CreateTime>%s</CreateTime>
  73. <MsgType><![CDATA[%s]]></MsgType>
  74. <Content><![CDATA[%s]]></Content>
  75. </xml>";
  76. $info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
  77. echo $info;
  78. /*<xml>
  79. <ToUserName><![CDATA[toUser]]></ToUserName>
  80. <FromUserName><![CDATA[fromUser]]></FromUserName>
  81. <CreateTime>12345678</CreateTime>
  82. <MsgType><![CDATA[text]]></MsgType>
  83. <Content><![CDATA[你好]]></Content>
  84. </xml>*/
  85.  
  86. }
  87. }
  88. //根据用户输入消息进行回复
  89. else if(strtolower( $postObj->MsgType) == 'text'){
  90. $toUser = $postObj->FromUserName;
  91. $fromUser = $postObj->ToUserName;
  92. $time = time();
  93. $msgType = 'text';
  94. //$content = 'imooc is very good'.$postObj->FromUserName.'-'.$postObj->ToUserName;
  95. $template = "<xml>
  96. <ToUserName><![CDATA[%s]]></ToUserName>
  97. <FromUserName><![CDATA[%s]]></FromUserName>
  98. <CreateTime>%s</CreateTime>
  99. <MsgType><![CDATA[%s]]></MsgType>
  100. <Content><![CDATA[%s]]></Content>
  101. </xml>";
  102. switch( trim($postObj->Content)){
  103. case 1:
  104. $content = '您输入的数字是1';
  105. break;
  106. case 2:
  107. $content = '您输入的数字是2';
  108. break;
  109. case 3:
  110. $content = '<a href="http://www.baidu.com">百度</a>';
  111. break;
  112. case tuwen:
  113. $arr=array(
  114. array('title'=>'imooc',
  115. 'description'=>'imooc描述',
  116. 'picUrl'=>'http://www.imooc.com/static/img/common/logo.png',
  117. 'url'=>'http://www.baidu.com'),
  118. array('title'=>'hao123',
  119. 'description'=>'hao123描述',
  120. 'picUrl'=>'http://www.imooc.com/static/img/common/logo.png',
  121. 'url'=>'http://www.hao123.com'),
  122. array('title'=>'baidu',
  123. 'description'=>'baidu描述',
  124. 'picUrl'=>'http://www.imooc.com/static/img/common/logo.png',
  125. 'url'=>'http://www.baidu.com'),
  126. );
  127. $content = '<a href="http://www.baidu.com">百度</a>';
  128. $template_tuWen = "<xml>
  129. <ToUserName><![CDATA[%s]]></ToUserName>
  130. <FromUserName><![CDATA[%s]]></FromUserName>
  131. <CreateTime>%s</CreateTime>
  132. <MsgType><![CDATA[%s]]></MsgType>
  133. <ArticleCount>".count($arr)."</ArticleCount>
  134. <Articles>";
  135. foreach($arr as $k=>$v){
  136. $template_tuWen .= "<item>
  137. <Title><![CDATA[".$v['title']."]]></Title>
  138. <Description><![CDATA[".$v['description']."]]></Description>
  139. <PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl>
  140. <Url><![CDATA[".$v['url']."]]></Url>
  141. </item>";
  142. }
  143.  
  144. $template_tuWen .="</Articles>
  145. </xml>";
  146. $info = sprintf($template_tuWen, $toUser,$fromUser,$time,'news');
  147. echo $info;
  148. break;
  149. }
  150.  
  151. $info = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
  152. echo $info;
  153. }
  154.  
  155. }
  156.  
  157. //$url 接口url string
  158. //$type 请求类型string
  159. //$res 返回类型string
  160. //$arr= 请求参数string
  161. public function http_curl($url,$type='get',$res='json',$arr=''){
  162.  
  163. //1.初始化curl
  164. $ch =curl_init();
  165. //2.设置curl的参数
  166. curl_setopt($ch,CURLOPT_URL,$url);
  167. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  168.  
  169. if($type == 'post'){
  170. curl_setopt($ch,CURLOPT_POST,1);
  171. curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);
  172. }
  173. //3.采集
  174. $output =curl_exec($ch);
  175.  
  176. //4.关闭
  177. curl_close($ch);
  178. if($res=='json'){
  179. if(curl_error($ch)){
  180. //请求失败,返回错误信息
  181. return curl_error($ch);
  182. }else{
  183. //请求成功,返回错误信息
  184.  
  185. return json_decode($output,true);
  186. }
  187. }
  188. echo var_dump( $output );
  189. }
  190.  
  191. //获取测试号微信AccessToken
  192. /*function getWxAccessToken(){
  193.  
  194. //2初始化
  195. $ch =curl_init();
  196. //3设置参数
  197. curl_setopt($ch,CURLOPT_URL,$url);
  198. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  199. //4.调用接口
  200. $res =curl_exec($ch);
  201. //5.关闭curl
  202. curl_close($ch);
  203. if(curl_error($ch)){
  204. var_dump(curl_error($ch));
  205. }
  206. $arr=json_decode($res,true);
  207. var_dump($arr);
  208. }*/
  209.  
  210. //获取微信服务器IP地址
  211. function getWxServerIp(){
  212. $accessToken ="Y7cYto0UvJz1U-9NpN04lhQuBkO5BO7Sim6hCZ0GkZlLLfisnvXLjg6VTX_v7veESGX24zAIlu31GD5YXjQFWd5AYXkQTv5a1iGIwk9oxL4gPeWC3fCciWTp2e5ftVZvUXFcAHAHKS";
  213. $url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$accessToken;
  214. $ch =curl_init();
  215. curl_setopt($ch,CURLOPT_URL,$url);
  216. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  217. $res =curl_exec($ch);
  218. //5.关闭curl
  219. curl_close($ch);
  220. if(curl_error($ch)){
  221. var_dump(curl_error($ch));
  222. }
  223. $arr=json_decode($res,true);
  224. echo "<pre>";
  225. var_dump($arr);
  226. echo "</pre>";
  227. }
  228. //返回access_token *session解决办法 存mysql memcache
  229. public function getWxAccessToken(){
  230. if( $_SESSION['access_token'] && $_SESSION['expire_time']>time()){
  231. //如果access_token在session没有过期
  232. echo "111";
  233. echo $_SESSION['access_token'];;
  234. return $_SESSION['access_token'];
  235. }
  236. else{
  237. //如果access_token比存在或者已经过期,重新取access_token
  238. //1 请求url地址
  239. $AppId='wx6636f00cafe25cc0';
  240. $AppSecret='4e67418c1a2f5a1780235e3115eb2b77';
  241. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$AppId."&secret=".$AppSecret;
  242. $res=$this->http_curl($url,'get','json');
  243. echo "res";
  244. echo $res;
  245. $access_token =$res['access_token'];
  246. //将重新获取到的aceess_token存到session
  247. $_SESSION['access_token']=$access_token;
  248. $_SESSION['expire_time']=time()+7000;
  249. echo "2222";
  250. echo $access_token;
  251. return $access_token;
  252. }
  253. }
  254.  
  255. public function definedItem(){
  256. //创建微信菜单
  257. //目前微信接口的调用方式都是通过 curl post/get
  258. header('content-type:text/html;charset=utf-8');
  259. echo $access_token=$this ->getWxAccessToken();
  260. echo $url ='https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$access_token;
  261. $postArr=array(
  262. 'button'=>array(
  263. array(
  264. 'name'=>urlencode('菜单一'),
  265. 'type'=>'click',
  266. 'key'=>'item1',
  267. ),
  268. array(
  269. 'name'=>urlencode('菜单二'),
  270. 'sub_button'=>array(
  271. array(
  272. 'name'=>urlencode('歌曲'),
  273. 'type'=>'click',
  274. 'key'=>'songs'
  275. ),//第一个二级菜单
  276. array(
  277. 'name'=>urlencode('电影'),
  278. 'type'=>'view',
  279. 'url'=>'http://www.baidu.com'
  280. ),//第二个二级菜单
  281. )
  282. ),
  283.  
  284. array(
  285. 'name'=>urlencode('菜单三'),
  286. 'type'=>'view',
  287. 'url'=>'http://www.qq.com',
  288. ),//第三个一级菜单
  289.  
  290. ));
  291. echo $postJson = urldecode(json_encode($postArr));
  292. $res = $this->http_curl($url,'post','json',$postJson);
  293. var_dump($res);
  294. }
  295. }

thinkphp 实现微信公众号开发(二)--实现自定义菜单的更多相关文章

  1. thinkphp 实现微信公众号开发(一)

    打算用php做一个微信公众号管理平台.用thinkphp框架 教程上面是是应用下面会自动生成Lib文件夹.但是我的3.2.3自动生成目录不一样 我修改了我项目文件夹下面的IndexController ...

  2. 微信公众号第三方平台生成自定义菜单提示 获取"access_token失败"

    在微信公众号第三方平台要生成自定义菜单时,程序反应很慢,最终提示"获取access_token失败"(之前程序无改动,使用时间已久),查了大半天,找不出原因. 排除.在微信公众号平 ...

  3. .NET微信公众号开发-1.0初始微信公众号

    一.前言 微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音.视频的全方位沟通.互动 .形成了一 种主流的线上 ...

  4. .NET微信公众号开发-2.0创建自定义菜单

    一.前言 开发之前,我们需要阅读官方的接口说明文档,不得不吐槽一下,微信的这个官方文档真的很烂,但是,为了开发我们需要的功能,我们也不得不去看这些文档. 接口文档地址:http://mp.weixin ...

  5. .NET微信公众号开发-4.0公众号消息处理

    一.前言 微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们 ...

  6. .NET微信公众号开发-5.0微信支付

    一.前言 在开始做这个功能之前,我们要做的第一件事情就是思考,如何做这个微信支付,从哪里开始,从哪里入手,官方的sdk说明什么的,有没有什么官方的demo,还有就是老板给我的一些资料齐全不,那些要申请 ...

  7. NET微信公众号开发-5.0微信支付(待测试)

    开发前准备. 1.0微信支付官方开发者文档 2.0官方demo下载 我们用c#所以选择.net版本 不过这个官方的demo根本跑步起来 3.0官方demo运行起来解决方案 4.0微信支付官方.net版 ...

  8. .NET微信公众号开发-3.0查询自定义菜单

    一.前言 前面我们已经创建好了我们的自定义菜单.那么我们现在要如何查询我们自定义的菜单.原理都是一样的,而且都是相当简单,只是接口地址文档换掉了. 2.0开始编码 同样我们首先创建好我的查询页面,在这 ...

  9. php微信公众号开发curl返回false

    最近刚接触温馨公众号开发,在自定义菜单用curl请求时,碰到了一个小坑.一时半会没有解决,便去问度娘,谷歌.发现都是说$url里面有空格导致的失败. 然而我的并没有空格,一直返回false,这个时候我 ...

随机推荐

  1. ubuntu 16.04下搭建web服务器(MySQL+PHP+Apache) 教程

    1.开始说明 下面很多可能参照网上其中以为前辈的,但有所改进吧.这些设置可能会有所不同,你需要根据不同情况进行修改. 安装apache2 2.切换管理员身份 在ubuntu中需要用root身份进行操作 ...

  2. usaco 17.Jan 铜组T3

    上午在打usaco月赛的铜组题,T1T2是用来秒杀的,然而T3卡了一上午,下面给出题面: 题意大概就是输入一个N*N的矩阵,矩阵中元素只有0与1两种状态,每次操作以左上角的点为矩阵中某一矩阵的左上方顶 ...

  3. LYF电子书制作工具(CHM格式)

    可以制作CHM电子书 可以制作电子相册 下载地址:http://files.cnblogs.com/files/blogLYF/LYF电子书制作安装包.zip http://files.cnblogs ...

  4. kernel Makefile Kconfig说明

    实际文档位置:Documentation/kbuild/makefiles.txt,此为翻译稿. *************************************************** ...

  5. imagick-3.1.0RC2 安装错误

    PHP 5.4.8 安装 imagick-3.1.0RC2 安装冒出一大堆错误, 貌似跟 ImageMagick-6.8.0-2 这个版本有关系, 我之前换成低版本的 ImageMagick 就可以顺 ...

  6. win10应用UserControl

    <Grid xmlns:src="using:UserControlExample" Margin="0,50,0,0"> <Grid.Row ...

  7. Vue.js 组件笔记

    Vue 组件总结笔记 一. 创建组件 1. 使用组件三部曲 ( 创建, 注册, 使用 ) 2. 全局组件:Vue.component('tag', {}); 3. 局部组件: components 属 ...

  8. 常见编程语言对REPL支持情况小结[转]

    文章转载自http://www.nowamagic.net/librarys/veda/detail/2462 最近跟一个朋友聊起编程语言的一些特性,他有个言论让我略有所思:“不能REPL的都是渣”. ...

  9. linux centOS 安装oracle

    安装环境 Linux服务器:CentOS6.4-64位 oracle服务器:oracle11g-64位 基本要求 内存大小:至少2G 硬盘大小:至少6G 交换空间:一般为内存的2倍,例如:2G的内存可 ...

  10. Jquery获得 selection的text 和 option值

    Jquery获得 selection的text 和 option值 <select id="accountStatus" editable="false" ...