在前面一系列文章中,咱们能够看到微信自定义菜单的重要性,能够说微信公众号帐号中,菜单是用户的第一印象,咱们要规划好这些菜单的内容,布局等信息。根据微信菜单的定义,咱们能够看到,通常菜单主要分为两种,一种是普通的Url菜单(类型为View的菜单),一种是事件菜单(类型为Click的菜单),通常状况下,微信的Url菜单,是没法得到用户的任何信息的,但微信用户信息很是重要,所以也提供了另一种方式(相似重定向的方式)来给咱们使用,本篇主要介绍这种从新定向的方式菜单的使用,以使咱们可以尽量和用户进行交互。html
微信对自定义菜单的要求:目前自定义菜单最多包括3个一级菜单,每一个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。api
根据菜单的分类,咱们能够把它经过图形进行分类展现:服务器
我对各类微信公众号进行了解,发现多数帐号采用的都是普通的View类型的菜单连接方式,经过它们连接到本身的微网站上,但也有一些作的好的,如省立中山图书馆,就能经过重定向的方式,提供一个绑定图书馆用户和微信OpenID的入口,绑定后,用户就能够查看借阅的书籍,而后能够经过一键续借功能实现图书的快速续借功能。微信
对于这种重定向类型的Url菜单事件,微信的说明以下:app
若是用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者能够经过此接口获取当前用户基本信息(包括昵称、性别、城市、国家)。利用用户信息,能够实现体验优化、用户来源统计、账号绑定、用户身份鉴权等功能。请注意,“获取用户基本信息接口是在用户和公众号产生消息交互时,才能根据用户OpenID获取用户基本信息,而网页受权的方式获取用户基本信息,则无需消息交互,只是用户进入到公众号的网页,就可弹出请求用户受权的界面,用户受权后,就可得到其基本信息(此过程甚至不须要用户已经关注公众号。)”布局
上面说了,重定向类型的菜单分为了两种,其实他们也仅仅是参数Scope类型的不一样,其余部分也仍是同样的。post
为了展现,咱们在假设用户单击菜单的时候,切换到http://www.iqidi.com/testwx.ashx这个页面,并带过来当前用户的OpenID等参数信息测试
对于scope=snsapi_base方式的连接以下:优化
https://open.weixin.qq.com/connect/oauth2/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/oauth2/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的页面后台代码以下所示:
/// <summary> /// TestWX 的摘要说明 /// </summary> public class TestWX : IHttpHandler { string appId = ""; //换成你的信息 string appSecret = ""; //换成你的信息 public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string content = ""; if (context.Request != null && context.Request.Url != null) { NameValueCollection list = HttpUtility.ParseQueryString(context.Request.Url.Query); foreach (string key in list.AllKeys) { content += string.Format("{0}:{1} \r\n", key, list[key]); } } string code = context.Request.QueryString["code"] ?? ""; if (!string.IsNullOrEmpty(code)) { IBasicApi api = new BasicApi(); try { AppConfig config = new AppConfig(); appId = config.AppConfigGet("AppId");//从配置中获取微信程序ID appSecret = config.AppConfigGet("AppSecret");//从配置中获取微信程序秘钥 AccessTokenResult result = api.GetAccessToken(appId, appSecret, code); if (result != null) { content += string.Format("openid:{0}\r\n", result.openid); string token = api.GetAccessToken(appId, appSecret); IUserApi userApi = new UserApi(); UserJson userDetail = userApi.GetUserDetail(token, result.openid); if (userDetail != null) { content += string.Format("nickname:{0} sex:{1}\r\n", userDetail.nickname, userDetail.sex); content += string.Format("Location:{0} {1} {2} {3}\r\n", userDetail.country, userDetail.province, userDetail.city, userDetail.language); content += string.Format("HeadUrl:{0} \r\n", userDetail.headimgurl); content += string.Format("subscribe:{0},{1}\r\n", (userDetail.subscribe == 1) ? "已订阅" : "未订阅", userDetail.subscribe_time.GetDateTime()); } } } catch { } } context.Response.Write(content); }
在上面的代码中,我主要分为几步,一个是打印当前用户重定向过来的连接的参数信息,代码以下。
NameValueCollection list = HttpUtility.ParseQueryString(context.Request.Url.Query); foreach (string key in list.AllKeys) { content += string.Format("{0}:{1} \r\n", key, list[key]); }
而后获取到Code参数后,经过API接口,获取AccessTokenResult的数据,这里面有用户的OpenID
AccessTokenResult result = api.GetAccessToken(appId, appSecret, code);
当正常调用后,咱们把用户标识的OpenID进一步进行解析,调用API获取用户的详细信息,具体代码以下所示。
UserJson userDetail = userApi.GetUserDetail(token, result.openid);
当咱们把用户的相关信息获取到了,就能够作各类用户信息的展现了,以下代码所示。
if (userDetail != null) { content += string.Format("nickname:{0} sex:{1}\r\n", userDetail.nickname, userDetail.sex); content += string.Format("Location:{0} {1} {2} {3}\r\n", userDetail.country, userDetail.province, userDetail.city, userDetail.language); content += string.Format("HeadUrl:{0} \r\n", userDetail.headimgurl); content += string.Format("subscribe:{0},{1}\r\n", (userDetail.subscribe == 1) ? "已订阅" : "未订阅", userDetail.subscribe_time.GetDateTime()); }
这种菜单就是须要指定域名,在微信后台中进行设置,重定向的连接必须属于这个域名之中,不然不会转到你但愿的连接。
这个方式,让咱们的微信应用程序后台能够得到用户的标识、用户详细信息等,咱们就能够用来绑定和用户相关的业务信息了,如上面提到的图书馆借阅信息,送水客户的信息,客户的积分信息,或者能够和后台帐号进行关联实现更加复杂的应用等。用户的身份信息如此重要,若是结合到咱们的CRM系统、业务管理系统,就能够发挥用户信息应用的做用了。
以上就是我对这个类型菜单连接的应用了解,具体还须要进一步深化其应用,但愿和你们共同探讨这方面的应用场景。
若是对这个《C#开发微信门户及应用》系列感兴趣,能够关注个人其余文章,系列随笔以下所示:
C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试
C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)
C#开发微信门户及应用(18)-微信企业号的通信录管理开发之成员管理
C#开发微信门户及应用(17)-微信企业号的通信录管理开发之部门管理
C#开发微信门户及应用(15)-微信菜单增长扫一扫、发图片、发地理位置功能
C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据
C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍
C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息