• 在上篇文章实现微信扫码获取带指定参数时,微信公众号后台启用了服务器配置,导致之前设置好的微信自定义菜单失效。 开启了服务器配置,就无法用之前的方式在微信公众平台配置自定义菜单 此时,我们要通过接口来...

    在上篇文章实现微信扫码获取带指定参数时,微信公众号后台启用了服务器配置,导致之前设置好的微信自定义菜单失效。
    这里写图片描述
    开启了服务器配置,就无法用之前的方式在微信公众平台配置自定义菜单
    此时,我们要通过接口来配置微信自定义菜单,微信自定义菜单接口链接

    这里写图片描述

    首先,我们打开微信公众平台接口调试工具 接口调试工具
    1.通过appid以及secret来获取access_token,
    这里写图片描述

    2.组织创建菜单内容。微信提供了许多不同功能的按钮类型,可根据实际需求组织创建。
    这里简单的创建两个1级view类型按钮:即用户点击按钮实现跳转URL。

    {
        "button": [
            {
                "type": "view", 
                "name": "百度", 
                "url": "http://www.baidu.com"
            }, 
            {
                "type": "view", 
                "name": "淘宝", 
                "url": "http://www.taobao.com"
            }
        ]
    }

    3.在接口调试工具- - -选择 ‘自定义菜单’的接口类型,填入access_token,以及刚刚构建好的菜单内容。

    这里写图片描述

    点击检查问题,如果填写参数正确,则请求成功。
    这里写图片描述

    此时,重新打开或重新关注公众号,即能看到刚刚构建的自定义菜单已经生效。

    展开全文
  • 1.很多同学都吐槽,搞了个服务号,自然要好好发挥自定义菜单这个得天独厚的功能。 但在开发者模式下,要么通过本地代码上传,但这个很容易失败; 要么编辑好菜单的JSON数据,使用在线生成的办法,但这会遇到一个...

    1.很多同学都吐槽,搞了个服务号,自然要好好发挥自定义菜单这个得天独厚的功能。
    但在开发者模式下,要么通过本地代码上传,但这个很容易失败;
    要么编辑好菜单的JSON数据,使用在线生成的办法,但这会遇到一个问题,如果使用记事本保存的JSON代码,粘贴到网页上经常出现invalid key size的错误,原因在于记事本是gb2312编码,网页是utf8编码,况且这个方法也非常容易出错。

    那么最好用的自定义菜单生成方式是什么?

    首先,搜索“微社区”,立即开通;
    进入“管理中心”——“我的公众号”,添加自己的微信公众号,添加公众号
    接着,完成添加后,选择“自定义菜单”,右边选择需要修改菜单的公众号,点击“确定”。
    修改菜单
    在这里可按说明修改!
    这是目前我发现的在开发者模式下修改自定义菜单最便捷的方法,与大家共享!更多微信公众平台开发知识,请查看我的专栏哦!有问题可直接加Q:724122005:)

    ==========2016年4月18日更新=============
    以上自定义生成已不可用,
    可在此 : http://www.xjabc.net/weixinjiekoukaifa/menu.php 生成。

    展开全文
  • 要知道公众号开启开发者模式后,公众号自带的功能就不能使用了。 那么如何自定义菜单呢? 此时,我们要通过接口来配置微信自定义菜单微信自定义菜单接口链接 先查看官方文档的自定义菜单: 然后,我们打开微信...

    在这里插入图片描述
    要知道公众号开启开发者模式后,公众号自带的功能就不能使用了。
    那么如何自定义菜单呢?
    此时,我们要通过接口来配置微信自定义菜单,微信自定义菜单接口链接
    先查看官方文档的自定义菜单:
    在这里插入图片描述
    然后,我们打开微信公众平台接口调试工具 接口调试工具
    首先,通过appid以及secret来获取access_token:
    在这里插入图片描述
    获取到了access_token后,就开始组织创建菜单内容了。
    微信官方提供了许多不同功能的按钮类型,可根据实际需求组织创建。
    在这里插入图片描述
    这里简单的添加了一个按钮点击click事件、一个view点击跳转事件、还有一个二级菜单事件。注意:click按钮都是key-value的形式的,所以这个key属性的值就是你在后台获取到该事件的key;而view事件的url则是点击该按钮将要跳转的url;二级菜单则是用sub_button属性将要展开的按钮事件包裹在内。

    {
        "button": [
            {
                "type": "click", 
                "name": "我的绑定", 
                "key": "binding"
            }, 
            {
                "type": "view", 
                "name": "绑定用户", 
                "url": "http://eduapp.guangyusoft.com/xxxxx1.jsp"
            }, 
            {
                "name":"使用指南",
               "sub_button":[
               {    
                   "type":"view",
                   "name":"为什么要绑定微信",
                   "url":"http://eduapp.guangyusoft.com/xxxxx2.jsp"
                },
               {    
                   "type":"view",
                   "name":"红包的发放规则",
                   "url":"http://eduapp.guangyusoft.com/xxxxx3.jsp"
                },
               {    
                   "type":"view",
                   "name":"系统使用模式",
                   "url":"http://eduapp.guangyusoft.com/xxxxx4.jsp"
                }]
            }
        ]
    }
    

    最后,在接口调试工具中,选择 “自定义菜单”的接口类型,填入access_token,和刚刚构建好的菜单内容。
    在这里插入图片描述
    点击检查问题,如果填写参数正确,则请求成功。
    在这里插入图片描述
    然后就可以在公众号中看到成效了。如果打开公众号没效果的话,重复打开关闭公众号几次或者重新关注公众号即可。
    在这里插入图片描述

    展开全文
  • 微信公众号开启了第三方服务器之后,很多在微信平台上的配置都需要开发者通过微信提供的API,POST请求,将JSON字符串按格式,告知微信服务器 在这里介绍微信公众号自定义菜单栏开发 先恭迎我们的TX文档 微信...

    在微信公众号开启了第三方服务器之后,很多在微信平台上的配置都需要开发者通过微信提供的API,POST请求,将JSON字符串按格式,告知微信服务器

    在这里介绍微信公众号的自定义菜单栏开发

    先恭迎我们的TX文档       微信公众号——自定义菜单栏

    官方文档里说明了一些需要注意的事项

     

    在这里 我只使用了几个我业务中用到的类型 哈哈哈 本来在考虑要不要加在后台上,后来想想反正他们有事都找自己,直接写了一个get接口 要删要改,调接口

    建立了一个菜单栏类

    public class MenuModel
        {
            public MenuModel(string name = "", string type = "", string url = "", string key = "", string pagepath = "", string appid = "")
            {
                Sub_Button = new List<MenuModel>();
                if (name != "")
                {
                    Name = name;
                }
                if (type != "")
                {
                    Type = type;
                }
                if (url != "")
                {
                    Url = url;
                }
                if (key != "")
                {
                    Key = key;
                }
                if (pagepath != "")
                {
                    Pagepath = pagepath;
                }
                if (appid != "")
                {
                    Appid = appid;
                }
            }
            public List<MenuModel> Sub_Button { get; set; }
            /// <summary>
            /// 名字
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// 类型
            /// </summary>
            public string Type { get; set; }
            /// <summary>
            /// 地址
            /// </summary>
            public string Url { get; set; }
            /// <summary>
            /// 菜单KEY值,用于消息接口推送
            /// </summary>
            public string Key { get; set; }
            /// <summary>
            /// 小程序页面地址
            /// </summary>
            public string Pagepath { get; set; }
            /// <summary>
            /// 小程序appid
            /// </summary>
            public string Appid { get; set; }
            //通过递归格式化所需json字符串
            public string ToJson(List<MenuModel> modelList)
            {
                string result = "";
                foreach (var a in modelList)
                {
                    if (!a.Sub_Button.Any())
                    {
                        result += "{\"type\":\"" + a.Type + "\",\"name\":\"" + a.Name + "\",";
                        if (a.Url != null)
                        {
                            result += "\"url\":\"" + a.Url + "\",";
                        }
                        if (a.Key != null)
                        {
                            result += "\"key\":\"" + a.Key + "\",";
                        }
                        if (a.Appid != null)
                        {
                            result += "\"appid\":\"" + a.Appid + "\",";
                        }
                        if (a.Pagepath != null)
                        {
                            result += "\"pagepath\":\"" + a.Pagepath + "\",";
                        }
                        string lastStr = result.Substring(result.Length - 1, 1);
                        if (lastStr == ",")
                        {
                            result = result.Substring(0, result.Length - 1);
                        }
                        result += "},";
    
                    }
                    else
                    {
                        result += "{\"name\":\"" + a.Name + "\",\"sub_button\":[";
                        result += a.ToJson(a.Sub_Button);
                        result += "},";
                    }
                    if (modelList.Count - 1 == modelList.IndexOf(a))
                    {
                        string lastStr = result.Substring(result.Length - 1, 1);
                        if (lastStr == ",")
                        {
                            result = result.Substring(0, result.Length - 1);
                        }
                        result += "]";
                    }
                }
                return result;
            }
        }
    [HttpGet]
            public HttpResponseMessage Menu(int type)
            {
                string wxResult = "token异常";
    
                OfficialAccountsAccessToken accessToken = _officialAccountsAccessTokenService.GetFirst();
                string oaToken = "";
                accessToken.Changed = false;
                accessToken = WxApi.GetOfficiaAccountsACCESS_TOKEN(accessToken);
                if (accessToken != null && accessToken.access_token != null)
                {
                    if (accessToken.Changed)
                    {
                        _officialAccountsAccessTokenService.Update(accessToken);
                    }
                    oaToken = accessToken.access_token;
                }
                //1 add  2 del
                if (type == 1)
                {
                    //添加自定义菜单
                    string appid = WxConfig.APPID;
                    MenuModel model = new MenuModel();
    
                    //一级菜单1
                    MenuModel menu_1 = new MenuModel("预约服务");
                    MenuModel menu_1_1 = new MenuModel("随心套餐", "miniprogram", "小程序页面没有的话进入这个URL", "", "小程序发布页面路径", appid);
                    menu_1.Sub_Button.Add(menu_1_1);
                    model.Sub_Button.Add(menu_1);
    
                    //一级菜单2
                    MenuModel menu_2 = new MenuModel("注册有礼");
    //click类型中 下面的V2002_Service 是和消息事件有关系的
                    MenuModel menu_2_2 = new MenuModel("联系客服", "click", "", "V2002_Service", "", "");
                    menu_2.Sub_Button.Add(menu_2_2);
                    model.Sub_Button.Add(menu_2);
    
                    ////一级菜单3
                    //MenuModel menu_3 = new MenuModel("新人体验", "miniprogram", "http://mp.weixin.qq.com", "", "/pages/new_comer_act/new_comer_act", appid);
                    //model.Sub_Button.Add(menu_3);
    
                    MenuModel menu_3 = new MenuModel("活动特惠");
                    MenuModel menu_3_1 =  new MenuModel("随心套餐", "miniprogram", "小程序页面没有的话进入这个URL", "", "小程序发布页面路径", appid);
                    menu_3.Sub_Button.Add(menu_3_1);
                    model.Sub_Button.Add(menu_3);
                    string result = "{\"button\":[";
                    result += model.ToJson(model.Sub_Button);
                    result += "}";
    
    
                    string url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + oaToken;
                    wxResult = Core.Lib.HttpService.Post(result, url, false, 600);
                }
                else
                {
                    //删除自定义菜单
                    wxResult = Core.Lib.HttpService.Get("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + oaToken);
    
                }
    
                return new HttpResponseMessage()
                    {
                        Content = new StringContent(wxResult, Encoding.GetEncoding("UTF-8"), "application/x-www-from-urlencoded")
                    };
    
            }

     

    展开全文
  • 纯属分享 var config = require('./admin/wx/config/config'); var API = require('wechat-api'); ...var api = new API(config.appid, config.appsecret);...api.getAccessToken(function (err, token) { ...

    纯属分享

    var config = require('./admin/wx/config/config');  
    var API = require('wechat-api'); 
    
    var api = new API(config.appid, config.appsecret); 
    api.getAccessToken(function (err, token) {  
        console.log(err);  
        console.log(token);  //accessToken
    });  
    
    var menu = JSON.stringify(require('./admin/wx/config/wx_menu.json'));  
    api.createMenu(menu, function (err, result) {  
        console.log(result); // { errcode: 0, errmsg: 'ok' }
    }); 

    config.js

    module.exports = {  
        appid : "wx6238bb5b691334fc",  
        appsecret : "da41b732f36f9d390eb9835605a38423"  
    }

    wx_menu.json

    {  
      "button":[  
        {  
          "type":"click",  
          "name":"今日歌曲",  
          "key":"V1001_TODAY_MUSIC"  
        },  
        {  
          "type":"click",  
          "name":"歌手简介",  
          "key":"V1001_TODAY_SINGER"  
        },  
        {  
          "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"  
            }  
          ]  
        }  
      ]  
    }  

     

     

    result 返回结果为:
    { errcode: 0, errmsg: 'ok' } 者表示成功!
    为下面这个就是表示没有权限使用自定义菜单:
    { errcode: 48001,errmsg: 'api unauthorized hint: [iHQZfa0607vr46!]' }
    http://mp.weixin.qq.com/debug  这个地址可以测试


    还有一种方法:
            var u = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=m9UgecuDsgZurHHk17MBYPJEtCtZ-2-whaYodfDkXhvRpyy-NL06nJz5IA9EYplajmz8DNYad8yxP2NC1T5jHZw6k25eNVjYQwohX7PSO6xMaNo6z6wTOHceuF6KCz0qBSLhAFAOFY';
            var content = JSON.stringify(require('./config/wx_menu.json'));//这是需要提交的数据  
            var  options = {
                url: u,
                form: content,
                headers: {
                  'Content-Type': 'application/x-www-form-urlencoded'
                }
              };
              
              request.post(options, function (err, res, body) {
                if (err) {
                  console.log(err)
                }else {
                  console.log(body);
                }
              })

    这种方式得先拿到 access_token 值,这个值是2个小时更新一次

    代码:

    var qs = require('querystring'); 
    var
    queryParams = { 'grant_type': 'client_credential', 'appid': config.appId, 'secret': config.appSecret }; var wxGetAccessTokenBaseUrl = 'https://api.weixin.qq.com/cgi-bin/token?'+qs.stringify(queryParams); var options = { method: 'GET', url: wxGetAccessTokenBaseUrl }; request(options, function (err, res, body) { if (err) { console.log(err); } else { console.log(body); } });

     

    转载于:https://www.cnblogs.com/bruce-gou/p/6368881.html

    展开全文
  • java版微信公众号开发之自定义菜单的创建
  • 说明:有时候我们微信公众号后台启用了自己的开发者服务器,自定义菜单就不能通过微信公众号后台创建,这时候需要在服务器自己写创建菜单的方法。 1.注意事项 1、自定义菜单最多包括3个一级菜单,每个一级菜单最多...
  • 前几篇文章已讲完如何导入项目,如何启动配置项目,如何成为开发者,重源码分析消息是如何交互(如果前四项不是很清楚可以看这里 极速开发微信公众号。这篇文章就来讲讲如果实现自定义菜单 实现自定义菜单有两种...
  • 事件还原:前段时间想添加几个关键字回复然后发现...原因:哪怕再开发者模式下配置了自定义菜单,每次关闭开发者模式在开启后都需要重新生成一次自定义菜单接口 解决方案:https://blog.csdn.net/weixin_39696369/...
  • 用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互; 2、view:跳转URL ...
  • 微信打开开发者模式后,以前通过微信后台配置的菜单就失效了,需要通过我们自己服务器后台配置(需要开发),还有一种比较简单的方法,就是通过微信提供的“微信公众平台接口测试工具”进行配置。下面重点说一下通过...
  • 微信公众平台公众帐号及服务号可以在会话界面底部按需设置自定义菜单;且可为自定义菜单设置响应动作,可以通过点击菜单,收到你指定的消息或跳转到指定的网页。但是有些特殊情况我们的自定义菜单无法使用也无法更改...
  • 微信公众号开发者模式下的自定义菜单回复图片和图文1 注意的是,区分好个人订阅号和测试号;2.先获取token值;自定义菜单代码(php)讲下重点代码: 话不多说,我分析我遇到的问题和解决方法。 1 注意的是,区分好...
  • 以下是微信公众平台对 添加自定义菜单 的文档说明:1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。 3、创建...
  • 微信公众号开发生成自定义菜单
  • 例如,公众号是什么,它有什么特点,它能做什么,怎么开发公众号。 其次,通过本课程的学习,学员能够掌握微信公众平台开发的方法、技术和应用实现。例如,开发者文档怎么看,开发环境怎么搭建,基本的消息交互...
  • 微信公众号自定义菜单创建及响应 一配置相关工具类: 1.证书信任管理器(用于https请求) package com.jcxx.saas.wxapi.CustomMenuUtil; import javax.net.ssl.X509TrustManager; import java.security.cert....
  • 微信公众号开发,自定义菜单出不来,然而在网页调试工具里面执行就成功了
  • 一步一步完全按照步骤,轻松在微信公众号自定义菜单中添加图标。 第一步:打开PHP网页列表 http://code.iamcal.com/php/emoji/第二步:选择代码表中softbank列代码,复制,例如U+E536 ...
1 2 3 4 5 ... 20
收藏数 4,313
精华内容 1,725