澳门威利斯人_威利斯人娱乐「手机版」

来自 网络资讯 2019-08-24 09:21 的文章
当前位置: 澳门威利斯人 > 网络资讯 > 正文

含实例源码,详解自定义菜单

不错开上下班时间的回来JSON数据包如下:

微信公众平台开采教程(五)自定桐花菜单

请珍重小编版权,如需转发,请申明出处。

应大家猛烈供给,将自定桐花菜单功用课程提前。

3、查询菜单

行使接口创立自定蒿子单后,开拓者还可选择接口查询自定同蒿单的组织。

诉求表明

http请求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN

回来申明

对应创建接口,正确的Json返回结果:
{"menu":{"button":[{"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC","sub_button":[]},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER","sub_button":[]},{"name":"菜单","sub_button":[{"type":"view","name":"搜索","url":"http://www.soso.com/","sub_button":[]},{"type":"view","name":"视频","url":"http://v.qq.com/","sub_button":[]},{"type":"click","name":"赞一下我们","key":"V1001_GOOD","sub_button":[]}]}]}}

1)从文件加载菜单

3、查询菜单

接纳接口创设自定同蒿单后,开荒者还可接纳接口查询自定菊花菜单的构造。

呼吁表达

http请求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN

回来注脚

对应创建接口,正确的Json返回结果:
{"menu":{"button":[{"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC","sub_button":[]},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER","sub_button":[]},{"name":"菜单","sub_button":[{"type":"view","name":"搜索","url":"http://www.soso.com/","sub_button":[]},{"type":"view","name":"视频","url":"http://v.qq.com/","sub_button":[]},{"type":"click","name":"赞一下我们","key":"V1001_GOOD","sub_button":[]}]}]}}

2、设置菜单

菜单需遵照需求,根据实际必要开展设定。

此处大家提供应煤天气查询功用,将常用的城市列出来,点击就可以查询。

接下来还提供了友情链接,这里提供了view类型的美食指南,直接能够跳转至U奥迪Q7L页面,为跳转做个好的以身作则。

切实菜单如下:

图片 1

{
    "button": [
        {
            "name": "链接", 
            "sub_button": [
                {
                    "type": "view", 
                    "name": "搜索", 
                    "url": "http://www.baidu.com/"
                }, 
                {
                    "type": "view", 
                    "name": "视频", 
                    "url": "http://v.qq.com/"
                }, 
                {
                    "type": "click", 
                    "name": "赞一下我们", 
                    "key": "BTN_GOOD"
                }
            ]
        }, 
        {
            "name": "查询天气", 
            "sub_button": [
                {
                    "type": "click", 
                    "name": "武汉", 
                    "key": "BTN_TQ_WUHAN"
                }, 
                {
                    "type": "click", 
                    "name": "上海", 
                    "key": "BTN_TQ_SHANGHAI"
                }, 
                {
                    "type": "click", 
                    "name": "北京", 
                    "key": "BTN_TQ_BEIJING"
                }
            ]
        }, 
        {
            "type": "click", 
            "name": "帮助", 
            "key": "BTN_HELP"
        }
    ]
}

图片 2

当前自定菊花菜单最多包蕴3个超级菜单,各个一流菜单最多带有5个二级菜单。一流菜单最多4个汉字,二级菜单最多7个汉字,多出去的一部分将会以“...”代替。请留心,创立自定蒿菜单后,由于微信客商端缓存,要求24钟头微信客商端才会议及展览现出来。建议测量试验时能够品尝撤除关心大伙儿账号后再度关心,则足以观望创造后的成效。

3、管理菜单

因为菜单的更换未有那么频仍,由此通过txt文件来安装菜单,并透过管制分界面来管理菜单。

重大的治本作用:

1)从文件加载菜单

2)成立菜单。将在菜单公告微信服务端,并更新至微信客商端

3)查询菜单。获取当前系统的美食做法。

4)删除菜单。从微信服务器删除菜单,也能够去除后再成立。 

兑今世码如下:

    public class MenuManager
    {
        /// <summary>
        /// 菜单文件路径
        /// </summary>
        private static readonly string Menu_Data_Path = System.AppDomain.CurrentDomain.BaseDirectory   "/Data/menu.txt";
        /// <summary>
        /// 获取菜单
        /// </summary>
        public static string GetMenu()
        {
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", Context.AccessToken);

            return HttpUtility.GetData(url);
        }
        /// <summary>
        /// 创建菜单
        /// </summary>
        public static void CreateMenu(string menu)
        {
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}", Context.AccessToken);
            //string menu = FileUtility.Read(Menu_Data_Path);
            HttpUtility.SendHttpRequest(url, menu);
        }
        /// <summary>
        /// 删除菜单
        /// </summary>
        public static void DeleteMenu()
        {
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", Context.AccessToken);
            HttpUtility.GetData(url);
        }
        /// <summary>
        /// 加载菜单
        /// </summary>
        /// <returns></returns>
        public static string LoadMenu()
        {
            return FileUtility.Read(Menu_Data_Path);
        }
    }

