教程跳票已经好久,5.0出来之后不少朋友在后台咨询如何用开发模式作自定义菜单,因为ZTalk是订阅号没有办法申请接口,幸亏WeMedia联盟的公众帐号已经转为服务号,就拿它来作教程了。php
源码请在公众号里输入 “微信代码”
查看下载链接,而后将下载连接本身想办法搞到PC上而后再下载……建议先下载安装了再看文章,如下是注意事项:数据库
一、make_menu.php是一个简易版的自定义菜单生成器,须要修改的是Appid和AppSecret,文件与原来和微信通信接口文件无关,只要下载后放到SAE上就能够执行,也不须要数据库。json
二、interface.php里主要是自定义菜单在用户点击后能够回复的一些东西,供你们参考。segmentfault
三、自定义菜单编辑模式的操做我这里不写了,你们能够看《微信公众平台入门到精通》Vol.4。数组
话说微信的接口指南一直作得不咋地,这边鼓励你们都转服务号,这边给的说明文档除了码农真没几个能看明白的,一点也不考虑大量的小白运营者,干脆叫指北算了。浏览器
牢骚完毕先说下开发自定义菜单第一步要作的就是获取凭证,即access_token,这步很是重要,微信接下来会开放更多的开发接口,开发者要操做接口都要经过这个access_token,而这个凭证是须要经过接口来生成的,而且是有失效时间的。缓存
生成凭证须要两个第三方的固定ID和秘钥,进入开发模式的页面,已经获取到自定义菜单接口权限的朋友会看到下图:微信
除了原来接口通信url和本身设置的token多了两个新字段即Appid和AppSecret,也就是第三方的固定ID和秘钥,有了这个就能经过接口程序获取到临时的凭证。将这两个id放到代码以下图位置:微信公众平台
这段代码主要是初始化了memcache和curl类,分别是缓存和抓取用的,同时将ID和秘钥也赋值了。接下来就是经过接口获取token,代码以下图:less
这是一个获取接口的函数,函数运行时首先是监测缓存中是否已经有token,若是有则直接从缓存中取,要知道官方限制天天只能获取100次token,因此作个缓存颇有必要。
若是缓存中没有token或者缓存时间过时,那么就使用curl这个类发送Appid和AppSecret到接口获取token,curl_setopt是定义抓取属性的,curl_exec是运行抓取,想了解相关的能够百度一下。
获取的到是一个json格式数据,使用json_decode转化为数组,而后判断是否获取到,若是没有则输出错误信息,获取成功则将该token保存到缓存中,同时函数返回token退出。这样咱们就很方便的拿到了凭证。
拿到access_token之后咱们就能够开始进行自定义菜单操做了,首先是建立自定义菜单,官方说明很简单“经过POST一个特定结构体,实如今微信客户端建立自定义菜单。”而后有一个特定结构体的示例,以下图:
还有一些关于这个特定结构体字段的说明:
参数 | 是否必须 | 说明 |
---|---|---|
button | 是 | 按钮数组,按钮个数应为2~3个 |
sub_button | 否 | 子按钮数组,按钮个数应为2~5个 |
type | 是 | 按钮类型,目前有click类型 |
name | 是 | 按钮描述,既按钮名字,不超过16个字节,子菜单不超过40个字节 |
key | 类型为click必须 | 按钮KEY值,用于消息接口(event类型)推送,不超过128字节 |
我估计有很多朋友会看的头晕,一是这个特定结构体传输过去时应该赋值给那个变量?二是这个结构体如何生成?首先传输过去不须要任何变量参数,其次这就是一个json格式数据,咱们能够用数组来转换生成。
建立菜单的函数很是简单,以下图:
在这里curl抓取页面的方式不是get而是post,因此属性会有所不一样,可是主要是接口地址和发送的特定结构体,这里的特定结构体是外面传递进来的值,变量名为$menu。
主要来看下我作的简易版的菜单生成器,直接在浏览器里打开make_menu.php就能够看到以下图(注意修改下代码里的Appid和AppSecret):
原本想作些JS效果的,可是这个菜单结构原本就很简单,就很少事了,上图三个区块分别对应三个底栏的主菜单,每一个区块都有主菜单名、关键字和子菜单。
在说上面的菜单前先讲下自定义菜单的规则,不管是主菜单仍是子菜单目前都是由最多三个属性组成的,即名称、关键字、类型(目前只有click,进行点击操做时会将关键字发送给微信后台),其中主菜单若是有子菜单的话,属性就两个,即名称、子菜单(点击操做时显示子菜单)。
如上所述我设计的这个简易版生成器忽略了类型选择,若是主菜单有子菜单时主菜单关键字实际上是不记录的,子菜单没什么可变化的就两个属性名称和关键字,类型默认为click。
固然将来会有新的菜单类型出来,好比地理位置,在这个基础改动下也很是方便就能使用。下面详细说下这个菜单的输入框要填写什么。
主菜单名称:底栏显示的名字,建议4-5个中文字或者8-10个英文字符,不然会名称显示会出现省略号;
主菜单关键字:主菜单向后台发送的关键字,若是该菜单有子菜单则关键字失效。
子菜单:子菜单我使用了textarea,每一个子菜单格式为“菜单名,关键字”,用换行来区分多个子菜单项。
表单提交后程序将进行处理,如图:
进行三次循环,每次都会读取一个区块的菜单,若是该区块主菜单名称不为空,则判断是否有子菜单,没有子菜单则直接生成主菜单,不然读取子菜单,同时判断子菜单是否超过5个。
这里使用urlencode是由于中文在数组转json时会被编码为unicode,微信接口没法识别,因此得在json_encode前先来个编码,等转换后再用urldecode转回来,这样传输给接口的就是正常的中文了。
另外特定结构体的数组结构实际上是[button]-》[main_menu]-》[sub_menu]
,因此三个主菜单最后是赋值给button这个数组的一个元素。
当特定结构体生成后分别执行新建make_menu类,删除旧菜单,建立新菜单,即:
$mk_menu=new make_menu(); $mk_menu->del_menu(); $mk_menu->create_new_menu($menu);
查询、删除菜单的代码很是简单你们能够本身看,分别是get_menu()和del_menu()两个函数。
自定义菜单生成后最重要的仍是要和用户互动,那么如何进行互动呢?首先要理解自定义菜单究竟是个什么玩意,其实点击菜单跟向微信公众平台发送一个文字是同样的,也就是用户输入文字公众平台自动回复能够作的事情理论上自定义菜单均可以完成!
可是有一点不一样的是,用户输入文字时咱们接收的消息类型是文字消息,可是自定义菜单的消息是事件推送,也就是它的类型是event,若是有看过我以前教程的朋友应该知道,能够经过这个类型的两个事件subscribe和unsubscribe来统计关注和取消关注的人数,菜单点击则是第三个类型“CLICK”。
也就是当后台捕捉到“CLICK”这个操做时就表示这是用户点击了自定义菜单,而后能够获取到EventKey(事件关键字),就是在建立菜单时设置的菜单关键字,后面的就不用我再详细说了吧。
如下是一些代码截图,可供参考:
先获取消息类型为事件推送,而后监测到事件类型是自定义菜单点击,而后获取该菜单关键字。
回复文字消息
回复音乐消息
回复图文消息
一些效果截图,想要测试效果的请微信搜索“wemedia”关注,点击这里也可下载本期教程源码包。