【微信公众平台开发】创建自定义菜单(四)

来源:互联网 发布:linux 开机自动mount 编辑:程序博客网 时间:2024/04/28 09:35

1.根据微信公众平台文档,得知创建自定义菜单有如下规则:

a.目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。


注:所以最多只能创建15个功能菜单,多了就出错了!


b.

目前自定义菜单接口可实现两种类型按钮,如下:

click:用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;view:用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值(即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。

c.

接口调用请求说明

http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN


2.根据文档提供的规则和接口调用说明,封装成一个类编写代码如下

  1. class WeChatCreateMenu  
  2. {  
  3. <span style="white-space:pre">    </span>//判断token是否过期,如果过期重新获取,不然直接从数据库取  
  4.     public function Get_access_token($appid,$secret){  
  5.       
  6.         $db = DBManage::getInstance();  
  7.         $db->ConnDB();  
  8.         $sql = "select * from t_token";  
  9.           
  10.         if($db-> GetEffectRows($sql) > 0)  
  11.         {  
  12.             $sql = "select * from t_token where TokenFlag='sd'";  
  13.             $res = $db->GetData($sql);  
  14.               
  15.             while$obj = mysqli_fetch_object($res))  
  16.             {  
  17.                 if($obj->TokenTime-60 > time()) //Token还没过期  
  18.                 {  
  19.                     return $obj->Token;  
  20.                 }  
  21.                 else  //过期  
  22.                 {  
  23.                     break;  
  24.                 }  
  25.                   
  26.             }  
  27.         }  
  28.           
  29.         $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret;  
  30.         $json=self::DoCurlGetRequest($url);  
  31.         $retData=json_decode($json,true);  
  32.           
  33.         if(!$retData)  
  34.         {  
  35.             return false;  
  36.         }  
  37.           
  38.         $token = $retData['access_token'];  
  39.         $expire = $retData['expires_in'];  
  40.         $oldTime = time() + $expire;  
  41.           
  42.         $sql = "select * from t_token";  
  43.       
  44.         if($db-> GetEffectRows($sql) == 0) //无数据  
  45.         {  
  46.             $sql = "insert into t_token values('sd','$token','$oldTime')";  
  47.             $db->ExecSql($sql);  
  48.         }  
  49.         else //更新 数据  
  50.         {  
  51.             $sql = "update t_token set Token='$token',TokenTime='$oldTime' where TokenFlag='sd'";  
  52.             $db->ExecSql($sql);  
  53.         }  
  54.         //file_put_contents("debug.txt", "token====".$token.PHP_EOL,FILE_APPEND);  
  55.           
  56.         return $token;  
  57.     }  
  58.       
  59.     //因为url是https 所有请求不能用file_get_contents,用curl请求json 数据  
  60.     private function DoCurlGetRequest($url){  
  61.         $ch = curl_init();  
  62.         curl_setopt($ch, CURLOPT_URL,$url);  
  63.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
  64.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  
  65.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  66.         $result = curl_exec($ch);  
  67.         curl_close($ch);  
  68.         return $result;  
  69.     }  
  70.       
  71.     function DoCurlPostRequest($url$jsonData){  
  72.         $con = curl_init((string)$url);  
  73.         curl_setopt($con,CURLOPT_HEADER, false);  
  74.         curl_setopt($con, CURLOPT_POSTFIELDS,$jsonData);  
  75.         curl_setopt($con, CURLOPT_POST, true);  
  76.         curl_setopt($con, CURLOPT_RETURNTRANSFER, true);  
  77.         curl_setopt($con,CURLOPT_SSL_VERIFYPEER,false);  //略过证书验证  
  78.         $result = curl_exec($con) ;  
  79.         if(curl_errno($con))  
  80.         {  
  81.             file_put_contents("tmp.txt", curl_errno($con).PHP_EOL,FILE_APPEND);  
  82.         }  
  83.           
  84.         return $result;  
  85.     }  
  86.       
  87.     public  function  CreateMenu()  
  88.     {  
  89.         $token = $this->Get_access_token("wxa5fd3441ffa34","a49921c7d71b57850c57d1f589");  
  90.         $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$token;  //自定义菜单接口  
  91.           
  92.         $menuData = array(  
  93.             'button' => array(  
  94.                 array(  
  95.                         'name' => '走进窗骑',  
  96.                         'sub_button' => array(  
  97.                                 array(  
  98.                                         'type' =>'click',  
  99.                                         'name' => '微官网',  
  100.                                         'key' => 'sdwgw'  
  101.                                 ),  
  102.                                 array(  
  103.                                         'type' =>'view',  
  104.                                         'name' => '全品牌推广',  
  105.                                         'url' => 'http://128.88.44.11/WXProject/DataHtml/html/qpptg.html'  
  106.                                 ),  
  107.                                 array(  
  108.                                         'type' =>'view',  
  109.                                         'name' => '3D影视包装',  
  110.                                         'url' => 'http://128.88,44,11/WXProject/DataHtml/html/3d.html'  
  111.                                 ),  
  112.                                 array(  
  113.                                         'type' =>'view',  
  114.                                         'name' => '互动体验',  
  115.                                         'url' => 'http://128.88.44.11/WXProject/DataHtml/html/hudong.html'  
  116.                                 ),  
  117.                                 array(  
  118.                                         'type' =>'view',  
  119.                                         'name' => '合作客户',  
  120.                                         'url' => 'http://128.88.44.11/WXProject/DataHtml/html/partner.html'  
  121.                                 )  
  122.                                   
  123.                                   
  124.                     )  
  125.                 ),  
  126.                 array(  
  127.                         'name' => '微楼书',  
  128.                         'sub_button' =>array(  
  129.                                 array(  
  130.                                         'type' =>'click',  
  131.                                         'name' => '项目概况',  
  132.                                         'key' => 'xmgk'  
  133.                                 ),  
  134.                                 array(  
  135.                                         'type' =>'view',  
  136.                                         'name' => '区位配套',  
  137.                                         'url' => 'http://128.88.44.11/WXProject/DataHtml/qwpt.html'  
  138.                                 ),  
  139.                                 array(  
  140.                                         'type' =>'view',  
  141.                                         'name' => '景观鉴赏',  
  142.                                         'url' => 'http://128.88.44.11/WXProject/WXPicBrowser/jgjd.php'  
  143.                                 ),  
  144.                                 array(  
  145.                                         'type' =>'view',  
  146.                                         'name' => '户型展示',  
  147.                                         'url' => 'http://128.88.44.11/WXProject/WXPicBrowser/jdhx.php'  
  148.                                 ),  
  149.                                 array(  
  150.                                         'type' =>'view',  
  151.                                         'name' => '3D视频',  
  152.                                         'url' => 'http://128.88.44.11/WXProject/DataHtml/video.html'  
  153.                                 )  
  154.                         )   
  155.                 ),  
  156.                 array(  
  157.                     'name' => "互动体验",  
  158.                     'sub_button' => array(  
  159.                                 array(  
  160.                                         'type' =>'click',  
  161.                                         'name' => '会员中心',  
  162.                                         'key' => 'hyzx'  
  163.                                 ),  
  164.                                 array(  
  165.                                         'type' =>'view',  
  166.                                         'name' => '看房预约',  
  167.                                         'url' => 'http://128.88.44.11/WXProject/DataPHP/seehouse.php'  
  168.                                 ),  
  169.                                 array(  
  170.                                         'type' =>'view',  
  171.                                         'name' => '智能问答',  
  172.                                         'url' => 'http://128.88.44.11/WXProject/DataPHP/test.php'  
  173.                                 ),  
  174.                                 array(  
  175.                                         'type' =>'view',  
  176.                                         'name' => '一键功能',  
  177.                                         'url' => 'http://128.88.44.11/WXProject/onetouchdial.html#mp.weixin.qq.com'  
  178.                                 ),  
  179.                                 array(  
  180.                                         'type' =>'click',  
  181.                                         'name' => '刮刮乐',  
  182.                                         'key' => 'ggl'  
  183.                                 )  
  184.                     )  
  185.                 )  
  186.             )  
  187.         );  
  188.           
  189.         $data = JSON($menuData);  
  190.           
  191.         $this->DoCurlPostRequest($url,$data);  //以https发送post请求  
  192.     }  
  193. }  
