zoukankan      html  css  js  c++  java
  • C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一)

    咨询 请加 QQ:点击这里给我发消息;QQ群:C#.NETWEB程序开发交流

    在微信里面,非认证的公众号账号,只能通过在微信回复菜单单击等事件获取openid,但是认证的公众账号(之前认证的订阅号是不可以的,现在新开放了政府媒体机构的认证订阅号)可以直接在微信打开的链接中获取用户的基本信息包括openid。这里用一种比较简单的获取用户信息的网页授权的方式。注意:这种方式只可以获取关注用户的信息,非关注用户是不可以获取的

    流程图

    一、获取Code 

     假设我们需要网页授权的页面的地址为redirect_uri

    需要获取Code的话我们第一步是跳转到授权地址,我们第一步便是获取拼接授权地址 --采用snsapi_base方式

         /// <summary>
            /// 对页面是否要用授权 用snsapi_base方式 获取Code Appid是微信应用id
            /// </summary>
            /// <returns></returns>
            public string GetCodeUrl(string Appid, string redirect_uri)
            {
                return string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect", Appid, redirect_uri);
            }

    当在微信中打开如下地址的时候如果授权成功,会自动跳转到页面redirect_uri?code=CODE&state=STATE,这样我们就可以获取到Code了

    二、用Code换取Openid

    用get方法获取到json格式的数据,

    {
       "access_token":"ACCESS_TOKEN",
       "expires_in":7200,
       "refresh_token":"REFRESH_TOKEN",
       "openid":"OPENID",
       "scope":"SCOPE",
       "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
    }
    然后获取openid
         /// <summary>
            /// 用Code换取Openid
            /// </summary>
            /// <param name="Code"></param>
            /// <returns></returns>
            public string CodeGetOpenid(string Code) {
                string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", Appid, Appsecret, Code);
                string ReText = WebRequestPostOrGet(url,"");//post/get方法获取信息 
                Dictionary<string, object> DicText = (Dictionary<string, object>)Jss.DeserializeObject(ReText);
                if (!DicText.ContainsKey("openid"))
                    return "";
                return DicText["openid"].ToString();
            }

    三、用openid获取用户基本信息

    其中access_token 是微信凭证如何获取参照之前的博客http://www.cnblogs.com/net-xiejun/p/4422890.html

            /// <summary>
            /// 用openid换取用户信息
            /// </summary>
            /// <param name="openid">微信标识id</param>
            /// <returns></returns>
            public Dictionary<string, object> GetUserInfo(string openid)
            {
    JavaScriptSerializer Jss = new JavaScriptSerializer();
    string access_token = ApiCommon.getTokenSession(Appid,Appsecret);//获取access_token string url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN", access_token, openid); Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(WebRequestPostOrGet(url, "")); return respDic; }

    在页面对应的cs文件中的代码:

            OAuth2 OAuth2 = new OAuth2();
            public ActionResult ApplicantActivety()
            {
                if (!string.IsNullOrEmpty(Request.QueryString["code"]))
                {
                    Dictionary<string, object> DicJson = OAuth2.GetUserInfo(GetOpenidSession(Request.QueryString["code"].ToString()));
                    ViewData["nickname"] = DicJson["nickname"];
                    ViewData["headimgurl"] = DicJson["headimgurl"];
                }
                else {
                    string redirect_uri = "Http://"+Request.Url.Authority + Request.Url.PathAndQuery;
                    Response.Redirect(OAuth2.GetCodeUrl(redirect_uri));
                }
                return View();
            }
            //拉取缓存
            private string GetOpenidSession(string Code)
            {
                if (Session["OpenidSession"] != null)
                {
                    OAuth2.OpenidSession = Session["OpenidSession"].ToString();
                }
                else
                {
                    OAuth2.OpenidSession = OAuth2.CodeGetOpenid(Code);
                    Session["OpenidSession"] = OAuth2.OpenidSession;
                    Session.Timeout = 7200;
                }
                return OAuth2.OpenidSession;
            }

    到此微信网页授权就开发完成了!

     如有疑问咨询QQ:点击这里给我发消息

    本文版权归作者(谢俊)和博客园所有,欢迎转载,转载请标明出处。

    原文地址:http://www.cnblogs.com/net-xiejun/

    微信开发群C#.NETWEB程序开发交流

    完整源码下载:https://github.com/xiejun-net/weixin

    个人公众账号:

  • 相关阅读:
    python class 的属性
    程序员7年和我的7点感想――我的程序人生
    LCD 调试总结 [转]
    shell sed 替换某行内容
    msm 模拟i2c使用过程分析
    高通平台USB host协议分析 之 一
    Linux文件查找命令find,xargs详述
    (翻译)Android属性系统
    内存对齐.结构体对齐
    python class 用法
  • 原文地址:https://www.cnblogs.com/net-xiejun/p/4519118.html
Copyright © 2011-2022 走看看