网站集成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"/>

<add key="QQCallBack" value="http://www.mylanqiu.com/Account/QQConnect/"/>

<add key="QQAuthorizeURL" value="https://graph.qq.com/oauth2.0/authorize" />

第二步.在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 { getset; }

public string ExpiresIn { getset; }

public string RefreshToken { getset; }

}

}

四.Demo效果

大家可以直接访问http://www.mylanqiu.com看一下实际的效果,最后感谢大家的阅读,如对你有所帮助就多多转发,以帮助更多人,正所谓:赠人玫瑰 手有余香!如有不足,还请指正!

http://www.cnblogs.com/bokeyuan123/p/5445355.html

 

时间: 2024-08-29 07:06:31

网站集成QQ登录功能(转)的相关文章

网站集成QQ登录功能

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

腾讯QQ登录功能向第三方网站完全开放 无需审核

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 4月17日,腾讯QQ登录功能申请向第三方网站完全开放,现在第三方网站只要登录腾讯社区开放平台填写网站资料便可以立即获取QQ登录相关的key和ID,无需等待审核. 据悉,通过"QQ登录",用户能使用QQ帐号一键登录接入网站,大大降低了用户注册.登录的门槛.已登录用户还可以将在第三方网站发布.分享的信息即时同步到QQ空间,使网

腾讯QQ登录功能向第三方网站完全开放

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 4月17日,腾讯QQ登录功能申请向第三方网站完全开放,现在第三方网站只要登录腾讯社区开放平台填写网站资料便可以立即获取QQ登录相关的key和ID,无需等待审核. 据悉,通过"QQ登录",用户能使用QQ帐号一键登录接入网站,大大降低了用户注册.登录的门槛.已登录用户还可以将在第三方网站发布.分享的信息即时同步到QQ空间,使网

Java Web 实现QQ登录功能一个帐号同一时间只能一个人登录_java

对于一个帐号在同一时间只能一个人登录,可以通过下面的方法实现: 1 .在用户登录时,把用户添加到一个ArrayList中 2 .再次登录时查看ArrayList中有没有该用户,如果ArrayList中已经存在该用户,则阻止其登录 3 .当用户退出时,需要从该ArrayList中删除该用户,这又分为三种情况 ① 使用注销按钮正常退出 ② 点击浏览器关闭按钮或者用Alt+F4退出,可以用JavaScript捕捉该页面关闭事件, 执行一段Java方法删除ArrayList中的用户 ③ 非正常退出,比如

网站接入QQ登录的两种方法_javascript技巧

首先引入授权js文件 <script type="text/javascript" src="http://qzonestyle.gtimg.cn/qzone/openapi/qc_loader.js" data-appid="101140406" data-redirecturi="http://127.0.0.1" charset="utf-8"></script> 然后接入QQ

java web网站集成新浪微博登录

  给网站添加第三方登录的功能,研究了下新浪微博登录的接口,本来想使用它提供的那种js代码库的方式,结果始终搞不定,由于不精通js只能够放弃.下载了个java的SDK包:weibo4j-oauth2-beta2.1.1,研究了下,虽然出了一些问题,但还是很快集成到网站里面了. 首先,把一些必要的包和java类负责到自己的工程文件: 修改config文件里面的client_ID,client_SERCRET,redirect_URI. 自己在登录页面写一个微博登录按钮,超链接到名字为OAuth4C

WordPress集成豆瓣登录功能例子

对于微博登录和QQ登录来说,豆瓣可能相对冷门,但是对于文艺网站来说还是很有用的.不得不说豆瓣的授权非常逗比,获取token之后居然连使用的地方都没有. 注册应用 注册应用没什么可说的,注意这里的回调地址,要把参数也给写上,要不然会授权失败. 实现方法 repo中是多个oauth方法结合在一起的. Github地址 https://github.com/bigfa/wp-oauth 文件下载方法 豆瓣登录只需要使用douban.php中的代码和functions.php中的代码加入到你的funct

如何给自己网站支持QQ登录

  1.打开open.qq.com   添加创建应用:->输入常规的数据  你会看到对应的APP ID和KEY值,这是对你身份证的唯一的验证 2.打开 http://connect.qq.com/manage/  点击->添加网站->输入相关信息  这里比较特别注意的是,回调地址那里填上你域名就可以了以上申核需要一到两天时间,耐心等待... 3.打开http://wiki.opensns.qq.com/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91

首家QQ登录OAuth2.0 手机APP及PC端网站上线

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 热腾9月20日消息 第一家QQ登录OAuth2.0手机APP上线啦--蘑菇街iphone版支持QQ帐号登录!OAuth2.0应用实现了手机网站和手机APP的QQ登录功能,支持通过手机QQ账号登录第三方网站,并大大降低第三方网站的接入成本.目前还有一批手机网站/手机APP正在接入调试中,大家可以前往QQ登录OAuth2.0体验专区进行了解. 另