tnblog
首页
视频
资源
登录

后台调用菜单接口+自定义菜单

2930人阅读 2019/12/13 15:08 总访问:324908 评论:0 收藏:0 手机
分类: 微信公众号

假如有一天你喝醉了,一个人走在街头,会歇斯底里的喊出谁的名字?

时光如流水般逝去,站在青春的末稍,扭过头,观望曾经走过的岁月,感悟过去与现在的自己。


  今天我们分享的知识是:自己后台自定义搭建自己的微信公众号菜单栏。

 注释:初学者可参照微信公众号开发文档再结合本文章,那样更容易理解。

 

 第一步:我们需要新建一个类库封装菜单栏字段名称:代码如下:

 public  class WxMenuDTO
    {
        //一级菜单
        public string name { get; set; }
        public string key { get; set; }
        public string type { get; set; }
        public string url { get; set; }
        //二级菜单
        public List<WxMenuDTO> sub_button { get; set; }
    }

 第二步:我们需要在项目新建一个菜单控制器封装自定义菜单的方法:(菜单数据就相当于一个json对象)

 思路分析:通过调用实体字段自定义菜单栏--》通过post请求将数据发送到自己服务器端生成即可。代码如下:

  假如项目没有导入json对象,可手动依赖注入安装。命令为:Install-Package Newtonsoft.Json -Version 12.0.1

 public ActionResult CreateMenu()
        {
            HttpClient httpClient = new HttpClient();
            List<WxMenuDTO> wxMenuDTO = new List<WxMenuDTO>();  //跳转属性:view ,单击属性:click
            wxMenuDTO.Add(new WxMenuDTO() { name = "后端", key = "wx_menu_behind", type = "click",
                sub_button=new List<WxMenuDTO>()  //二级菜单
                {
                    new WxMenuDTO(){ name = "java", key = "wx_menu_java", type = "click" },
                    new WxMenuDTO(){ name = ".net", key = "wx_menu_net", type = "view" ,url= "http://www.tnblog.net/15985459135/article/details/2969"},
                    new WxMenuDTO(){ name = "python", key = "wx_menu_python", type = "click" }
                }
            });
            wxMenuDTO.Add(new WxMenuDTO() { name = "前端", key = "wx_menu_f", type = "click" ,
                sub_button=new List<WxMenuDTO>()
                {
                    new WxMenuDTO(){ name = "Vue", key = "wx_menu_vue", type = "click" },
                    new WxMenuDTO(){ name = "Mui", key = "wx_menu_mui", type = "click" },
                    new WxMenuDTO(){ name = "Layui", key = "wx_menu_layui", type = "click" }
                }
            });
            wxMenuDTO.Add(new WxMenuDTO() { name = "更多", key = "wx_menu_db", type = "click",
                sub_button = new List<WxMenuDTO>()
                {
                    new WxMenuDTO(){ name = "Ajax", key = "wx_menu_ajax", type = "click" },
                    new WxMenuDTO(){ name = "Json", key = "wx_menu_json", type = "click" },
                    new WxMenuDTO(){ name = "IO", key = "wx_menu_io", type = "click" }
                }
            });
            //在前面加button
            var tempobj = new { button = wxMenuDTO };
            //设置json 序列化忽略null值
            JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings();
            jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
             //拿到json字符串
            //需要在该项目使用依赖注入 json    Install-Package Newtonsoft.Json -Version 12.0.1
            string jsonstr = JsonConvert.SerializeObject(tempobj, jsonSerializerSettings);
            StringContent stringContent = new StringContent(jsonstr);
            string result = httpClient.PostAsync("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + AccessTokentools.GetToken(), stringContent).Result.Content.ReadAsStringAsync().Result;
            return Json(result,JsonRequestBehavior.AllowGet);
        }

第三步:由于新注册的微信公众号对于自定义菜单接口,没有权限,所以需要自己申请一个微信公众测试号进行操作一系列功能。

         测试号几乎拥有全部的功能权限,下图有个参考哦。

   


          

            对于测试号我们需要获取token。这里token则可以用自己注册的token使用。

            下面我们在定义token的类库里的把调用的appid和密码换成测试号的appid和密码就有权限自定义菜单了,代码如下:

 

public static string GetToken()
        {
            RedisClient redisClient = new RedisClient();
            //先从缓存中获取
            string token = redisClient.Get<string>("token");
            if (token != null)
            {
                return token;
            }
            //缓存中没有就从外网获取
            HttpClient httpClient = new HttpClient();
            //由于自己账号权限不足,所以使用微信测试账号做功能
            string result = httpClient.GetAsync("
         https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&
       appid=wwwwwwwww&secret=yyyyyyyyyyyyy").Result.Content.ReadAsStringAsync().Result;
            //下面要处理时间过期事件
            // 1,在该类库需要使用依赖注入 json    Install-Package Newtonsoft.Json -Version 12.0.1
            AccessTokenDTO accessTokenDTO = JsonConvert.DeserializeObject<AccessTokenDTO>(result);
            //2,把token写入缓存里
            //在该类库先依赖注入数据  install-package ServiceStack.Redis
            //手动启动redis服务
            //为了token 2小时过期,所以我们缓存的时间要和微信token时间大致相同,可设置差几百秒(160)
            redisClient.Set<string>("token", accessTokenDTO.access_token,TimeSpan.FromSeconds(accessTokenDTO.expires_in-160));
            return accessTokenDTO.access_token;
        }

  最后我们只需把项目跑起来,看json对象返回是否成功就行了。下图有参考。

 


  ok,这里返回数据成功后,大家可以把项目发布到自己的服务器上,然后打开微信扫一扫自己的测试号二维码关注看效果哦。


好啦,本次分享就到这里结束啦,下一篇文章分享微信公众号的接收和推送并记录消息功能。本篇文章有不懂的欢迎留言谈论哦。






评价
你之所以觉得时间一年比一年过得快,是因为时间对你一年比一年重要。
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
欢迎加群交流技术