微信公共服务平台开发(.Net 的实现)6-------自定义菜单

用户自定义菜单制作时,需要用到access_token,我们直接使用前面讲解的IsExistAccess_Token()函数。我理解的微信公共平台里面菜单分为button和sub_button,即菜单和子菜单,这些菜单都有一个name的属性,类别分为click和view,click类有key属性;而view类有url属性,含有子菜单的菜单没有key属性也没有url属性。这些情况可以从下面的例子看出来。

[csharp] view plaincopy

  1. public void MyMenu()
  2. {
  3. string weixin1 = "";
  4. weixin1 = @" {
  5. ""button"":[
  6. {
  7. ""type"":""click"",
  8. ""name"":""你好!"",
  9. ""key"":""Hello""
  10. },
  11. {
  12. ""type"":""view"",
  13. ""name"":""公司简介"",
  14. ""url"":""http://www.4ugood.net""
  15. },
  16. {
  17. ""name"":""产品介绍"",
  18. ""sub_button"":[
  19. {
  20. ""type"":""click"",
  21. ""name"":""产品1"",
  22. ""key"":""P1""
  23. },
  24. {
  25. ""type"":""click"",
  26. ""name"":""产品2"",
  27. ""key"":""P2""
  28. }]
  29. }]
  30. }
  31. ";
  32. string access_token = IsExistAccess_Token();
  33. string i = GetPage("https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+access_token, weixin1);
  34. Response.Write(i);
  35. }

在你页面的 Page_Load 函数中调用这个MyMenu(),就可以显示出来了。
既然显示出来了,菜单的时间如何出发呢?我们已经了解到了如果类型为view的话,他有url属性,这个不需要处理,点击后会直接跳转到你设定的url的页面,下面我来看看如何触发click吧,按照微信的文档可以用(!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "CLICK")来判断,我把之前的代码改造一下,同时把在GetWxMessage()方法中把EventKey的值附上,wx.EventKey = xml.SelectSingleNode("xml").SelectSingleNode("EventKey").InnerText;

[csharp] view plaincopy

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. MyMenu();
  4. wxmessage wx = GetWxMessage();
  5. string res = "";
  6. if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "subscribe")
  7. {
  8. string content = "";
  9. content = "/:rose欢迎北京永杰友信科技有限公司/:rose\n直接回复“你好”";
  10. res = sendTextMessage(wx, content);
  11. }
  12. else if (!string.IsNullOrEmpty(wx.EventName) && wx.EventName.Trim() == "CLICK")
  13. {
  14. if(wx.EventKey=="Hello")
  15. res = sendTextMessage(wx, "你好,欢迎使用北京永杰友信科技有限公司公共微信平台!");
  16. if(wx.EventKey=="P1")
  17. res = sendTextMessage(wx, "你好,点击了产品1");
  18. if(wx.EventKey=="P2")
  19. res = sendTextMessage(wx, "你好,点击了产品2");
  20. }
  21. else
  22. {
  23. if (wx.MsgType == "text" && wx.Content == "你好")
  24. {
  25. res = sendTextMessage(wx, "你好,欢迎使用北京永杰友信科技有限公司公共微信平台!");
  26. }
  27. else if (wx.MsgType == "voice")
  28. {
  29. res = sendTextMessage(wx, wx.Recognition);
  30. }
  31. else
  32. {
  33. res = sendTextMessage(wx, "你好,未能识别消息!");
  34. }
  35. }
  36. Response.Write(res);
  37. }
  38. private wxmessage GetWxMessage()
  39. {
  40. wxmessage wx = new wxmessage();
  41. StreamReader str = new StreamReader(Request.InputStream, System.Text.Encoding.UTF8);
  42. XmlDocument xml = new XmlDocument();
  43. xml.Load(str);
  44. wx.ToUserName = xml.SelectSingleNode("xml").SelectSingleNode("ToUserName").InnerText;
  45. wx.FromUserName = xml.SelectSingleNode("xml").SelectSingleNode("FromUserName").InnerText;
  46. wx.MsgType = xml.SelectSingleNode("xml").SelectSingleNode("MsgType").InnerText;
  47. if (wx.MsgType.Trim() == "text")
  48. {
  49. wx.Content = xml.SelectSingleNode("xml").SelectSingleNode("Content").InnerText;
  50. }
  51. if (wx.MsgType.Trim() == "event")
  52. {
  53. wx.EventName = xml.SelectSingleNode("xml").SelectSingleNode("Event").InnerText;
  54. wx.EventKey = xml.SelectSingleNode("xml").SelectSingleNode("EventKey").InnerText;
  55. }
  56. if (wx.MsgType.Trim() == "voice")
  57. {
  58. wx.Recognition = xml.SelectSingleNode("xml").SelectSingleNode("Recognition").InnerText;
  59. }
  60. return wx;
  61. }
  62. /// <summary>
  63. /// 发送文字消息
  64. /// </summary>
  65. /// <param name="wx">获取的收发者信息</param>
  66. /// <param name="content">内容</param>
  67. /// <returns></returns>
  68. private string sendTextMessage(wxmessage wx, string content)
  69. {
  70. string res = string.Format(@"<xml>
  71. <ToUserName><![CDATA[{0}]]></ToUserName>
  72. <FromUserName><![CDATA[{1}]]></FromUserName>
  73. <CreateTime>{2}</CreateTime>
  74. <MsgType><![CDATA[text]]></MsgType>
  75. <Content><![CDATA[{3}]]></Content>
  76. </xml> ",
  77. wx.FromUserName, wx.ToUserName, DateTime.Now, content);
  78. return res;
  79. }