1、获取access_token

首先须要拿到AppId和AppSecret

当您形成开荒者后,自然能够在,开荒者形式,便可看出那四个值,可以复位。

然后调用依据二.1中所示,举行操作。

注意:access_token有逾期时间,倘使过期,必要再一次赢得。

代码如下:

图片 3

       private static DateTime GetAccessToken_Time;
        /// <summary>
        /// 过期时间为7200秒
        /// </summary>
        private static int Expires_Period = 7200;
        /// <summary>
        /// 
        /// </summary>
        private static string mAccessToken;
        /// <summary>
        /// 
        /// </summary>
        public static string AccessToken
        {
            get
            {
                //如果为空,或者过期,需要重新获取
                if (string.IsNullOrEmpty(mAccessToken) || HasExpired())
                {
                    //获取
                    mAccessToken = GetAccessToken(AppID, AppSecret);
                }

                return mAccessToken;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        /// <returns></returns>
        private static string GetAccessToken(string appId, string appSecret)
        {
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSecret);
            string result = HttpUtility.GetData(url);

            XDocument doc = XmlUtility.ParseJson(result, "root");
            XElement root = doc.Root;
            if (root != null)
            {
                XElement access_token = root.Element("access_token");
                if (access_token != null)
                {
                    GetAccessToken_Time = DateTime.Now;
                    if (root.Element("expires_in")!=null)
                    {
                        Expires_Period = int.Parse(root.Element("expires_in").Value);
                    }
                    return access_token.Value;
                }
                else
                {
                    GetAccessToken_Time = DateTime.MinValue;
                }
            }

            return null;
        }
        /// <summary>
        /// 判断Access_token是否过期
        /// </summary>
        /// <returns>bool</returns>
        private static bool HasExpired()
        {
            if (GetAccessToken_Time != null)
            {
                //过期时间,允许有一定的误差,一分钟。获取时间消耗
                if (DateTime.Now > GetAccessToken_Time.AddSeconds(Expires_Period).AddSeconds(-60))
                {
                    return true;
                }
            }
            return false;
        }

图片 4

 

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

1、获取access_token

第一必要获得AppId和AppSecret

当您成为开拓者后,自然能够在,开荒者情势,便可知到那七个值,能够重新恢复设置。

接下来调用遵照二.第11中学所示,进行操作。

注意:access_token有逾期时间,假若过期,须要再行获得。

代码如下:

       private static DateTime GetAccessToken_Time;
        /// <summary>
        /// 过期时间为7200秒
        /// </summary>
        private static int Expires_Period = 7200;
        /// <summary>
        /// 
        /// </summary>
        private static string mAccessToken;
        /// <summary>
        /// 
        /// </summary>
        public static string AccessToken
        {
            get
            {
                //如果为空,或者过期,需要重新获取
                if (string.IsNullOrEmpty(mAccessToken) || HasExpired())
                {
                    //获取
                    mAccessToken = GetAccessToken(AppID, AppSecret);
                }

                return mAccessToken;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        /// <returns></returns>
        private static string GetAccessToken(string appId, string appSecret)
        {
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSecret);
            string result = HttpUtility.GetData(url);

            XDocument doc = XmlUtility.ParseJson(result, "root");
            XElement root = doc.Root;
            if (root != null)
            {
                XElement access_token = root.Element("access_token");
                if (access_token != null)
                {
                    GetAccessToken_Time = DateTime.Now;
                    if (root.Element("expires_in")!=null)
                    {
                        Expires_Period = int.Parse(root.Element("expires_in").Value);
                    }
                    return access_token.Value;
                }
                else
                {
                    GetAccessToken_Time = DateTime.MinValue;
                }
            }

            return null;
        }
        /// <summary>
        /// 判断Access_token是否过期
        /// </summary>
        /// <returns>bool</returns>
        private static bool HasExpired()
        {
            if (GetAccessToken_Time != null)
            {
                //过期时间,允许有一定的误差,一分钟。获取时间消耗
                if (DateTime.Now > GetAccessToken_Time.AddSeconds(Expires_Period).AddSeconds(-60))
                {
                    return true;
                }
            }
            return false;
        }

 

4、删除菜单

利用接口创立自定义菜单后,开拓者还可采用接口删除当前使用的自定蒿子杆单。

呼吁表达

http请求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

回去表明

对应创建接口,正确的Json返回结果:
{"errcode":0,"errmsg":"ok"}

接口调用诉求表明

2、设置菜单

菜单需依靠必要,遵照实际要求进行设定。

此地大家提供应煤天气查询效用,将常用的都会列出来,点击就可以查询。

接下来还提供了友情链接,这里提供了view类型的美食做法,直接能够跳转至U中华VL页面,为跳转做个好的以身作则。

实际菜单如下:

{
    "button": [
        {
            "name": "链接", 
            "sub_button": [
                {
                    "type": "view", 
                    "name": "搜索", 
                    "url": "http://www.baidu.com/"
                }, 
                {
                    "type": "view", 
                    "name": "视频", 
                    "url": "http://v.qq.com/"
                }, 
                {
                    "type": "click", 
                    "name": "赞一下我们", 
                    "key": "BTN_GOOD"
                }
            ]
        }, 
        {
            "name": "查询天气", 
            "sub_button": [
                {
                    "type": "click", 
                    "name": "武汉", 
                    "key": "BTN_TQ_WUHAN"
                }, 
                {
                    "type": "click", 
                    "name": "上海", 
                    "key": "BTN_TQ_SHANGHAI"
                }, 
                {
                    "type": "click", 
                    "name": "北京", 
                    "key": "BTN_TQ_BEIJING"
                }
            ]
        }, 
        {
            "type": "click", 
            "name": "帮助", 
            "key": "BTN_HELP"
        }
    ]
}

3、管理菜单

因为菜单的转移未有那么频仍,由此通过txt文件来安装菜单,并因而管理分界面来保管菜单。

器重的治本功用:

1)从文件加载菜单

2)创立菜单。就要菜单布告微信服务端,并立异至微信客商端

