前言
前段时间,微信开放了一个非常牛逼的接口,那就是服务号可以创建自定义菜单了。有了这个接口之后,使用微信与公众号交流倒更像是一个与微信内部的一个app交流,大大的强化了公众号的灵活性。
在编辑模式下,公众号管理者可以直接编辑自定义菜单并设定用户点击菜单之后的回复内容或者跳转的指定链接。本文主要介绍使用开发者模式来自定义菜单完成每个用户的个性化内容回复。
介绍
自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。开启自定义菜单后,公众号界面如图所示:
目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
目前自定义菜单接口可实现两种类型按钮,如下:
- click: 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者,并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
- view: 用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
由第一点的click类型按钮可以延伸出很多的拓展功能,例如目前比较火的微信公众号:招商银行信用卡中心!利用用户点击的这个事件自定义生成一个链接,该链接加上用户的微信信息参数(例如openid)。用户点击链接进去之后可以进行相关的绑定信用卡的操作。这个操作过程如果不使用用户先进行操作而直接绑定是无法实现的。
而第二个view按钮则跟编辑模式类似,点击过后微信会使用其自带的浏览器打开一个链接。
实现
第一步:获取access_token
具体请参照 和小猪一起搞微信公众号开发—获取Access_token
第二步:设计好您的菜单列表并写出对应的json数据
小猪弄了个示例json数据
Postdata = "{'button':[{'type':'click','name':'只有一级C','key':'V1001_TODAY_MUSIC'}," + "{'type':'view','name':'只有一级V','key':'www.ruiyuedigi.com'}," + "{ 'name':'二菜单','sub_button':[{'type':'view','name':'二级view','url':'http://www.soso.com/'}," + " {'type':'view','name':'二级view','url':'http://v.qq.com/'}," + "{'type':'click','name':'二级Click','key':'V1001_111111'}," + "{'type':'click','name':'菜单最多7个字','key':'V1001_22222'}," + "{'type':'click','name':'最多5个菜单','key':'V1001_444444'}]}]" + "}",
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
button | 是 | 一级菜单数组,个数应为1~3个 |
sub_button | 否 | 二级菜单数组,个数应为1~5个 |
type | 是 | 菜单的响应动作类型,目前有click、view两种类型 |
name | 是 | 菜单标题,不超过16个字节,子菜单不超过40个字节 |
key | click类型必须 | 菜单KEY值,用于消息接口推送,不超过128字节 |
url | view类型必须 | 网页链接,用户点击菜单可打开链接,不超过256字节 |
第三步:创建http请求微信接口
同样,小猪把示例代码帖出来
#region https 请求 HttpHelper http = new HttpHelper(); HttpItem item = new HttpItem() { URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ruiyue.zhuqi.test",//URL 必需项 Method = "post",//URL 可选项 默认为Get Postdata = "{'button':[{'type':'click','name':'只有一级C','key':'V1001_TODAY_MUSIC'}," + "{'type':'view','name':'只有一级V','key':'www.ruiyuedigi.com'}," + "{ 'name':'二菜单','sub_button':[{'type':'view','name':'二级view','url':'http://www.soso.com/'}," + " {'type':'view','name':'二级view','url':'http://v.qq.com/'}," + "{'type':'click','name':'二级Click','key':'V1001_111111'}," + "{'type':'click','name':'菜单最多7个字','key':'V1001_22222'}," + "{'type':'click','name':'最多5个菜单','key':'V1001_444444'}]}]" + "}",//Post数据 可选项GET时不需要写 Timeout = 100000,//连接超时时间 可选项默认为100000 ReadWriteTimeout = 30000,//写入Post数据超时时间 可选项默认为30000 ContentType = "*",//返回类型 可选项有默认值 Allowautoredirect = false,//是否根据301跳转 }; HttpResult result = http.GetHtml(item); string html = result.Html;
这时候如果您接收到的html字符串为
{"errcode":0,"errmsg":"ok"}
那么恭喜你,你的自定义菜单创建成功了,
第四步:关注微信账号查看效果
附上完整的Controller=》Action代码
public ActionResult CreateMenu() { #region https 请求 HttpHelper http = new HttpHelper(); HttpItem item = new HttpItem() { URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ruiyue.zhuqi.test",//URL 必需项 Method = "post",//URL 可选项 默认为Get IsToLower = false,//得到的HTML代码是否转成小写 可选项默认转小写 Cookie = "",//字符串Cookie 可选项 Referer = "",//来源URL 可选项 Postdata = "{'button':[{'type':'click','name':'只有一级C','key':'V1001_TODAY_MUSIC'}," + "{'type':'view','name':'只有一级V','key':'www.ruiyuedigi.com'}," + "{ 'name':'二菜单','sub_button':[{'type':'view','name':'二级view','url':'http://www.soso.com/'}," + " {'type':'view','name':'二级view','url':'http://v.qq.com/'}," + "{'type':'click','name':'二级Click','key':'V1001_111111'}," + "{'type':'click','name':'菜单最多7个字','key':'V1001_22222'}," + "{'type':'click','name':'最多5个菜单','key':'V1001_444444'}]}]" + "}",//Post数据 可选项GET时不需要写 Timeout = 100000,//连接超时时间 可选项默认为100000 ReadWriteTimeout = 30000,//写入Post数据超时时间 可选项默认为30000 ContentType = "*",//返回类型 可选项有默认值 Allowautoredirect = false,//是否根据301跳转 }; HttpResult result = http.GetHtml(item); string html = result.Html; string cookie = result.Cookie; #endregion return Content(html); }