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模板引擎SMARTY
Oct 09 PHP
一个简单的自动发送邮件系统(二)
Oct 09 PHP
php录入页面中动态从数据库中提取数据的实现
Oct 09 PHP
用php实现选择排序的解决方法
May 04 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
Feb 13 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
PHP数组函数知识汇总
May 12 PHP
php的api数据接口书写实例(推荐)
Sep 22 PHP
PHP符合PSR编程规范的实例分享
Dec 21 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 PHP
php实现表单提交上传文件功能
May 28 PHP
php封装实现钉钉机器人报警接口的示例代码
Aug 08 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
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
Delphi笔试题
2016/11/14 面试题
2014年小班元旦活动方案
2014/02/16 职场文书
质检部经理岗位职责
2014/02/19 职场文书
中职生自荐信范文
2014/06/15 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
从事会计工作年限证明
2015/06/23 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL