通俗来讲VIEW其实就是我们在C#中常用的a标签,可以直接在自定义菜单URL的属性里面写上需要跳转的链接,也即为单纯的跳转。

但更多的情况下,我们是想通过VIEW来进入指定的页面并进行操作。

举一个简单的例子,假如我们的后台需要记录有哪些用户在什么时间访问了哪个网页,那么这就需要当用户点击VIEW的时候我们程序记录

所以微信官方提供了一个很好的解决方案,那就是将VIEW与网页授权获取用户信息相结合来实现

我们以建好的自定义菜单中的"搜索"VIEW为例,来简单的时候上面的操作。

首先将自定义菜单重新URL重新重新写入网页授权的链接,以及新建一个网页授权的页面OAuthRedirectUrl.aspx。

{"button":[{    "type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC"},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER"},{"name":"菜单","sub_button":[{    "type":"view","name":"搜索","url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的微信公众号appid&redirect_uri=http://xxx.com/WeiXin/OAuthRedirectUrl.aspx?reurl=so&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"},{"type":"view","name":"视频","url":"http://v.qq.com/"},{"type":"click","name":"赞一下我们","key":"V1001_GOOD"}]}]}

来看一下微信官方对这一串URL的参数解释:

参数 是否必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址,请使用urlencode对链接进行处理
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

其中参数redirect_uri也就是上面提到新建的页面OAuthRedirectUrl.aspx,也就是说在跳转到想要的页面之前,先要到OAuthRedirectUrl.aspx去进行授权并获取用户基本信息,从而供自己使用。

OAuthRedirectUrl.aspx要做的操作其实也是很简单,完成微信指定的授权。

private string _appid = "你的微信公众号appid";private string _appsecret = "你的微信公众号appsecret";private string reurl = "";protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){//获取传过来的值if (Request.QueryString["reurl"] != null && Request.QueryString["reurl"].ToString() != ""){reurl = Request.QueryString["reurl"].ToString();}string code = "";if (Request.QueryString["code"] != null && Request.QueryString["code"] != ""){code = Request.QueryString["code"].ToString();OAuth_Token Model = Get_token(code);OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);//"http://xx.com/" + reurl + ".aspx?openid=" + OAuthUser_Model.openid;string strurl = "";switch (reurl){case "so":strurl = "http://www.cnblogs.com/HappyAnt/";break;}Response.Redirect(strurl);//Response.Write("reurl:" + reurl + ",code:" + code + ",openid:" + OAuthUser_Model.openid);
                }}}//获得Tokenprotected OAuth_Token Get_token(string Code){string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + _appid + "&secret=" + _appsecret + "&code=" + Code + "&grant_type=authorization_code");OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);return Oauth_Token_Model;}//刷新Tokenprotected OAuth_Token refresh_token(string REFRESH_TOKEN){string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + _appid + "&grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN);OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);return Oauth_Token_Model;}//获得用户信息protected OAuthUser Get_UserInfo(string REFRESH_TOKEN, string OPENID){// Response.Write("获得用户信息REFRESH_TOKEN:" + REFRESH_TOKEN + "||OPENID:" + OPENID);string Str = GetJson("https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID);OAuthUser OAuthUser_Model = JsonHelper.ParseFromJson<OAuthUser>(Str);return OAuthUser_Model;}protected string GetJson(string url){WebClient wc = new WebClient();wc.Credentials = CredentialCache.DefaultCredentials;wc.Encoding = Encoding.UTF8;string returnText = wc.DownloadString(url);if (returnText.Contains("errcode")){//可能发生错误
            }//Response.Write(returnText);return returnText;}}public class OAuth_Token{public OAuth_Token(){////TODO: 在此处添加构造函数逻辑//
        }//access_token    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同//expires_in    access_token接口调用凭证超时时间,单位(秒)//refresh_token    用户刷新access_token//openid    用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID//scope    用户授权的作用域,使用逗号(,)分隔public string access_token { get; set; }public string expires_in { get; set; }public string refresh_token { get; set; }public string openid { get; set; }public string scope { get; set; }}public class OAuthUser{public OAuthUser(){ }#region 数据库字段private string _openID;private string _searchText;private string _nickname;private string _sex;private string _province;private string _city;private string _country;private string _headimgUrl;private string _privilege;#endregion#region 字段属性/// <summary>/// 用户的唯一标识/// </summary>public string openid{set { _openID = value; }get { return _openID; }}/// <summary>/// /// </summary>public string SearchText{set { _searchText = value; }get { return _searchText; }}/// <summary>/// 用户昵称 /// </summary>public string nickname{set { _nickname = value; }get { return _nickname; }}/// <summary>/// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 /// </summary>public string sex{set { _sex = value; }get { return _sex; }}/// <summary>/// 用户个人资料填写的省份/// </summary>public string province{set { _province = value; }get { return _province; }}/// <summary>/// 普通用户个人资料填写的城市 /// </summary>public string city{set { _city = value; }get { return _city; }}/// <summary>/// 国家,如中国为CN /// </summary>public string country{set { _country = value; }get { return _country; }}/// <summary>/// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空/// </summary>public string headimgurl{set { _headimgUrl = value; }get { return _headimgUrl; }}/// <summary>/// 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)其实这个格式称不上JSON,只是个单纯数组/// </summary>public string privilege{set { _privilege = value; }get { return _privilege; }}#endregion}

要点:

1:页面上面必须要有接受code的代码,因为code要换取一个特殊的网页授权access_token

2:C#微信公众号开发 -- (四)获取API调用所需的全局唯一票据access_token 与这次的网页授权access_token不是一个值,也不是一个概念。

3:在页面中需要生成OAuth_Token,OAuthUser两个类,与微信提供的字段要完全吻合(更好的方式是让这两个类进行封装)

4:strurl中还可以写上带参数的链接,想获取的客户信息只需要在OAuthUser_Model读取就好了

5:一般的程序开发还暂时用不到“刷新Token”的方法,反正我现在是一直没用到,这里作为了解就好了

6:如果你这些都配置好后,页面却显示 ”redirect_uri 参数错误” ,那么请注意读微信的开发说明 

“在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名”

以及检查你的URL链接里面参数有没有错误,参数顺序有没有错误。

做完这些工作以后,就可以真正意义上的实现跳转了,也即实现了VIEW它本身应有的价值。

转载于:https://www.cnblogs.com/HappyAnt/p/5277353.html

C#微信公众号开发 -- (七)自定义菜单事件之VIEW及网页(OAuth2.0)授权相关推荐

  1. 微信公众号开发:自定义菜单

    前言: 回顾之前的微信公众号配置和消息处理的内容,我们已经掌握了如何配置服务器与微信公众号建立连接,也掌握了通过消息管理的方式,对用户的信息进行处理,完成公众号消息回复功能,实现公众号与用户之间的完整 ...

  2. 微信公众平台开发,自定义菜单,群发消息,网页授权(3)

    前两节说的都是微信开发的初级篇,这一节说高级篇.微信公众号关注以后,下面都是有菜单的,底部有三个一级菜单,每个一级菜单可以添加5个二级菜单.一级菜单最多四个汉字,二级菜单最多7个汉字,多出来的汉字用& ...

  3. php 自定义菜单 openid,微信公众平台开发(99) 自定义菜单获取OpenID

    关键字 微信公众平台 自定义菜单 OpenID 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html 在这篇 ...

  4. 微信公众号编辑底部自定义菜单解决方案

    微信公众号编辑底部自定义菜单解决方案 1.需求背景 最近开发公众号项目,关于公众号里面底部的菜单栏设置一般常用有两种方法. 1,是进入公众号后台,找到自定义菜单,点击后进入编辑页面,进行编辑即可. 2 ...

  5. 微信公众平台开发(104) 自定义菜单扫一扫、发图片、发地理位置

    关键字:微信公众平台 自定义菜单 扫一扫 发图片 发地理位置 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-menu-new-type.htm ...

  6. c# 微信公众号开发之自定义菜单栏

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

  7. 微信公众平台开发教程--自定义菜单

    微信公众平台开发教程(五)自定义菜单 请尊重作者版权,如需转载,请标明出处. 应大家强烈要求,将自定义菜单功能课程提前. 一.概述: 如果只有输入框,可能太简单,感觉像命令行.自定义菜单,给我们提供了 ...

  8. 微信公众号之创建自定义菜单

    微信公众号菜单等功能如何开通 自定义菜单最大的优点是减少了用户的认知门槛,可以将公众账号里的重点信息入口直观的暴露给用户.当用户进入到公众账号时,可以一目了然的了解相关的服务,只需要点击,不需要再通过 ...

  9. php微信级联菜单,php微信公众号开发之二级菜单

    本文实例为大家分享了php微信公众号二级菜单的具体代码,供大家参考,具体内容如下 核心代码: $postObj = simplexml_load_string($postStr, 'SimpleXML ...

最新文章

  1. python 去除list 里面的重复元素
  2. neo4j安装_Neo4J和Enterprise Java的撤消功能
  3. MPICH3环境配置
  4. 个人认为不错的句子(part1)--机器学习是统计减去任何对模型和假设的检验
  5. RxJava 设计理念 观察者模式 Observable lambdas MD
  6. node 版本升级_Node-RED: 自动化事件触发工具的安装与介绍
  7. python分支语句_Python中分支语句与循环语句实例详解
  8. sql怎样删除重复值
  9. spring加载xml配置文件
  10. [SAP ABAP开发技术总结]OLE
  11. java环境变量大小写_java环境变量配置
  12. Android Studio for Experts(Android Dev Summit2015)
  13. UNIX环境高级编程(第2版)
  14. 加密软件漏洞测试,加密软件漏洞评测系统
  15. Ubuntu20.04 虚拟机 联网
  16. 复化科特斯公式matlab_牛顿
  17. niosii spi 外部_NIOS2随笔——SD卡之SPI操作
  18. 一个小工具就能帮我清理 30GB 微信文件,也太好用了!
  19. Kaiming He 何恺明
  20. Linux虚拟机连接外网

热门文章

  1. freeswitch 把SIP注册信息数据库从SQLITE 改为MYSQL的方法
  2. java集合类详细概述
  3. Ext.tab.Panel页签
  4. Visual Studio DSL 入门 9---创建状态机的图形符号
  5. 【Gamma】Scrum Meeting 9
  6. SpringCloud微服务架构之,Hystrix 熔断器,Gateway 网关
  7. SpringBoot不支持webapp的解决办法
  8. 你完全没了解过的日志异步落库
  9. 个人总结------高级知识点必会
  10. Python开发【第一篇】:目录