3)查询菜单。获取当前系统的菜单。

4)删除菜单。从微信服务器删除菜单,也足以去除后再创设。 

落到实处代码如下:

图片 5

    public class MenuManager
    {
        /// <summary>
        /// 菜单文件路径
        /// </summary>
        private static readonly string Menu_Data_Path = System.AppDomain.CurrentDomain.BaseDirectory   "/Data/menu.txt";
        /// <summary>
        /// 获取菜单
        /// </summary>
        public static string GetMenu()
        {
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", Context.AccessToken);

            return HttpUtility.GetData(url);
        }
        /// <summary>
        /// 创建菜单
        /// </summary>
        public static void CreateMenu(string menu)
        {
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}", Context.AccessToken);
            //string menu = FileUtility.Read(Menu_Data_Path);
            HttpUtility.SendHttpRequest(url, menu);
        }
        /// <summary>
        /// 删除菜单
        /// </summary>
        public static void DeleteMenu()
        {
            string url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", Context.AccessToken);
            HttpUtility.GetData(url);
        }
        /// <summary>
        /// 加载菜单
        /// </summary>
        /// <returns></returns>
        public static string LoadMenu()
        {
            return FileUtility.Read(Menu_Data_Path);
        }
    }

图片 6

恳请表明

三、实例讲授

还跟着上一篇文章讲。微教徒人账号支付教程(三) 实例入门:机器人(附源码)

小编们将要上一篇小说基础上,增多自定同蒿单作用。

5、事件管理

客商点击自定桐花菜单后,如若菜单按键设置为click类型,则微信会把这次点击事件推送给开拓者,注意view类型(跳转到USportageL)的菜系点击不会反映。

推送XML数据包示例:

图片 7

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>

图片 8

参数说明:

 

参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 消息类型,event
Event 事件类型,CLICK
EventKey 事件KEY值,与自定义菜单接口中KEY值对应

参数表明:

1、首先得到access_token 

access_token是大众号的大局独一票据,公众号调用各接口时都需选择access_token。常常意况下access_token保质期为7200秒,重复获取将导致上次收获的access_token失效。

大伙儿号能够采纳AppID和AppSecret调用本接口来赢得access_token。AppID和AppSecret可在支付模式中拿走(供给已经济体改成开辟者,且帐号未有丰裕情状)。只顾调用全数微信接口时均需使用https合同。

接口调用央求表达

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数表达

参数 是否必须 说明
grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,既appsecret

回来表明

正规状态下,微信会重临下述JSON数据包给公众号:

{"access_token":"ACCESS_TOKEN","expires_in":7200}
参数 说明
access_token 获取到的凭证
expires_in 凭证有效时间,单位:秒

错误时微信会重返错误码等信息,JSON数据包示比如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"} 

二、详细步骤:

然后调用遵照二.第11中学所示,进行操作。

4、基本措施

上面的代码,其实大家对一部分国有职能做了包装。如举办get乞请、POST提交等操作,读取文件等。

此地我们提供开展get、Post提交的点子案例代码,假如选择,提议优化。

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

namespace Yank.WeiXin.Robot.Utility
{
    /// <summary>
    /// Http帮助类
    /// </summary>
    class HttpUtility
    {
        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="url">Url地址</param>
        /// <param name="data">数据</param>
        public static string SendHttpRequest(string url, string data)
        {
            return SendPostHttpRequest(url,"application/x-www-form-urlencoded",data); 
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string GetData(string url)
        {
            return SendGetHttpRequest(url,"application/x-www-form-urlencoded"); 
        }

        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="url">Url地址</param>
        /// <param name="method">方法(post或get)</param>
        /// <param name="method">数据类型</param>
        /// <param name="requestData">数据</param>
        public static string SendPostHttpRequest(string url,string contentType,string requestData)
        {
            WebRequest request = (WebRequest)HttpWebRequest.Create(url);
            request.Method = "POST";
            byte[] postBytes = null;
            request.ContentType = contentType;
            postBytes = Encoding.UTF8.GetBytes(requestData);
            request.ContentLength = postBytes.Length;
            using (Stream outstream = request.GetRequestStream())
            {
                outstream.Write(postBytes, 0, postBytes.Length);
            }
            string result = string.Empty;
            using (WebResponse response = request.GetResponse())
            {
                if (response != null)
                {                    
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                        {
                            result = reader.ReadToEnd();
                        }
                    }

                }
            }
            return result;
        }

        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="url">Url地址</param>
        /// <param name="method">方法(post或get)</param>
        /// <param name="method">数据类型</param>
        /// <param name="requestData">数据</param>
        public static string SendGetHttpRequest(string url, string contentType)
        {
            WebRequest request = (WebRequest)HttpWebRequest.Create(url);
            request.Method = "GET";
            request.ContentType = contentType;
            string result = string.Empty;
            using (WebResponse response = request.GetResponse())
            {
                if (response != null)
                {
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                        {
                            result = reader.ReadToEnd();
                        }
                    }
                }
            }
            return result;
        }
    }
}

 

using System;
using System.Xml.Linq;
using Newtonsoft.Json;

namespace Yank.WeiXin.Robot.Utility
{
    class XmlUtility
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="json"></param>
        /// <param name="rootName"></param>
        /// <returns></returns>
        public static XDocument ParseJson(string json,string rootName)
        {
            return JsonConvert.DeserializeXNode(json, rootName);
        }
    }
}

 

5、事件管理

安装了菜单,那下必要处总管件了。跟大家在此以前设计ASPX可能WinForm一样,都要绑定按键的事件。这里只是通过XML音信将呼吁传递过来。

因此“2、设置菜单"中具体的美食做法内容,大家便已经精晓须要开展什么事件管理了。对于按键类型为view的,无须管理,它会自行跳转至钦命url.

亟需管理的点击事件:

1)赞一下

2)查询某都会的天气,新加坡、北京、德雷斯顿

3)帮助

以此还要沿用上章中的事件管理器伊夫ntHandler来扩充管理。

实际的兑今世码吧:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yank.WeiXin.Robot.Messages;

