日期:2014-05-17  浏览次数:20451 次

微信/易信公共平台开发(二):自定义菜单的PHP实现(提供源码)

微信把公众号分成订阅号和服务号两种,服务号可以自定义菜单, 菜单大大方便了用户操作。

比如:公众服务号 "中国南方航空" 的自定义菜单如下图:

 

点菜单就可以直接进入操作了,方便!

PS:微信服务号需要以单位身份注册(需上传单位证件等进行认证),个人身份只能注册订阅号(无自定义菜单)

PS:易信允许所有公众号均可自定义菜单(还是易信好!)

 

 

但是,对于公共平台开发者来说,定义、生成菜单还真有一点点麻烦。

我看了开发文档,测试了3个小时,才算搞明白了。在此,写点心得,并提供一个类,彻底简化开发者的编码工作。

 

先讲一下原理(详见公共平台开发文档):

1,注册公众号、开通开发者模式时,平台将提供两个参数 APPID,APPSECRET (对于微信的订阅号,平台不提供; 易信所有公众号均提供)

2,自定义菜单前,须向平台申请一个使用凭证(AccessToken), 方法如下:

      用GET方式读取URL https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

  其中:APPID,APPSECRET 用实际参数值代入

  返回结果是一个JSON格式的文本,其中有AccessToken. (JSON是一种数据交换格式,不了解的同学要从头学一下才能明白)

      AccessToken不是永久有效的,返回结果中有一个失效时间,即过了XX秒后(一般是一天左右), AccessToken就会失效。

 

      对于易信平台,上述URL为 https://api.yixin.im/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

 

3,获得有效的AccessToken后,就可以进行自定义菜单创建、删除操作了。

3.1 创建菜单

     用POST方式向这个URL提交菜单定义数据, URL:https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

 其中:ACCESS_TOKEN 用实际参数值代入

    菜单定义数据是一个JSON格式的文本 (开发文档讲得不是那么清晰,让我理解了好一会),做为POST方式的提交数据

 返回结果是一个JSON格式的文本,其中有操作成功码和出错信息

 

 对于易信平台,创建菜单的URL为 https://api.yixin.im/cgi-bin/menu/create?access_token=ACCESS_TOKEN

 

3.2 删除菜单

      用GET方式读取URL https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

  其中:ACCESS_TOKEN 用实际参数值代入

  返回结果是一个JSON格式的文本,其中有AccessToken. (JSON是一种数据交换格式,不了解的同学要从头学一下才能明白)

      AccessToken不是永久有效的,返回结果中还有一个失效时间,即过了XX秒后(一般是一天左右), AccessToken就会失效。

 

      对于易信平台,上述URL为 https://api.yixin.im/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

 

上述过程需要开发者非常了解 HTTP协议细节和JSON格式,对于一般开发者来说,可能是个噩梦。

 

经本人编码、测试,在此提供两个类,彻底简化开发者的自定义菜单的开发工作 (开发者无需再去理解HTTP协议、JSON和公共平台协议了)

 

结果如下:

 

开发语言: PHP 5.X

源码下载地址: http://download.csdn.net/detail/c80486/6357873

文件名:jostudio.wechatmenu.php   此处只讲其使用。(感兴趣的同学,可以看源代码注释)

文件中定义了两个类:

第一个类:WeChatMenu  用于菜单操作

第二个类:MenuDefine 用于菜单数据定义

 

用这两个类实现的自定义菜单操作,例程文件 test_menu.php

 

<?php
include_once 'jostudio.wechatmenu.php'; //包含WeChatMenu类

$AppId="9cXXXXXXXXXXXXXXXXXX";     //公共平台提供的AppId参数
$AppSecret="61XXXXXXXXXXXXXX"; //公共平台提供的AppSecret参数

//创建一个WeChatMenu类的实例
$object = new WeChatMenu("weixin",$AppId, $AppSecret);   //第一个参数 "weixin", 表明是针对微信平台的
//$object = new WeChatMenu("yixin",$AppId, $AppSecret); //第一个参数 "yixin", 表明是针对易信平台的

 

//定义一个菜单数据
$menu = new MenuDefine();   //创建一个MenuDefine实例

$menu->menuStart();  //菜单开始

$menu->addMenu("娱乐天地");
$menu->addMenuItem("猜谜语", "riddle");
$menu->addMenuItem("讲笑话", "joke");
$menu->addMenuItem("听音乐", "music");
$menu->addMenuItem("看电影", "movie");
$menu->addMenuItem("看小说", "novel");

$menu->addMenu("实用工具");
$menu->addMenuItem(&q