这样就可以相应你的菜单事件了,我上面的代码写的有很多可以优化的地方,这里主要以简介为主,以后我们会逐渐搭建起一个微信公共平台的.net框架,什么菜单类,消息类等等。

时间: 2024-10-14 19:47:35

微信公共服务平台开发(.Net 的实现)6-------自定义菜单的相关文章

微信公共服务平台开发(.Net的实现)1 认证“成为开发者”

http://www.cnblogs.com/freeliver54/p/3725979.html http://www.it165.net/pro/html/201402/9459.html 这些代码也就开始认证的时候用一次,以后就不用了: view sourceprint? 01.const string Token = "XXXXX";//你的token 02.protected void Page_Load(object sender, EventArgs e) 03.{ 04

微信公共服务平台开发(.Net 的实现)13-------网页授权(下 :C#代码的实现 )

接着上次的理论,我们这次来研究用代码实现“网页授权获取用户基本信息”,首先我们需要一个链接指向微信的授权页面,在微信开发平台中已经说了,这个链接必须在微信客户端中打开,那么我们就干脆使用文本消息来完成吧,也就是说当我们发送“授权”两个字的时候,微信给我们一个链接,我们点击这个链接然后进入“授权页面”.首先改造一下我们OnLoad函数: [csharp] view plaincopy if (wx.MsgType == "text" && wx.Content == &q

微信公共服务平台开发(.Net 的实现)9-------处理二维码

今天我们来共同学习一下微信公共服务平台中一个重要内容---二维码扫描.众所周知二维码目前应用范围很广,在这里不再叙述背景了,但是值得一提的是目前大家手机上面应用的二维码扫描工具是支持的都是QR码和PDF417码标准,这就是为什么你用各种扫码工具扫出来的都一样的原因,因为大家都使用了同样的标准. 在微信中的“扫一扫”功能也支持了这种标准,但是我们如果在微信公共服务平台中开发,使用的就不是这种标准了,而是微信自己的标准.也就是说如果你用通用软件生成的二维码“微信”,“我查查”等都可以扫描出来,但是你

微信公共服务平台开发(.Net 的实现)11-------客服消息(定项消息推送 重要的OPENID)

这次我们来一起研究一下“客服消息”,首先明确一下“客服消息”的概念.这不同于之前的“被动响应消息”,也就是说并不是之前“你一言我一语的即时响应”,可能在某种情况下你需要给不同的人主动发送消息,例如你的餐馆推出了新的川菜,那么你需要给喜欢川菜的人发送消息,而并不是等着被人发送“有什么新菜”后,然后反馈给客户,我推出了什么什么的. 说道这里可能有人会问,那不是群发吗?微信不是每天只能发一条吗?服务号每个月发一条吗?答案很明确微信说的是“客服消息”,也不是群发,它跟群发的区别就在于只要关注了我,那么我

微信公共服务平台开发(.Net 的实现)2-------获得ACCESSTOKEN

成为了开发者之后微信平台会给您appid和secret,在订阅号中是没有的,所以因该申请一下服务号 有了ACCESSTOKEN才能做添加菜单,上传/下载图片等功能 [csharp] view plaincopy private string GetToken() { // 也可以这样写: //return  GetPage("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的appid

微信公共服务平台开发(.Net 的实现)10-------地理位置

微信公共平台中涉及到地理位置的有两种情况:       第一.我发送一个自选的地理位置给微信,然后微信可以自动反馈响应的信息.       第二.让微信获取我们GPS定位地址位置,反馈响应的信息. 首先我们先来看第一种,在微信中除了可以发文本,图片,语音等还有一个信息就是地理位置,按照微信接受地理信息的XML信息,我们需要改造一下之前的wxmessage类加上几个属性: [csharp] view plaincopy class wxmessage { public string FromUse

微信公共服务平台开发(.Net 的实现)12-------网页授权(上 :更加深入理解OAuth2.0 )

我们首先来认识一下OAuth协议吧,这个东西很早就听说过,总觉得离我很远(我的项目用不到这些),但是最近不得不学习一下了.我在网上找了一些解释,认为解释的最好的是这样说的(出处:http://hi.baidu.com/powerthinks/item/f1cb9b3c7a88251c9dc65efa) 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店后,只需

微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题

因为access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token改造一下.另外需要说明的是access_token是变化的,有自己的周期,官方解释为:"有效期为7200秒",这就要 求我们把获得的access_token存入一个物理文件或者Application中,请求到过期后修改这些内容,需要用的时候读出来.有些人可能想到了,如果过期我就在获得一个就好了,不用物理文件和Application也可以达到同样的效果,但是需要注意了微信

微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应

微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应 参考文章:http://blog.csdn.net/lyq8479/article/details/9841371