[.Net] C#开发微信门户及应用之微信菜单的多种表现方式介绍
URL:http://www.it165.net/pro/html/201405/13997.html
在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一印象,我们要规划好这些菜单的内容,布局等信 息。根据微信菜单的定义,我们可以看到,一般菜单主要分为两种,一种是普通的Url菜单(类型为View的菜单),一种是事件菜单(类型为Click的菜 单),一般情况下,微信的Url菜单,是无法获得用户的任何信息的,但微信用户信息非常重要,因此也提供了另外一种方式(类似重定向的方式)来给我们使 用,本篇主要介绍这种重新定向的方式菜单的使用,以使我们能够尽可能和用户进行交互。
1、微信自定义菜单的分类
微信对自定义菜单的要求:目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
根据菜单的分类,我们可以把它通过图形进行分类展示:

我对各种微信公众号进行了解,发现多数账号采用的都是普通的View类型的菜单链接方式,通过它们链接到自己的微网站上,但也有一些做的好的,如省 立中山图书馆,就能通过重定向的方式,提供一个绑定图书馆用户和微信OpenID的入口,绑定后,用户就可以查看借阅的书籍,然后可以通过一键续借功能实 现图书的快速续借功能。
对于这种重定向类型的Url菜单事件,微信的说明如下:
如果用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者可以通过此接口获取当前用户基本信息(包括昵称、性别、城市、国家)。利用用户信息,可以实现体验优化、用户来源统计、帐号绑定、用户身份鉴权等功能。请 注意,“获取用户基本信息接口是在用户和公众号产生消息交互时,才能根据用户OpenID获取用户基本信息,而网页授权的方式获取用户基本信息,则无需消 息交互,只是用户进入到公众号的网页,就可弹出请求用户授权的界面,用户授权后,就可获得其基本信息(此过程甚至不需要用户已经关注公众号。)”

2、重定向类型菜单的URL
上面说了,重定向类型的菜单分为了两种,其实他们也仅仅是参数Scope类型的不同,其他部分也还是一样的。
为了展示,我们在假设用户单击菜单的时候,切换到http://www.iqidi.com/testwx.ashx这个页面,并带过来当前用户的OpenID等参数信息
对于scope=snsapi_base方式的链接如下:
https://open.weixin.qq.com/connect/oauth4/authorize?appid=wx3d81fc2886d86526&redirect_uri=http%3A%2F%2Fwww.iqidi.com%2Ftestwx.ashx&response_type=code&scope=snsapi_base&state=123#wechat_redirect
而对于scope=snsapi_userinfo方式的链接如下:
https://open.weixin.qq.com/connect/oauth4/authorize?appid=wx3d81fc2886d86526&redirect_uri=http%3A%2F%2Fwww.iqidi.com%2Ftestwx.ashx&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
不过他们给手机客户端的体验是不同的,第一种可以平滑切换,但是第二种会弹出一个对话框供用户确认才能继续。

为了演示上面两种获取数据的不同,我把他们传过来的code的值,用户换取OpenID后进行用户信息的解析,他们两者的结果都是一样了。具体测试界面如下所示。

