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 相关文章推荐
建立文件交换功能的脚本(一)
Oct 09 PHP
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
php Http_Template_IT类库进行模板替换
Mar 19 PHP
Php Image Resize图片大小调整的函数代码
Jan 17 PHP
深入php数据采集的详解
Jun 02 PHP
深入PHP magic quotes的详解
Jun 17 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
Feb 18 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
Jun 30 PHP
ThinkPHP中调用PHPExcel的实现代码
Apr 08 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
Dec 15 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获取网页请求状态程序示例
2014/06/17 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
Laravel 5 框架入门(一)
2015/04/09 PHP
js 异步处理进度条
2010/04/01 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
javascript简单实现命名空间效果
2014/03/06 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
python Scrapy框架原理解析
2021/01/04 Python
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
往来会计岗位职责
2013/12/19 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
党支部换届选举方案
2014/05/08 职场文书
防火标语大全
2014/10/06 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书