namespace Yank.WeiXin.Robot.Handlers
{
    class EventHandler : IHandler
    {
        /// <summary>
        /// 请求的xml
        /// </summary>
        private string RequestXml { get; set; }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="requestXml"></param>
        public EventHandler(string requestXml)
        {
            this.RequestXml = requestXml;
        }
        /// <summary>
        /// 处理请求
        /// </summary>
        /// <returns></returns>
        public string HandleRequest()
        {
            string response = string.Empty;
            EventMessage em = EventMessage.LoadFromXml(RequestXml);
            if (em != null)
            {
                switch (em.Event.ToLower())
                {
                    case ("subscribe"):
                        response = SubscribeEventHandler(em);
                        break;
                    case "click":
                        response = ClickEventHandler(em);
                        break;
                }
            }

            return response;
        }
        /// <summary>
        /// 关注
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        private string SubscribeEventHandler(EventMessage em)
        {
            //回复欢迎消息
            TextMessage tm = new TextMessage();
            tm.ToUserName = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime = Common.GetNowTime();
            tm.Content = "欢迎您关注***,我是大哥大,有事就问我,呵呵!nn";
            return tm.GenerateContent();
        }
        /// <summary>
        /// 处理点击事件
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        private string ClickEventHandler(EventMessage em)
        {
            string result = string.Empty;
            if (em != null && em.EventKey != null)
            {
                switch (em.EventKey.ToUpper())
                {
                    case "BTN_GOOD":
                        result = btnGoodClick(em);
                        break;
                    case "BTN_TQ_BEIJING":
                        result = searchWeather("beijing", em);
                        break;
                    case "BTN_TQ_SHANGHAI":
                        result = searchWeather("shanghai", em);
                        break;
                    case "BTN_TQ_WUHAN":
                        result = searchWeather("wuhai", em);
                        break;
                    case "BTN_HELP":
                        result = btnHelpClick(em);
                        break;
                }
            }

            return result;
        }
        /// <summary>
        /// 赞一下
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        private string btnGoodClick(EventMessage em)
        {
            //回复欢迎消息
            TextMessage tm = new TextMessage();
            tm.ToUserName = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime = Common.GetNowTime();
            tm.Content = @"谢谢您的支持!";
            return tm.GenerateContent();
        }
        /// <summary>
        /// 帮助
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        private string btnHelpClick(EventMessage em)
        {
            //回复欢迎消息
            TextMessage tm = new TextMessage();
            tm.ToUserName = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime = Common.GetNowTime();
            tm.Content = @"查询天气,输入tq 城市名称拼音首字母";
            return tm.GenerateContent();
        }
        /// <summary>
        /// 查询天气
        /// </summary>
        /// <param name="cityName"></param>
        /// <param name="em"></param>
        /// <returns></returns>
        private string searchWeather(string cityName, EventMessage em)
        {
            TextMessage tm = new TextMessage();
            tm.Content = WeatherHelper.GetWeather(cityName);
            //进行发送者、接收者转换
            tm.ToUserName = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime = Common.GetNowTime();
            return tm.GenerateContent();
        }
    }
}

  

6、效果图

算是大工告成,最终来看下效果图吧

图片 9

 

注意:

请体贴作者版权,如需转发,请标记出处。

 下一章布置:

微信徒人平台开辟教程(六)获取天性二维码

4、基本措施

地点的代码,其实大家对有些集体职能做了包装。如进行get诉求、POST提交等操作,读取文件等。

那边我们提供开展get、Post提交的措施案例代码,假如选取,建议优化。

图片 10

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

namespace Yank.WeiXin.Robot.Utility
{
    /// <summary>
    /// Http帮助类
    /// </summary>
    class HttpUtility
    {
        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="url">Url地址</param>
        /// <param name="data">数据</param>
        public static string SendHttpRequest(string url, string data)
        {
            return SendPostHttpRequest(url,"application/x-www-form-urlencoded",data); 
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string GetData(string url)
        {
            return SendGetHttpRequest(url,"application/x-www-form-urlencoded"); 
        }

        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="url">Url地址</param>
        /// <param name="method">方法(post或get)</param>
        /// <param name="method">数据类型</param>
        /// <param name="requestData">数据</param>
        public static string SendPostHttpRequest(string url,string contentType,string requestData)
        {
            WebRequest request = (WebRequest)HttpWebRequest.Create(url);
            request.Method = "POST";
            byte[] postBytes = null;
            request.ContentType = contentType;
            postBytes = Encoding.UTF8.GetBytes(requestData);
            request.ContentLength = postBytes.Length;
            using (Stream outstream = request.GetRequestStream())
            {
                outstream.Write(postBytes, 0, postBytes.Length);
            }
            string result = string.Empty;
            using (WebResponse response = request.GetResponse())
            {
                if (response != null)
                {                    
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                        {
                            result = reader.ReadToEnd();
                        }
                    }

                }
            }
            return result;
        }

        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="url">Url地址</param>
        /// <param name="method">方法(post或get)</param>
        /// <param name="method">数据类型</param>
        /// <param name="requestData">数据</param>
        public static string SendGetHttpRequest(string url, string contentType)
        {
            WebRequest request = (WebRequest)HttpWebRequest.Create(url);
            request.Method = "GET";
            request.ContentType = contentType;
            string result = string.Empty;
            using (WebResponse response = request.GetResponse())
            {
                if (response != null)
                {
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                        {
                            result = reader.ReadToEnd();
                        }
                    }
                }
            }
            return result;
        }
    }
}

图片 11

 

图片 12

using System;
using System.Xml.Linq;
using Newtonsoft.Json;

namespace Yank.WeiXin.Robot.Utility
{
    class XmlUtility
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="json"></param>
        /// <param name="rootName"></param>
        /// <returns></returns>
        public static XDocument ParseJson(string json,string rootName)
        {
            return JsonConvert.DeserializeXNode(json, rootName);
        }
    }
}

图片 13

 

5、事件管理

安装了菜单,那下须求处监护人件了。跟大家以前设计ASPX大概WinForm一样,都要绑定按键的事件。这里只是通过XML音信将呼吁传递过来。

由此“2、设置菜单"中具体的菜系内容,大家便已经理解要求进行什么事件管理了。对于按键类型为view的,无须管理,它会自行跳转至内定url.

内需管理的点击事件:

1)赞一下

2)查询某都会的气象,新加坡、法国首都、德雷斯顿

3)帮助

以此还要沿用上章中的事件管理器EventHandler来扩张管理。

切实的兑当代码吧:

图片 14

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Yank.WeiXin.Robot.Messages;

namespace Yank.WeiXin.Robot.Handlers
{
    class EventHandler : IHandler
    {
        /// <summary>
        /// 请求的xml
        /// </summary>
        private string RequestXml { get; set; }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="requestXml"></param>
        public EventHandler(string requestXml)
        {
            this.RequestXml = requestXml;
        }
        /// <summary>
        /// 处理请求
        /// </summary>
        /// <returns></returns>
        public string HandleRequest()
        {
            string response = string.Empty;
            EventMessage em = EventMessage.LoadFromXml(RequestXml);
            if (em != null)
            {
                switch (em.Event.ToLower())
                {
                    case ("subscribe"):
                        response = SubscribeEventHandler(em);
                        break;
                    case "click":
                        response = ClickEventHandler(em);
                        break;
                }
            }

            return response;
        }
        /// <summary>
        /// 关注
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        private string SubscribeEventHandler(EventMessage em)
        {
            //回复欢迎消息
            TextMessage tm = new TextMessage();
            tm.ToUserName = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime = Common.GetNowTime();
            tm.Content = "欢迎您关注***,我是大哥大,有事就问我,呵呵!nn";
            return tm.GenerateContent();
        }
        /// <summary>
        /// 处理点击事件
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        private string ClickEventHandler(EventMessage em)
        {
            string result = string.Empty;
            if (em != null && em.EventKey != null)
            {
                switch (em.EventKey.ToUpper())
                {
                    case "BTN_GOOD":
                        result = btnGoodClick(em);
                        break;
                    case "BTN_TQ_BEIJING":
                        result = searchWeather("beijing", em);
                        break;
                    case "BTN_TQ_SHANGHAI":
                        result = searchWeather("shanghai", em);
                        break;
                    case "BTN_TQ_WUHAN":
                        result = searchWeather("wuhai", em);
                        break;
                    case "BTN_HELP":
                        result = btnHelpClick(em);
                        break;
                }
            }

            return result;
        }
        /// <summary>
        /// 赞一下
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        private string btnGoodClick(EventMessage em)
        {
            //回复欢迎消息
            TextMessage tm = new TextMessage();
            tm.ToUserName = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime = Common.GetNowTime();
            tm.Content = @"谢谢您的支持!";
            return tm.GenerateContent();
        }
        /// <summary>
        /// 帮助
        /// </summary>
        /// <param name="em"></param>
        /// <returns></returns>
        private string btnHelpClick(EventMessage em)
        {
            //回复欢迎消息
            TextMessage tm = new TextMessage();
            tm.ToUserName = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime = Common.GetNowTime();
            tm.Content = @"查询天气,输入tq 城市名称拼音首字母";
            return tm.GenerateContent();
        }
        /// <summary>
        /// 查询天气
        /// </summary>
        /// <param name="cityName"></param>
        /// <param name="em"></param>
        /// <returns></returns>
        private string searchWeather(string cityName, EventMessage em)
        {
            TextMessage tm = new TextMessage();
            tm.Content = WeatherHelper.GetWeather(cityName);
            //进行发送者、接收者转换
            tm.ToUserName = em.FromUserName;
            tm.FromUserName = em.ToUserName;
            tm.CreateTime = Common.GetNowTime();
            return tm.GenerateContent();
        }
    }
}

图片 15

  

6、效果图

到底大工告成,最终来看下效果图吧

图片 16

 

注意:

作者滞留的风版权,如需转发,请标注出处。

 

2)查询某城市的气象,香水之都、香港(Hong Kong)、杜阿拉

2、成立自定菊花菜单