其中TestWX.ashx的页面后台代码如下所示:
01./// <summary>02./// TestWX 的摘要说明03./// </summary>04.public class TestWX : IHttpHandler05.{06.string appId = ''; //换成你的信息07.string appSecret = ''; //换成你的信息08. 09.public void ProcessRequest(HttpContext context)10.{11.context.Response.ContentType = 'text/plain';12.string content = '';13. 14.if (context.Request != null && context.Request.Url != null)15.{16.NameValueCollection list = HttpUtility.ParseQueryString(context.Request.Url.Query);17.foreach (string key in list.AllKeys)18.{19.content += string.Format('{0}:{1} 20.', key, list[key]);21.}22.}23. 24.string code = context.Request.QueryString['code'] ?? '';25.if (!string.IsNullOrEmpty(code))26.{27.IBasicApi api = new BasicApi();28.try29.{30.AppConfig config = new AppConfig();31.appId = config.AppConfigGet('AppId');//从配置中获取微信程序ID32.appSecret = config.AppConfigGet('AppSecret');//从配置中获取微信程序秘钥33. 34.AccessTokenResult result = api.GetAccessToken(appId, appSecret, code);35.if (result != null)36.{37.content += string.Format('openid:{0}38.', result.openid);39. 40.string token = api.GetAccessToken(appId, appSecret);41.IUserApi userApi = new UserApi();42.UserJson userDetail = userApi.GetUserDetail(token, result.openid);43.if (userDetail != null)44.{45.content += string.Format('nickname:{0} sex:{1}46.', userDetail.nickname, userDetail.sex);47.content += string.Format('Location:{0} {1} {2} {3}48.', userDetail.country, userDetail.province, userDetail.city, userDetail.language);49.content += string.Format('HeadUrl:{0} 50.', userDetail.headimgurl);51.content += string.Format('subscribe:{0},{1}52.', (userDetail.subscribe == 1) ? '已订阅' : '未订阅', userDetail.subscribe_time.GetDateTime());53.}54.}55.}56.catch { }57.}58. 59.context.Response.Write(content);60.}在上面的代码中,我主要分为几步,一个是打印当前用户重定向过来的链接的参数信息,代码如下。
1.NameValueCollection list = HttpUtility.ParseQueryString(context.Request.Url.Query);2.foreach (string key in list.AllKeys)3.{4.content += string.Format('{0}:{1} 5.', key, list[key]);6.}然后获取到Code参数后,通过API接口,获取AccessTokenResult的数据,这里面有用户的OpenID
1.AccessTokenResult result = api.GetAccessToken(appId, appSecret, code);当正常调用后,我们把用户标识的OpenID进一步进行解析,调用API获取用户的详细信息,具体代码如下所示。
1.UserJson userDetail = userApi.GetUserDetail(token, result.openid);当我们把用户的相关信息获取到了,就可以做各种用户信息的展示了,如下代码所示。
01.if (userDetail != null)02.{03.content += string.Format('nickname:{0} sex:{1}04.', userDetail.nickname, userDetail.sex);05.content += string.Format('Location:{0} {1} {2} {3}06.', userDetail.country, userDetail.province, userDetail.city, userDetail.language);07.content += string.Format('HeadUrl:{0} 08.', userDetail.headimgurl);09.content += string.Format('subscribe:{0},{1}10.', (userDetail.subscribe == 1) ? '已订阅' : '未订阅', userDetail.subscribe_time.GetDateTime());11.}3、重定向链接菜单的用途
这种菜单就是需要指定域名,在微信后台中进行设置,重定向的链接必须属于这个域名之中,否则不会转到你希望的链接。
这个方式,让我们的微信应用程序后台可以获得用户的标识、用户详细信息等,我们就可以用来绑定和用户相关的业务信息了,如上面提到的图书馆借阅信 息,送水客户的信息,客户的积分信息,或者可以和后台账号进行关联实现更加复杂的应用等。用户的身份信息如此重要,如果结合到我们的CRM系统、业务管理 系统,就可以发挥用户信息应用的作用了。
以上就是我对这个类型菜单链接的应用了解,具体还需要进一步深化其应用,希望和大家共同探讨这方面的应用场景。
[.Net] C#开发微信门户及应用之微信菜单的多种表现方式介绍的更多相关文章
- C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍
在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一印象,我们要规划好这些菜单的内容,布局等信息.根据微信菜单的定义,我们可以看到,一般菜单主要分为两种,一 ...
- C#开发微信门户及应用(25)-微信企业号的客户端管理功能
我们知道,微信公众号和企业号都提供了一个官方的Web后台,方便我们对微信账号的配置,以及相关数据的管理功能,对于微信企业号来说,有通讯录中的组织架构管理.标签管理.人员管理.以及消息的发送等功能,其中 ...
- C#开发微信门户及应用(38)--微信摇一摇红包功能
摇一摇周边红包接口是为线下商户提供的发红包功能.用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包.我曾经在<C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实 ...
- C#开发微信门户及应用(37)--微信公众号标签管理功能
微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...
- C#开发微信门户及应用(36)--微信卡劵管理的封装操作
前面几篇介绍了微信支付方面的内容,本篇继续微信接口的一些其他方面的内容:卡劵管理.卡劵管理是微信接口里面非常复杂的一个部分,里面的接口非常多,我花了不少时间对它进行了封装处理,重构优化等等工作,卡劵在 ...
- C#开发微信门户及应用(35)--微信支付之企业付款封装操作
在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...
- C#开发微信门户及应用(34)--微信裂变红包
在上篇随笔<C#开发微信门户及应用(33)--微信现金红包的封装及使用>介绍了普通现金红包的封装和使用,这种红包只能单独一次发给一个人,用户获取了红包就完成了,如果我们让用户收到红包后,可 ...
- C#开发微信门户及应用(33)--微信现金红包的封装及使用
我在上篇随笔<C#开发微信门户及应用(32)--微信支付接入和API封装使用>介绍为微信支付的API封装及使用,其中介绍了如何配置好支付环境,并对扫码支付的两种方式如何在C#开发中使用进行 ...
- C#开发微信门户及应用(32)--微信支付接入和API封装使用
在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...
随机推荐
- chm文件打开无显示解决办法
右键单击chm文件---属性---在该页面选择“解除锁定”---ok!
- ajax 三级联动写法
主页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- mui图片懒加载
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- ssl_protocols和ssl_ciphers应该怎么配置
http://wiki.nginx.org/HttpSslModule#ssl_ciphers 推荐配置: A) 在Apache 的 SSL 配置中禁用 SSLv3 和 SSLv3SSLProtoco ...
- 模拟人的手指在UI上滑动时3D模型跟随着移动(Unity)
问题: 怎么让当手指滑动的同时对应的模型发生旋转 解决办法: 1:通过控制摄像机或者模型来实现效果 2:通过获取鼠标移动时X轴Y轴的偏移量来确定模型的旋转角度 3:为了不让人感觉到突兀,建议使用Mat ...
- BZOJ 3631: [JLOI2014]松鼠的新家 树上差分 + LCA
Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
- emmmmmm(官宣?)
实验室永远不会是学习的唯一地点,不是吗? 总后悔当初退竞赛,现在却还是选择退出,大概是自己真的不适合吧...
- java链接linux服务器,命令操作
1.本地读取linux文件,即在Windows上链接外部linux package com.common.utils; import java.io.BufferedReader; import ja ...
- Django-Python3-Celery 异步任务/定时任务
1. 目录结构 2. setting设置: 3. project/project/celery.py 4. project/project/__init.py 5.任务分配 6. 代码实现 View ...
- workspace 配置
1.新建workspace 在配置好相关信息前,请勿引入工程代码,避免环境不完整的情况下编译进入长时间等待 2.设置工作窗体结构 建议使用Java模式开发窗体设置 3. 编码 工程全部采用UTF-8编 ...