codecamp

微信公众平台 个性化菜单接口

个性化菜单接口


为了帮助公众号实现灵活的业务运营,微信公众平台新增了个性化菜单接口,开发者可以通过该接口,让公众号的不同用户群体看到不一样的自定义菜单。该接口开放给已认证订阅号和已认证服务号。

开发者可以通过以下条件来设置用户看到的菜单:

1、用户标签(开发者的业务需求可以借助用户标签来完成)
2、性别
3、手机操作系统
4、地区(用户在微信客户端设置的地区)
5、语言(用户在微信客户端设置的语言)

男女个性化菜单

个性化菜单接口说明:

1、个性化菜单要求用户的微信客户端版本在iPhone6.2.2,Android 6.2.4以上,暂时不支持其他版本微信
2、菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果
3、普通公众号的个性化菜单的新增接口每日限制次数为2000次,删除接口也是2000次,测试个性化菜单匹配结果接口为20000次
4、出于安全考虑,一个公众号的所有个性化菜单,最多只能设置为跳转到3个域名下的链接
5、创建个性化菜单之前必须先创建默认菜单(默认菜单是指使用普通自定义菜单创建接口创建的菜单)。如果删除默认菜单,个性化菜单也会全部删除
6、个性化菜单接口支持用户标签,请开发者注意,当用户身上的标签超过1个时,以最后打上的标签为匹配

个性化菜单匹配规则说明:

个性化菜单的更新是会被覆盖的。
例如公众号先后发布了默认菜单,个性化菜单1,个性化菜单2,个性化菜单3。那么当用户进入公众号页面时,将从个性化菜单3开始匹配,如果个性化菜单3匹配成功,则直接返回个性化菜单3,否则继续尝试匹配个性化菜单2,直到成功匹配到一个菜单。
根据上述匹配规则,为了避免菜单生效时间的混淆,决定不予提供个性化菜单编辑API,开发者需要更新菜单时,需将完整配置重新发布一轮。


创建个性化菜单

http请求方式:POST(请使用https协议)

https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=ACCESS_TOKEN

请求示例

{
 	"button":[
 	{	
    	"type":"click",
    	"name":"今日歌曲",
     	"key":"V1001_TODAY_MUSIC" 
	},
	{ 
		"name":"菜单",
		"sub_button":[
		{	
			"type":"view",
			"name":"搜索",
			"url":"http://www.soso.com/"
		},
		{
			"type":"view",
			"name":"视频",
			"url":"http://v.qq.com/"
		},
		{
			"type":"click",
			"name":"赞一下我们",
			"key":"V1001_GOOD"
		}]
 }],
"matchrule":{
  "tag_id":"2",
  "sex":"1",
  "country":"中国",
  "province":"广东",
  "city":"广州",
  "client_platform_type":"2",
  "language":"zh_CN"
  }
}

参数说明

参数是否必须说明
button一级菜单数组,个数应为1~3个
sub_button二级菜单数组,个数应为1~5个
type菜单的响应动作类型
name菜单标题,不超过16个字节,子菜单不超过40个字节
keyclick等点击类型必须菜单KEY值,用于消息接口推送,不超过128字节
urlview类型必须网页链接,用户点击菜单可打开链接,不超过1024字节
media_idmedia_id类型和view_limited类型必须调用新增永久素材接口返回的合法media_id
matchrule菜单匹配规则
tag_id用户标签的id,可通过用户标签管理接口获取
sex性别:男(1)女(2),不填则不做匹配
client_platform_type客户端版本,当前只具体到系统型号:IOS(1), Android(2),Others(3),不填则不做匹配
country国家信息,是用户在微信中设置的地区,具体请参考地区信息表
province省份信息,是用户在微信中设置的地区,具体请参考地区信息表
city城市信息,是用户在微信中设置的地区,具体请参考地区信息表
language语言信息,是用户在微信中设置的语言,具体请参考语言表:

1、简体中文 "zh_CN" 2、繁体中文TW "zh_TW" 3、繁体中文HK "zh_HK" 4、英文 "en" 5、印尼 "id" 6、马来 "ms" 7、西班牙 "es" 8、韩国 "ko" 9、意大利 "it" 10、日本 "ja" 11、波兰 "pl" 12、葡萄牙 "pt" 13、俄国 "ru" 14、泰文 "th" 15、越南 "vi" 16、阿拉伯语 "ar" 17、北印度 "hi" 18、希伯来 "he" 19、土耳其 "tr" 20、德语 "de" 21、法语 "fr"

matchrule共六个字段,均可为空,但不能全部为空,至少要有一个匹配信息是不为空的。 country、province、city组成地区信息,将按照country、province、city的顺序进行验证,要符合地区信息表的内容。地区信息从大到小验证,小的可以不填,即若填写了省份信息,则国家信息也必填并且匹配,城市信息可以不填。 例如 “中国 广东省 广州市”、“中国 广东省”都是合法的地域信息,而“中国 广州市”则不合法,因为填写了城市信息但没有填写省份信息。 地区信息表请点击下载

返回结果

正确时的返回JSON数据包如下,错误时的返回码请见接口返回码说明。

{
	"menuid":"208379533"
}

删除个性化菜单

http请求方式:POST(请使用https协议)

https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token=ACCESS_TOKEN

请求示例

{
	"menuid":"208379533"
}

menuid为菜单id,可以通过自定义菜单查询接口获取。

正确时的返回JSON数据包如下,错误时的返回码请见接口返回码说明。:

{"errcode":0,"errmsg":"ok"}

测试个性化菜单匹配结果

http请求方式:POST(请使用https协议)

https://api.weixin.qq.com/cgi-bin/menu/trymatch?access_token=ACCESS_TOKEN

请求示例

{
	"user_id":"weixin"
}

user_id可以是粉丝的OpenID,也可以是粉丝的微信号。

返回结果 该接口将返回菜单配置,示例如下:

{
    "button": [
        {
            "type": "view", 
            "name": "tx", 
            "url": "http://www.qq.com/", 
            "sub_button": [ ]
        }, 
        {
            "type": "view", 
            "name": "tx", 
            "url": "http://www.qq.com/", 
            "sub_button": [ ]
        }, 
        {
            "type": "view", 
            "name": "tx", 
            "url": "http://www.qq.com/", 
            "sub_button": [ ]
        }
    ]
}

错误时的返回码请见接口返回码说明。

查询个性化菜单

使用普通自定义菜单查询接口可以获取默认菜单和全部个性化菜单信息,请见自定义菜单查询接口的说明。

删除所有菜单

使用普通自定义菜单删除接口可以删除所有自定义菜单(包括默认菜单和全部个性化菜单),请见自定义菜单删除接口的说明。

自定义菜单设置

微信 自定义菜单事件推送
微信 获取自定义菜单配置接口
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

微信门店

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }