.net core 实现QQ登陆网站

 1    public const string appId = "";//QQ的APPID
 2         public const string appSecret = "";//QQ的appSecret
 3         public const string redirecturl = "";//回调地址
 4 
 5 #region QQ登陆
 6         /// <summary>
 7         /// 打开qq授权页面
 8         /// </summary>
 9         /// <returns></returns>
10         public virtual IActionResult QqAuthorize()
11         {
12           var url=string.Format(
13                    "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id={0}&redirect_uri={1}&state=State",
14                    appId, WebUtility.UrlEncode(redirecturl));
15             return new RedirectResult(url);
16         }
17         /// <summary>
18         /// QQ回掉方法
19         /// </summary>
20         /// <returns></returns>
21         public virtual IActionResult QQLogin()
22         {
23             var code = Request.Query["code"];
24             var token = GetAuthorityAccessToken(code);
25             var dis = GetAuthorityOpendIdAndUnionId(token);
26             var userInfo = GetUserInfo(token, dis["openid"]);
27             return null;
28         }
29 
30 
31         public virtual string GetAuthorityAccessToken(string code)
32         {
33             if (string.IsNullOrEmpty(code))
34                 return null;
35             var url =
36                 string.Format(
37                     "https://graph.qq.com/oauth2.0/token?client_id={0}&client_secret={1}&code={2}&grant_type=authorization_code&redirect_uri={3}",
38                     appId, appSecret, code, redirecturl);
39             HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
40             var json =WebRequestHelper.GetResponse(request, "utf-8");
41             if (string.IsNullOrEmpty(json))
42                 return null;
43             if (!json.Contains("access_token"))
44             {
45                 return null;
46             }
47             var dis = json.Split('&').Where(it => it.Contains("access_token")).FirstOrDefault();
48             var accessToken = dis.Split('=')[1];
49             return accessToken;
50         }
51         /// <summary>
52         /// 获取OpenId和UnionId
53         /// </summary>
54         /// <param name="token"></param>
55         /// <returns></returns>
56         public virtual Dictionary<string, string> GetAuthorityOpendIdAndUnionId(string token)
57         {
58             if (string.IsNullOrEmpty(token)) return null;
59             var url = $"https://graph.qq.com/oauth2.0/me?access_token={token}&unionid=1";
60             HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
61             request.Method = "GET";
62             request.ContentType = "application/x-www-form-urlencoded";
63             var json =WebRequestHelper.GetResponse(request, "utf-8");
64             if (string.IsNullOrEmpty(json) || json.Contains("error") || !json.Contains("callback"))
65                 return null;
66             Regex reg = new Regex(@"\(([^)]*)\)");
67             Match m = reg.Match(json);
68             var dis = m.Result("$1").DeserializeJson<Dictionary<string, string>>();
69             return dis;
70         }
71         /// <summary>
72         /// 获取用户的基本信息
73         /// </summary>
74         /// <param name="token"></param>
75         /// <param name="openId"></param>
76         /// <returns></returns>
77         public virtual Dictionary<string, string> GetUserInfo(string token, string openId)
78         {
79             if (string.IsNullOrEmpty(token)) return null;
80             var url = $"https://graph.qq.com/user/get_user_info?access_token={token}&openid={openId}&oauth_consumer_key={appId}";
81             HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
82             var json =WebRequestHelper.GetResponse(request, "utf-8");
83             var dis = json.DeserializeJson<Dictionary<string, string>>();
84             if (dis.ContainsKey("ret") && dis["ret"] != "0")
85                 return null;
86             return dis;
87         }
88         #endregion
View Code

//PS.

我的项目中不允许用户直接使用第三方登陆,所在在登陆的时候会给一个页面让用户绑定已有账号

在项目中遇到一个前端的知识盲区,就是如何关闭页面的同时刷新登陆页面。

用到的js很简单

 1   需关闭的页面
 2  document.domain='@Html.GetUrl("Domain")';//跨域
 3             var json = {
 4                 Status:@Model.IsLogin.ToString().ToLower(),
 5             }
 6             window.opener.callbackQq(json)
 7             window.close();
 8 需刷新的页面
 9 window.callbackQq = function (result) {
10     if (result.Status) {
11         window.location.reload();
12     }
13     else {
14         var _html = "";
15         _html += '<span class="failure">请绑定账号,再使用第三方登陆</span>';
16         $("#error").append(_html);
17     }
18 }

登陆到这里应该算是完结了。

posted @ 2019-09-02 20:00  隨興∥隨心  阅读(525)  评论(0编辑  收藏  举报