C#开发微信门户及采取(29)–微信个性化菜单的贯彻

By admin in 亚洲必赢app在哪下载 on 2018年10月5日

起一段时间没有随着微信的主题继续介绍中的功能模块了,这段时来,微信为举行了成千上万之扭转改动,针对这些特点我到审核了瞬间有关的微信公众号以及供销社号的接口,对旧的微信API和系统管理做了健全的翻新,本随笔和后的随笔就是依据这工作达成之下结论,以期将微信涉及的功能模块,都使用C#心想事成之法门来介绍。本随笔主要介绍微信公众号的个性化菜单的兑现,虽然眼前微信公众号及供销社号曾当效能及看似一致,不过在公司号上还没个性化菜单的系接口。

1、个性化菜单介绍

俺们先行了解一下个性化菜单的介绍,根据官方的资料,如下介绍。

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

开发者可以经过以下标准来设置用户看到底菜谱:

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

个性化菜单接口说明:

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

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

当公众号创建多个个性化菜单时,将按照发布顺序,由新到旧逐一匹配,直到用户信息与matchrule相符合。如果全部个性化菜单都没有匹配成功,则返回默认菜单。
例如公众号先后发布了默认菜单,个性化菜单1,个性化菜单2,个性化菜单3。那么当用户进入公众号页面时,将从个性化菜单3开始匹配,如果个性化菜单3匹配成功,则直接返回个性化菜单3,否则继续尝试匹配个性化菜单2,直到成功匹配到一个菜单。
根据上述匹配规则,为了避免菜单生效时间的混淆,决定不予提供个性化菜单编辑API,开发者需要更新菜单时,需将完整配置重新发布一轮。

除外正常的默认菜单外,个性化菜单提供了底几乎独处理操作。

1 创建个性化菜单

2 删除个性化菜单

3 测试个性化菜单匹配结果

4 查询个性化菜单

5 删除所有菜单

个性化自定义菜单功能,是凭铺可以依据粉丝的分组、性别、手机操作系统,甚至地区,来分别显示公众号的食谱。

准,一贱健身会所的公众号,将于定义菜单根据粉丝性别进行了分别设置。男性粉丝进入公众号会展示男生等比感兴趣菜单内容,跆拳道、搏击等;若是女粉丝,则会来得瑜伽、舞蹈、防身术等女性粉丝感兴趣之菜系课程等。

图片 1

 

2、个性化菜单的C#规划处理

微信的菜谱是微信处理中好重要之同一环绕,因为它们是微信叫用户输入体验重要的一律环抱,也是很直观的界面呈现之一,菜单的亮就是亟需我们绞尽脑汁来简单的界面元素了,由于菜单的主要及效能的丰富性,我以前面好几篇随笔专门介绍了菜单的各种处理。

在《C#支付微信门户及运用(6)–微信门户菜单的管理操作》、《C#付出微信门户及以(9)-微信门户菜单管理和交至微信服务器》、《C#出微信门户及下(11)–微信菜单的多种见方法介绍》、《C#支出微信门户及应用(20)-微信企业号的菜系管理》分别对有关的食谱来了介绍,有要好参见了解一下。

菜单模块,在微信公众号及商家号,它们都可联手用一个模型,因此我们把这些情节都放在微信联手用模块里面,包括其的实体类信息(如菜单模块),虽然小地方,部分字段内容并未,但是我们可以通过实体类的JSON标识来进行拍卖,从而实现比弹性化的实业类信息承载。