自定桐花菜单能够援助公众号加上分界面,让顾客更加好越来越快地驾驭民众号的作用。开启自定桐花菜单后,大伙儿号分界面如图所示:

图片 17

脚下自定鹅菜单最多包涵3个拔尖菜单,种种超级菜单最多包涵5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的一对将会以“...”取代。请留意,开创自定蓬蒿单后,由于微信客商端缓存,要求24钟头微信客商端才会展现出来。提出测验时方可尝尝撤消关心公众账号后再行关注,则能够见到成立后的效果。

眼前自定蒿子单接口可完毕两种类型按键,如下:

click:
用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event  的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
view:
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。

接口调用请求表明

http央求情势:POST(请使用https左券) 

恳请示例

 {
     "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"
            }]
       }]
 }

 

参数表明

参数 是否必须 说明
button 一级菜单数组,个数应为1~3个
sub_button 二级菜单数组,个数应为1~5个
type 菜单的响应动作类型,目前有click、view两种类型
name 菜单标题,不超过16个字节,子菜单不超过40个字节
key click类型必须 菜单KEY值,用于消息接口推送,不超过128字节
url view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节

回到结果

正确时的归来JSON数据包如下:

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

谬误时的归来JSON数据包如下(示例为无用菜单名长度):

{"errcode":40018,"errmsg":"invalid button name size"}

一、概述:

如果只有输入框,可能太轻巧,认为像命令行。自定同蒿单,给大家提供了不小的灵活性,更切合客户的操作习贯。在三个细微微信对话页面,可以兑现越来越多的功力。菜单直观明了,不仅可以提供事件响应,还匡助UKugaL跳转,假如急需的效果相比复杂,大家大能够利用U途锐L跳转,跳转至我们的网页就可以。

潜心:自定蒿子杆单,独有服务号才有此成效

怎么注册,见第一章:微信公众账号支付教程(一) 基本原理及微信公众账号注册

成效如下,

 

 

紧接着大家详细介绍,怎么样贯彻自定桐花菜单?

图片 18

4、删除菜单

行使接口创造自定义菜单后,开垦者还可利用接口删除当前利用的自定蒿子杆单。

恳请表达

http请求方式:GET
https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

归来阐明

对应创建接口,正确的Json返回结果:
{"errcode":0,"errmsg":"ok"}

1、首先取得access_token 

access_token是大伙儿号的全局独一票据,民众号调用各接口时都需采用access_token。符合规律处境下access_token保质期为7200秒,重复获取将促成上次到手的access_token失效。

大伙儿号能够应用AppID和AppSecret调用本接口来赢得access_token。AppID和AppSecret可在付出方式中猎取(须求已经济体改为开辟者,且帐号未有特别状态)。注意调用全部微信接口时均需利用https公约。

接口调用必要表明

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数表明

参数 是否必须 说明
grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,既appsecret

回到表达

好端端境况下,微信会再次回到下述JSON数据包给大伙儿号:

{"access_token":"ACCESS_TOKEN","expires_in":7200}
参数 说明
access_token 获取到的凭证
expires_in 凭证有效时间,单位:秒

不当时微信会重回错误码等消息,JSON数据包示譬如下(该示例为AppID无效错误):

{"errcode":40013,"errmsg":"invalid appid"} 

图片 19

5、事件管理

客商点击自定蒿菜单后,假设菜单按键设置为click类型,则微信会把这一次点击事件推送给开垦者,注意view类型(跳转到URubiconL)的美食指南点击不会反映。

推送XML数据包示例:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>

参数表明:

 

参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 消息类型,event
Event 事件类型,CLICK
EventKey 事件KEY值,与自定义菜单接口中KEY值对应

2、创造自定同蒿单

自定蒿菜单能够帮助民众号增添界面,让顾客更加好越来越快地掌握民众号的功力。开启自定蒿子单后,公众号分界面如图所示:

 

现阶段自定蓬蒿单最多包涵3个超级菜单,每个一流菜单最多带有5个二级菜单。顶尖菜单最多4个汉字,二级菜单最多7个汉字,多出去的部分将会以“...”代替。请留心,创制自定菊花菜单后,由于微信客商端缓存,须要24钟头微信客商端才会显现出来。建议测验时能够品味撤消关心公众账号后重新关怀,则能够看来创制后的效能。

此时此刻自定菊花菜单接口可实现两连串型按键,如下:

click:
用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event  的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
view:
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。

接口调用诉求表达

http须要形式:POST(请使用https合同) 

诉求示例

图片 20

 {
     "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"
            }]
       }]
 }

图片 21

 

参数表达

