php实现微信公众平台账号自定义菜单类


Posted in PHP onOctober 11, 2015

微信公众平台服务号可申请自定义菜单了,其它的号暂时不支持自定义菜单了,这个不但可以使用api来操作,还可以直接在后台定义菜单与参数哦。

服务号可以申请自定义菜单;使用QQ登录的公众号,可以升级为邮箱登录;使用邮箱登录的公众号,可以修改登录邮箱;群发消息可以同步到腾讯微博。微信公众平台升级:服务号可申请自定义菜单

wx_menu.php

<?php
//define your token
define("TOKEN", "chenxiang");//改成自己的TOKEN
define('APP_ID', '');//改成自己的APPID
define('APP_SECRET', '');//改成自己的APPSECRET
 
$wechatObj = new wechatCallbackapiTest(APP_ID,APP_SECRET);
$wechatObj->Run();
 
class wechatCallbackapiTest
{
  private $fromUsername;
  private $toUsername;
  private $times;
  private $keyword;
  private $app_id;
  private $app_secret;
 
 
  public function __construct($appid,$appsecret)
  {
# code...
    $this->app_id = $appid;
    $this->app_secret = $appsecret;
  }
  public function valid()
  {
    $echoStr = $_GET["echostr"];
    if($this->checkSignature()){
      echo $echoStr;
      exit;
    }
  }
  /**
   * 运行程序
   * @param string $value [description]
   */
  public function Run()
  {
    $this->responseMsg();
    $arr[]= "您好,这是自动回复,我现在不在,有事请留言,我会尽快回复你的^_^";
    echo $this->make_xml("text",$arr);
  }
  public function responseMsg()
  {  
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//返回回复数据
    if (!empty($postStr)){
      $access_token = $this->get_access_token();//获取access_token
      $this->createmenu($access_token);//创建菜单
      //$this->delmenu($access_token);//删除菜单
      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
      $this->fromUsername = $postObj->FromUserName;//发送消息方ID
      $this->toUsername = $postObj->ToUserName;//接收消息方ID
      $this->keyword = trim($postObj->Content);//用户发送的消息
      $this->times = time();//发送时间
      $MsgType = $postObj->MsgType;//消息类型
      if($MsgType=='event'){
        $MsgEvent = $postObj->Event;//获取事件类型
        if ($MsgEvent=='subscribe') {//订阅事件
          $arr[] = "你好,我是xxx,现在我们是好友咯![愉快][玫瑰]";
          echo $this->make_xml("text",$arr);
          exit;
        }elseif ($MsgEvent=='CLICK') {//点击事件
          $EventKey = $postObj->EventKey;//菜单的自定义的key值,可以根据此值判断用户点击了什么内容,从而推送不同信息
          $arr[] = $EventKey;
          echo $this->make_xml("text",$arr);
          exit;
        }
      }
    }else {
      echo "this a file for weixin API!";
      exit;
    }
  }
  /**
   * 获取access_token
   */
  private function get_access_token()
  {
    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->app_id."&secret=".$this->app_secret;
    $data = json_decode(file_get_contents($url),true);
    if($data['access_token']){
      return $data['access_token'];
    }else{
      return "获取access_token错误";
    }
  }
  /**
   * 创建菜单
   * @param $access_token 已获取的ACCESS_TOKEN
   */
  public function createmenu($access_token)
  {
    $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;
    $arr = array( 
        'button' =>array(
          array(
            'name'=>urlencode("生活查询"),
            'sub_button'=>array(
              array(
                'name'=>urlencode("天气查询"),
                'type'=>'click',
                'key'=>'VCX_WEATHER'
                ),
              array(
                'name'=>urlencode("身份证查询"),
                'type'=>'click',
                'key'=>'VCX_IDENT'
                )
              )
            ),
          array(
            'name'=>urlencode("轻松娱乐"),
            'sub_button'=>array(
              array(
                'name'=>urlencode("刮刮乐"),
                'type'=>'click',
                'key'=>'VCX_GUAHAPPY'
                ),
              array(
                'name'=>urlencode("幸运大转盘"),
                'type'=>'click',
                'key'=>'VCX_LUCKPAN'
                )
              )
            ),
          array(
              'name'=>urlencode("我的信息"),
              'sub_button'=>array(
                array(
                  'name'=>urlencode("关于我"),
                  'type'=>'click',
                  'key'=>'VCX_ABOUTME'
                  ),
                array(
                  'name'=>urlencode("工作信息"),
                  'type'=>'click',
                  'key'=>'VCX_JOBINFORMATION'
                  )
                )
             )
            )
            );
    $jsondata = urldecode(json_encode($arr));
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$jsondata);
    curl_exec($ch);
    curl_close($ch);
  }
  /**
   * 查询菜单
   * @param $access_token 已获取的ACCESS_TOKEN
   */
 
  private function getmenu($access_token)
  {
# code...
    $url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=".$access_token;
    $data = file_get_contents($url);
    return $data;
  }
  /**
   * 删除菜单
   * @param $access_token 已获取的ACCESS_TOKEN
   */
 
  private function delmenu($access_token)
  {
# code...
    $url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=".$access_token;
    $data = json_decode(file_get_contents($url),true);
    if ($data['errcode']==0) {
# code...
      return true;
    }else{
      return false;
    }
  }
 
  /**
   *@param type: text 文本类型, news 图文类型
   *@param value_arr array(内容),array(ID)
   *@param o_arr array(array(标题,介绍,图片,超链接),...小于10条),array(条数,ID)
   */
 
  private function make_xml($type,$value_arr,$o_arr=array(0)){
    //=================xml header============
    $con="<xml>
      <ToUserName><![CDATA[{$this->fromUsername}]]></ToUserName>
      <FromUserName><![CDATA[{$this->toUsername}]]></FromUserName>
      <CreateTime>{$this->times}</CreateTime>
      <MsgType><![CDATA[{$type}]]></MsgType>";
 
    //=================type content============
    switch($type){
 
      case "text" : 
        $con.="<Content><![CDATA[{$value_arr[0]}]]></Content>
          <FuncFlag>{$o_arr}</FuncFlag>"; 
          break;
 
      case "news" : 
        $con.="<ArticleCount>{$o_arr[0]}</ArticleCount>
          <Articles>";
        foreach($value_arr as $id=>$v){
          if($id>=$o_arr[0]) break; else null; //判断数组数不超过设置数
          $con.="<item>
            <Title><![CDATA[{$v[0]}]]></Title> 
            <Description><![CDATA[{$v[1]}]]></Description>
            <PicUrl><![CDATA[{$v[2]}]]></PicUrl>
            <Url><![CDATA[{$v[3]}]]></Url>
            </item>";
        }
        $con.="</Articles>
          <FuncFlag>{$o_arr[1]}</FuncFlag>"; 
          break;
 
    } //end switch
 
    //=================end return============
    $con.="</xml>";
 
    return $con;
  }
 
 
  private function checkSignature()
  {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];  
 
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
 
    if( $tmpStr == $signature ){
      return true;
    }else{
      return false;
    }
  }
}
?>
PHP 相关文章推荐
PHP开发入门教程之面向对象
Dec 05 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
Oct 27 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
PHP优于Node.js的五大理由分享
Sep 15 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
php编写简单的文章发布程序
Jun 18 PHP
教大家制作简单的php日历
Nov 17 PHP
Smarty保留变量用法分析
May 23 PHP
简单PHP会话(session)说明介绍
Aug 21 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
Nov 01 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 PHP
php实现微信公众号无限群发
Oct 11 #PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
Oct 10 #PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 #PHP
刷新PHP缓冲区为你的站点加速
Oct 10 #PHP
PHP和Mysql中转UTF8编码问题汇总
Oct 10 #PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
Oct 10 #PHP
PHP内存使用情况如何获取
Oct 10 #PHP
You might like
php下统计用户在线时间的一种尝试
2010/08/26 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
jQuery包裹节点用法完整示例
2016/09/13 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
js中url对象化管理分析
2017/12/29 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
vue prop传值类型检验方式
2020/07/30 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
Python线程中对join方法的运用的教程
2015/04/09 Python
Python的gevent框架的入门教程
2015/04/29 Python
python中黄金分割法实现方法
2015/05/06 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
Python随机数函数代码实例解析
2020/02/09 Python
python deque模块简单使用代码实例
2020/03/12 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
大学生求职推荐信
2013/11/27 职场文书
设计大赛策划方案
2014/06/13 职场文书
被委托人身份证明
2015/08/07 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
Golang实现可重入锁的示例代码
2022/05/25 Golang