正如标识代码所示。

    /// <summary>
    /// 菜单基本信息(公众号、企业号公用,其他部分一样)
    /// </summary>
    public class MenuJson : BaseJsonResult
    {
        /// <summary>
        /// 按钮描述,既按钮名字,不超过16个字节,子菜单不超过40个字节
        /// </summary>
        public string name { get; set; }

        /// <summary>
        /// 按钮类型(click或view)
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string type { get; set; }

        /// <summary>
        /// 按钮KEY值,用于消息接口(event类型)推送,不超过128字节
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string key { get; set; }

        /// <summary>
        /// 网页链接,用户点击按钮可打开链接,不超过256字节
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string url { get; set; }

        /// <summary>
        /// media_id类型和view_limited类型必须,调用新增永久素材接口返回的合法media_id
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string media_id { get; set; }

        /// <summary>
        /// 子按钮数组,按钮个数应为2~5个
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public List<MenuJson> sub_button { get; set; }

上面这实体类是菜单信息的根底信息,我们需要由者基础及扩张出来几独实体类,方便在构建,获取菜单信息之时光进行信息变换,如下几单类图的计划性所示。

图片 2

由此这几个像样的关系,我们不怕可以适应所有的默认菜单与个性化菜单,以及公司号的菜单信息易处理了,通过JSON转换为相应的实体类,实现信息的强类型处理。

里我们菜单处理的API实现类代码如下所示。

    /// <summary>
    /// 菜单的相关操作
    /// </summary>
    public class MenuApi : IMenuApi

然我们在IMenuApi的底子及加几只个性化的接口。

        /// <summary>
        /// 创建个性化菜单
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="menuJson">菜单对象</param>
        /// <returns></returns>
        string CreateConditionalMenu(string accessToken, MenuListJson menuJson);

        /// <summary>
        /// 根据菜单ID删除个性化菜单
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="menuid">菜单ID</param>
        /// <returns></returns>
        CommonResult DeleteConditionalMenu(string accessToken, string menuid);

        /// <summary>
        /// 测试个性化菜单匹配结果
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <returns></returns>
        MenuListJson TryMatchConditionalMenu(string accessToken, string user_id);

下一场在MenuApi贯彻类似中实现相关的逻辑处理即可。

脚是创办个性化菜单的接口说明。

创建个性化菜单

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":{
  "group_id":"2",
  "sex":"1",
  "country":"中国",
  "province":"广东",
  "city":"广州",
  "client_platform_type":"2"
  "language":"zh_CN"
  }
}

内点的音讯,转换为我们的实体类对象信息就是之类所示。

MenuListJson menuJson

它API返回结果如下所示。

{
    "menuid":"208379533"
}

以承载这个消息,我们用定义一个实体类来承载这个信息。

    /// <summary>
    /// 返回MenuId的结果
    /// </summary>
    public class MenuIdResult
    {       
        /// <summary>
        /// 菜单的ID
        /// </summary>
        public string menuid { get; set; }
    }

最终咱们的API接口就待得到里面的菜单ID值,字符串类型的就得了,API具体实现代码如下所示。

        /// <summary>
        /// 创建个性化菜单
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="menuJson">菜单对象</param>
        /// <returns></returns>
        public string CreateConditionalMenu(string accessToken, MenuListJson menuJson)
        {
            string result = "";
            var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token={0}", accessToken);
            //matchrule不能为空
            ArgumentValidation.CheckForNullReference(menuJson.matchrule, "matchrule");

            string postData = menuJson.ToJson();
            MenuIdResult list = JsonHelper<MenuIdResult>.ConvertJson(url, postData);
            if (list != null)
            {
                result = list.menuid;
            }
            return result;
        }

假定除去个性化菜单的接口也是类似的处理,如下所示。

        /// <summary>
        /// 根据菜单ID删除个性化菜单
        /// </summary>
        /// <param name="accessToken">调用接口凭证</param>
        /// <param name="menuid">菜单ID</param>
        /// <returns></returns>
        public CommonResult DeleteConditionalMenu(string accessToken, string menuid)
        {
            var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token={0}", accessToken);
            var data = new
            {
                menuid = menuid
            };

            string postData = data.ToJson();
            return Helper.GetExecuteResult(url, postData);
        }

此外,对于个性化菜单来说,查询、删除所有的食谱操作接口和普通默认菜单是一律的,因此得以引用这简单独接口,不过出于我们扩张了询问返回的信息类,所以如果是个性化菜单,那么她回到的JSON字符串里面,包含了conditionalmenu的特性,这个是一个集合
,也就是说个性化菜单是基本上个规则的个性化菜单的联谊。

图片 3

菜单的JSON数据结构如下所示。

图片 4

 

3、个性化菜单封装接口的应用