写完上面的类,直接在index.php,调用就行了;然后按前面几篇介绍的方法传到sae上面,运行测试


3.大概思路:根据微信的文档说明,首先按规则创建好菜单,然后按规定写好创建自定义菜单接口,接着用https发送post请求,微信服务器收到请求,判断发送过来的接口没错;微信服务器发送创建好的菜单到每一位微信用户的客户端显示。


----------------------------------------------------------------------------------------------------------------------------------------------------------

有同学说没有数据库操作类,我也直接贴出来吧!

  1. <?php  
  2. class DBManage  
  3. {  
  4.     private $conn;  
  5.     private static $_instance;  
  6.       
  7.     public function __clone()  
  8.     {  
  9.         trigger_error("Clone is not allow!",E_USER_ERROR);  
  10.     }  
  11.       
  12.     public static function getInstance()  
  13.     {  
  14.         if(!self::$_instance instanceof self)  
  15.         {  
  16.             self::$_instance = new self;  
  17.         }  
  18.         return self::$_instance;  
  19.     }  
  20.       
  21.     function ConnDB()  
  22.     {  
  23.         $this->conn = mysqli_init();  
  24.         $ret = mysqli_real_connect($this->conn, "122.128.111.111""root""mima222""wxdb", 6033, "t_userinfo", MYSQLI_CLIENT_FOUND_ROWS);  
  25.           
  26.     }  
  27.   
  28.     function ExecSql($sql)  
  29.     {  
  30.         $ret = mysqli_query($this->conn, $sql);  
  31.         return $ret;  
  32.     }  
  33.       
  34.     function GetEffectRows($sql)  
  35.     {  
  36.         $ret = mysqli_query($this->conn, $sql);  
  37.         return mysqli_num_rows($ret);  
  38.     }  
  39.       
  40.     function GetData($sql)  
  41.     {  
  42.         $ret = mysqli_query($this->conn, $sql);  
  43.           
  44.         return $ret;  
  45.     }  
  46.       
  47.       
  48. }  
  49. ?>  

0 0
原创粉丝点击