参数 是否必须 说明
button 一级菜单数组,个数应为1~3个
sub_button 二级菜单数组,个数应为1~5个
type 菜单的响应动作类型,目前有click、view两种类型
name 菜单标题,不超过16个字节,子菜单不超过40个字节
key click类型必须 菜单KEY值,用于消息接口推送,不超过128字节
url view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节

归来结果

不错开上下班时间的回来JSON数据包如下:

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

荒谬时的回来JSON数据包如下(示例为无效菜单名长度):

{"errcode":40018,"errmsg":"invalid button name size"}
{
 "button": [
  {
   "name": "链接", 
   "sub_button": [
    {
     "type": "view", 
     "name": "搜索", 
     "url": "http://www.baidu.com/"
    }, 
    {
     "type": "view", 
     "name": "视频", 
     "url": "http://v.qq.com/"
    }, 
    {
     "type": "click", 
     "name": "赞一下我们", 
     "key": "BTN_GOOD"
    }
   ]
  }, 
  {
   "name": "查询天气", 
   "sub_button": [
    {
     "type": "click", 
     "name": "武汉", 
     "key": "BTN_TQ_WUHAN"
    }, 
    {
     "type": "click", 
     "name": "上海", 
     "key": "BTN_TQ_SHANGHAI"
    }, 
    {
     "type": "click", 
     "name": "北京", 
     "key": "BTN_TQ_BEIJING"
    }
   ]
  }, 
  {
   "type": "click", 
   "name": "帮助", 
   "key": "BTN_HELP"
  }
 ]
}

一、概述:

只要独有输入框,恐怕太轻松,认为像命令行。自定蒿菜单,给大家提供了相当大的油滑,更合乎顾客的操作习惯。在三个纤维微信对话页面,能够达成越来越多的作用。菜单直观明了,不只可以提供事件响应,还辅助UTiguanL跳转,假设须求的效力比较复杂,大家大能够应用UQashqaiL跳转,跳转至大家的网页就能够。

瞩目:自定蒿子杆单,独有服务号才有此功用

怎么样注册,见第一章:微信徒人账号支付教程(一) 基本原理及微教徒人账号注册

功能如下,

 

图片 22

 

跟着我们详细介绍,怎么样促成自定蒿子单?

三、实例讲明

还跟着上一篇小说讲。微信公众账号支付教程(三) 实例入门:机器人(附源码)

笔者们将要上一篇小说基础上,加多自定同蒿单成效。

1)赞一下

二、详细步骤:

 

一、概述:

应大家刚强供给,将自定蒿菜单功能课程提前。

下一场还提供了友情链接,这里提供了view类型的菜系,直接可以跳转至UEvoqueL页面,为跳转做个好的身体力行。

1、首先获得access_token

亟待管理的点击事件:

选取接口创制自定桐花菜单后,开荒者还可利用接口删除当前接纳的自定蓬蒿单。

{"errcode":40018,"errmsg":"invalid button name size"}

二、详细步骤:

自定桐花菜单可以协理大伙儿号加上分界面,让顾客更加好越来越快地领会大伙儿号的效果与利益。开启自定蒿菜单后,大伙儿号分界面如图所示:

先是要求拿到AppId和AppSecret

当前自定蒿子杆单接口可达成两体系型开关,如下:

参数 是否必须 说明
grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,既appsecret

万众号能够行使AppID和AppSecret调用本接口来博取access_token。AppID和AppSecret可在付出形式中获得(须求已经济体改成开辟者,且帐号未有那么些动静)。注意调用全数微信接口时均需使用https协议。

此处我们提供应煤天气查询作用,将常用的城市列出来,点击就能够查询。

回来注脚

地点的代码,其实我们对有些集体职能做了包装。如举办get央求、POST提交等操作,读取文件等。

参数 说明
access_token 获取到的凭证
expires_in 凭证有效时间,单位:秒

view:

4)删除菜单。从微信服务器删除菜单,也能够去除后再成立。

参数 是否必须 说明
button 一级菜单数组,个数应为1~3个
sub_button 二级菜单数组,个数应为1~5个
type 菜单的响应动作类型,目前有click、view两种类型
name 菜单标题,不超过16个字节,子菜单不超过40个字节
key click类型必须 菜单KEY值,用于消息接口推送,不超过128字节
url view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节

推送XML数据包示例:

继之大家详细介绍,如何兑现自定菊花菜单?

{"access_token":"ACCESS_TOKEN","expires_in":7200}

本文由澳门威利斯人发布于网络资讯,转载请注明出处:含实例源码,详解自定义菜单

关键词: 澳门威利斯人 微信公众平台 微信 公众平台 自定