网站集成QQ登录功能(转)
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一下,希望对有这方面需求的朋友有所帮助。
一.前期准备
首先你需要登录QQ的开发平台注册一个账号,QQ互联平台官方地址:http://connect.qq.com/ 进去后注册一个开发账号,完了登录后台会有类似如下的一个后台,填好相关信息,具体可以参考下图。最后我们会有一个APP ID和APP KEY ,有了这两个东西才能实现后面的集成QQ登录功能。

二.开发工作
当我们的账号审核后,QQ开发平台会给我们一个APP ID和APP KEY,有了这两个,我们就可以进行开发的工作了。
QQ的登录采用的是OAuth2.0协议,OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。具体的内容可以参考QQ的API文档http://wiki.connect.qq.com/oauth2-0%e7%ae%80%e4%bb%8b
QQ的开发平台已经有PHP,JAVA,JS等版本的SDK了,如果是要用到这些语言进行开发的可以直接参考这些SDK,我这边直接讲一下ASP.NET版本(MVC)的开发。
第一步.先在WebConfig中的 <appSettings>节点下加入如下配置
|
1
2
3
4
|
<add key="QQAppID" value="QQ平台给的APP ID" /><add key="QQAppKey" value="QQ开发平台给的APP KEY"/> |
第二步.在Controllers中加一个登陆的Action(我这边用的是MVC的开发方式,如果是传统.NET的可以直接在.aspx的Page_Load事件里加如下方法)
|
1
2
3
4
5
6
7
8
9
10
|
public ActionResult LoginQQ(){string state = new Random(100000).Next(99, 99999).ToString();//随机数Session["QQState"] = state;string appID = ConfigurationManager.AppSettings["QQAppID"];string qqAuthorizeURL = ConfigurationManager.AppSettings["QQAuthorizeURL"];string callback = ConfigurationManager.AppSettings["QQCallBack"];string authenticationUrl = string.Format("{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}", qqAuthorizeURL, appID, callback, state);//互联地址return new RedirectResult(authenticationUrl);} |
这一步主要是实现去QQ平台进行身份验证,直观点也就是点击后会去出现如下截图的画面

第三步.在点击了上图的同意登录后(也就是已经使用QQ号在QQ平台登录),QQ平台会通过我们上面配置的回调地址也就是我这边填的http://www.mylanqiu.com/Account/WeiboConnect/返回到这个页面,并会返回一个code给我们,我们到时会使用这个code再去QQ开发平台获取access_token,并通过这个access_token获取登录的相关用户信息。具体代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
/// <summary>/// QQ回调页面/// </summary>public ActionResult QQConnect(){if (!string.IsNullOrEmpty(Request.Params["code"]) && !string.IsNullOrEmpty(Request.Params["state"])){var code = Request.Params["code"];var state = Request.Params["state"];string requestState = Session["QQState"] == null ? "" : Session["QQState"].ToString();if (state == requestState){try{QQOAuthHelper QAuthHelper = new QQOAuthHelper();//这是一个辅助类,代码会在下面给出QQOauthInfo qqOauthInfo = QAuthHelper.GetOauthInfo(code);string openID = QAuthHelper.GetOpenID(qqOauthInfo);//获取用的OpenID,这个ID是QQ给我们的用户的唯一ID,可以作为我们系统用户唯一性的判断存在我们自己的库中Session["QQOpenID"] = openID;string nickName = QAuthHelper.GetUserInfo(qqOauthInfo, openID);//获取用户的昵称UserAccount userAccount = AccountBLL.GetUserAccountByOpenID(OAuthPlatform.QQ.ToString(), openID);if (userAccount != null)//判断是否是已用该OpenID是否已在我们的库中,若已存在则允许登录{SetAuthCookie(userAccount);Response.Write("<script> window.opener.location.reload();window.close();</script>");}ViewData["NickName"] = nickName;}catch (Exception ex){return new RedirectResult("~/Error/Error.htm");}}else{return new RedirectResult("~/Error/Error.htm");}}else{return new RedirectResult("~/Error/Error.htm");}return View();} |
通过上面的步骤就可以实现网站集成QQ登录了。下面给出辅助类的源代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
using System;using System.Text;using System.Configuration;using System.Collections.Generic;using System.Linq;using System.Net;using System.Web;using System.IO;namespace Com.ABC.Mylanqiu.BLL{public class QQOAuthHelper{string appID = ConfigurationManager.AppSettings["QQAppID"];string appKey = ConfigurationManager.AppSettings["QQAppKey"];/// <summary>/// 获取oauth信息/// </summary>/// <param name="code"></param>/// <returns></returns>public QQOauthInfo GetOauthInfo(string code){string callback = System.Web.HttpUtility.UrlEncode(ConfigurationManager.AppSettings["QQCallBack"], Encoding.UTF8);string url = string.Format("https://graph.qq.com/oauth2.0/token?grant_type={0}&client_id={1}&client_secret={2}&code={3}&redirect_uri={4}", "authorization_code", appID, appKey, code, callback);string res = LoadHtmlUserGetType(url, Encoding.UTF8);QQOauthInfo qqOauthInfo = new QQOauthInfo();qqOauthInfo.AccessToken = CutString(res, "access_token=", "&expires_in=");qqOauthInfo.ExpiresIn = CutString(res, "&expires_in=", "&refresh_token=");qqOauthInfo.RefreshToken = res.Split(new string[] { "&refresh_token=" }, StringSplitOptions.None)[1];return qqOauthInfo;}/// <summary>/// 截取字符串中两个字符串中的字符串/// </summary>/// <param name="str">字符串</param>/// <param name="startStr">开始字符串</param>/// <param name="endStr">结束字符串</param>/// <returns></returns>private string CutString(string str, string startStr, string endStr){int begin, end;begin = str.IndexOf(startStr, 0) + startStr.Length; //开始位置end = str.IndexOf(endStr, begin); //结束位置return str.Substring(begin, end - begin); //取搜索的条数,用结束的位置-开始的位置,并返回}/// <summary>/// 通过GET方式获取页面的方法/// </summary>/// <param name="urlString">请求的URL</param>/// <param name="encoding">页面编码</param>/// <returns></returns>public string LoadHtmlUserGetType(string urlString, Encoding encoding){HttpWebRequest httpWebRequest = null;HttpWebResponse httpWebRespones = null;Stream stream = null;string htmlString = string.Empty;try{httpWebRequest = WebRequest.Create(urlString) as HttpWebRequest;}catch (Exception ex){throw new Exception("建立页面请求时发生错误!", ex);}httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; Maxthon 2.0)";try{httpWebRespones = (HttpWebResponse)httpWebRequest.GetResponse();stream = httpWebRespones.GetResponseStream();}catch (Exception ex){throw new Exception("接受服务器返回页面时发生错误!", ex);}StreamReader streamReader = new StreamReader(stream, encoding);try{htmlString = streamReader.ReadToEnd();}catch (Exception ex){throw new Exception("读取页面数据时发生错误!", ex);}streamReader.Close();stream.Close();return htmlString;}/// <summary>/// 获取QQ账号的OpenID/// </summary>/// <param name="qqOauthInfo"></param>/// <returns></returns>public string GetOpenID(QQOauthInfo qqOauthInfo){string res = LoadHtmlUserGetType("https://graph.qq.com/oauth2.0/me?access_token=" + qqOauthInfo.AccessToken, Encoding.UTF8);return CutString(res, @"openid"":""", @"""}");}/// <summary>/// 获取QQ昵称/// </summary>/// <param name="qqOauthInfo"></param>/// <param name="openID"></param>/// <returns></returns>public string GetUserInfo(QQOauthInfo qqOauthInfo, string openID){string urlGetInfo = string.Format(@"https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}", qqOauthInfo.AccessToken,appID, openID);string resUserInfo = LoadHtmlUserGetType(urlGetInfo, Encoding.UTF8);return CutString(resUserInfo, @"""nickname"": """, @""",");}}public class QQOauthInfo{public string AccessToken { get; set; }public string ExpiresIn { get; set; }public string RefreshToken { get; set; }}} |
四.Demo效果
大家可以直接访问http://www.mylanqiu.com看一下实际的效果,最后感谢大家的阅读,如对你有所帮助就多多转发,以帮助更多人,正所谓:赠人玫瑰 手有余香!如有不足,还请指正!
http://www.cnblogs.com/bokeyuan123/p/5445355.html
网站集成QQ登录功能(转)的更多相关文章
- 网站集成QQ登录功能
最近在做一个项目时,客户要求网站能够集成QQ登录的功能,以前没做过这方面的开发,于是去QQ的开放平台官网研究了一下相关资料,经过自己的艰苦探索,终于实现了集成QQ登录的功能,现在把相关的开发经验总结一 ...
- 利用WxJava实现网站集成微信登录功能,核心代码竟然不超过10行
最近网站PC端集成微信扫码登录,踩了不少坑,在此记录下实现过程和注意事项. 本文目录 一.微信开放平台操作步骤1.创建“网站应用”2.获取AppID和AppSecret二.开发指南三.开发实战1.po ...
- 利用WxJava实现PC网站集成微信登录功能
原文地址:https://mp.weixin.qq.com/s/rT0xL9uAdHdZck_F8nyncg 来源:微信公众号:java碎碎念 1. 微信开放平台操作步骤 微信开放平台地址:https ...
- QQ登录功能之如何获取用于本地测试的APPID
本文主要说明一下开发者如何在QQ互联创建测试应用,从而分配给我们一套APP ID和APP KEY,在我们平时学习的时候使用. 一.QQ互联注册开发者 要想使用QQ登陆的功能,首先你必须是腾讯开发者.腾 ...
- DRF框架QQ登录功能
用户模块---QQ登录 流程图 QQ登录文档:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0 流程简述 ...
- CAS Server集成QQ登录、新浪微博登录源码及配置文件
转载自素文宅博客:https://blog.yoodb.com/yoodb/article/detail/1446 CAS Server集成QQ第三方登录,CAS Server集成新浪微博第三方登录以 ...
- 如何在ios中集成微信登录功能
在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做,这样做的好处就是轻量级,程序负重小,在Build Settings 中这样设置 然后设置 友盟的设置同上,但是要注意,加入你需要的所 ...
- React Native 接入微博、微信、QQ 登录功能
在 App 开发中我们经常需要在用户登录模块接入 SNS 登录组件,这样会大大提高用户的注册体验.特别当一个不是刚性需求 App 推广的时候,这样会很大的降低用户体验的成本,没有人愿意忍受输入邮箱.手 ...
- 对163k地方门户网站系统QQ互联功能修改
163k地方门户网站QQ互联申请时遇到的问题: "禁止开发商强制用户重新注册或绑定其他帐号" 原因是用户登录完QQ还需要注册帐号或者绑定原有帐号 163k地方门户网站的QQ互联登录 ...
随机推荐
- 配置SAP 采购合同审批
需求: 采购合同类型是MK,采购组织是POSC,采购组PGC,标识:估计价格是空,总价有值0.00 - 9999999999.00 RMB 满足以上条件的时候需要审批该合同. 配置: spro-> ...
- 记录Log4Net的使用
最近项目中有一个记录错误日志的功能模块,以前采用的是写TXT的做法.代码如下 /// <summary> /// 写入日志 /// </summary> public stat ...
- xpath的文本获取
xpath中tidyText()获取标签下所有文本, text()本级文本, allText()各级所有文本.
- Swift - 经纬度位置坐标与真实地理位置相互转化
通过CoreLocation类,得到的定位信息都是以经度和纬度等表示的地理信息,通过CLGeocoder类可以将其反编码成一个地址.反之,也可根据一个地址获取经纬度. 1,通过经纬度获取地址 1 2 ...
- TCP协议中的计时器
说明: 本文仅供学习交流.转载请标明出处,欢迎转载! 本文是下面文献相关内容的总结 [1] <TCP/IP具体解释 卷1:协议> [2] <TCP/IP协议族 第4版> [3 ...
- CSU1664: 防水堤坝
Description 在太平洋的一个小岛上,岛民想要建立一个环岛的堤坝,我们能够将小岛简化为一个二维平面,你须要使用K条边(这些边要么是水平或者垂直长度为1的边,要么是45度倾斜的长度为√2的边)围 ...
- linux命令:rm
删文件要一个个回答y,谁有好办法自动删除? rm -rf 用rm递归删除目录下面的所有.o文件: find . -name "*.o" | xargs rm -f :
- linux命令:ftp
1. 登录: ftp IP_ADDR : 根据提示输入USER_NAME PASS_WORD 或: ftp -i -n IP_ADDR user USER_NAME PASS ...
- perl Exporter一些神奇写法
use base qw(Exporter); @JSON::EXPORT = qw(from_json to_json jsonToObj objToJson encode_json decode_j ...
- Linux 安装ibus极点五笔输入法备忘录
Linux 安装 ibus 五笔输入法备忘录 useful?: https://github.com/definite/ibus-table-chinese 一. yum install ibus* ...