发生矣面接口的包装,我们可以当创立个性化菜单的时节死有益于了,构建个性化菜单的时刻,我们要将整用出现的菜单都待在一个conditionalmenu的单元中,虽然这样的单元在集结里面出现多单。

若是下面是构建一个个性化的菜系种类,和常见的默认菜单不同,它需要指定一个matchrule的对象,如下代码所示。

            MenuJson conditional = new MenuJson("相关链接", new MenuJson[] { 
                new MenuJson("个性化菜单", ButtonType.click, "event_company")
            });
            MatchRule rule = new MatchRule()
            {
                sex = "1"
            };

            MenuListJson menuJson = new MenuListJson();
            menuJson.button.AddRange(new MenuJson[] { conditional });
            menuJson.matchrule = rule;

由此上面的代码了解,我们若需要充实多独个性化菜单,那么就算是经是方法,每次创建一个个性化菜单的不二法门开展构建,当然要我们利用查询个性化菜单的结果可以看,如果创建多个,那么conditionalmenu集合里面凡是大抵单对象的。

调用代码每次添加一个个性化菜单的操作如下所示。

                string menuid = menuBLL.CreateConditionalMenu(token, menuJson);
                Console.WriteLine("创建菜单:" + (!string.IsNullOrEmpty(menuid) ? "成功:" + menuid : "失败"));

咱创建多只规则后,可以经TryMatch的法来检查匹配的结果,也就是本着许不同用户(openid)会并发不同之个性化菜单列表了。

                    var myResult = menuBLL.TryMatchConditionalMenu(token, openId);
                    if (myResult != null)
                    {
                        Console.WriteLine(myResult.ToJson());
                    }

                    var userid_female = "oSiLnt2J4mYkhVG3aLTdMIF1hv-s";//女性的ID
                    myResult = menuBLL.TryMatchConditionalMenu(token, userid_female);
                    if (myResult != null)
                    {
                        Console.WriteLine(myResult.ToJson());
                    }

 

假使对斯《C#支出微信门户及下》系列感兴趣,可以关心我之另外文章,系列随笔如下所示:

C#出微信门户及利用(28)–微信“摇一摇·周边”功能的使用和接口的实现

C#支出微信门户及以(27)-公众号模板消息管理 

C#开发微信门户及下(26)-公众号微信资料管理

C#开微信门户及使用(25)-微信企业号的客户端管住功能

C#付出微信门户及利用(24)-微信小店货架信息保管

C#开发微信门户及用(23)-微信小店商品管理接口的卷入和测试

C#支付微信门户及下(22)-微信小店的支出与利用

C#开发微信门户及使用(21)-微信企业号的信及事件之收纳处理和解密 

C#支付微信门户及运用(20)-微信企业号的菜系管理

C#付出微信门户及动(19)-微信企业号的信发送(文本、图片、文件、语音、视频、图文信息等)

C#支付微信门户及应用(18)-微信企业号的通讯录管理出的成员管理

C#开发微信门户及运用(17)-微信企业号的通讯录管理出之部门管理

C#支付微信门户及动(16)-微信企业号的配置与运

C#开发微信门户及使用(15)-微信菜单增加扫一扫、发图、发地理位置功能

 C#支付微信门户及运用(14)-在微信菜单中行使重定向获用户数量

C#开发微信门户及动(13)-使用地理位置扩展相关应用

C#开微信门户及采取(12)-使用语音处理

C#支出微信门户及应用(11)–微信菜单的余呈现方法介绍

C#出微信门户及用(10)–在治本网遭到联手微信用户分组信息

C#支出微信门户及下(9)-微信门户菜单管理及交到微信服务器

C#开发微信门户及使用(8)-微信门户应用管理体系功能介绍

C#开微信门户及利用(7)-微信多客服功能跟开发并

C#支出微信门户及以(6)–微信门户菜单的保管操作

C#开发微信门户及下(5)–用户分组信息保管

C#开微信门户及使用(4)–关注用户列表及详细信息管理

C#付出微信门户及利用(3)–文本信以及图文信息之应对

C#出微信门户及用(2)–微信信息之处理及对

C#支付微信门户及动(1)–开始用微信接口

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 亚洲必赢app官方下载 版权所有