[转载]Devtext QQ登录完整实施过程

[转载]Devtext QQ登录完整实施过程 – alahfun – 博客园.

实施环境:ASP.NET mvc3.0 + ef4.1 + vs2010

1、你得去http://connect.opensns.qq.com/ 申请一个账号,会得到一个APP ID和App Key,这两个东东会在生成请求的时候用到。你的去填一些资料,还要提交一些资料审核。

2、如果你对腾讯的那一套协议很熟悉的话,你可以自己去写中间的认证过程,如果不熟悉,就可以用大牛们写的程序来。我这边用的是QzoneSDK,是园子里的大牛写的,具体参考地址:http://qqconnect.codeplex.com/

3、以上两步完成之后,在你的config文件中appsetting节点添加以下三个配置项

<add key="QzoneCustomerKey" value="11111" />
<add key="QzoneConsumerSecret" value="1111111" />
<add key="QzoneCallbackUrl" value="/site/qzonecallback"/>

QzoneCustomerKey对应app id,QzoneConsumerSecret 对应app key ,QzoneCallbackUrl是用qq登录之后,腾讯那边回调你完整的路径。

4、因为我将controller单独作为一个项目,所以将QzoneSDK.dll添加到这个项目

在页面上放置按钮,打开qq登录的页面,然后登录成功之后回调您的网站的页面。此时如果用户在你的网站有账号,那就可以绑定现有账号,或者新注册一个账号。如果你是新建站,也可以完全使用qq登录来作为用户体系。

下面上代码:

//qq登录页面
public ActionResult QzoneLogin ( ) {
			string key = ConfigurationManager.AppSettings["QzoneCustomerKey"];
			string secret = ConfigurationManager.AppSettings["QzoneConsumerSecret"];
			var context = new QzoneSDK.Context.QzoneContext(key, secret);
			var callbackUrl = ConfigurationManager.AppSettings["QzoneCallbackUrl"];
			var requestToken = context.GetRequestToken(callbackUrl);
			var authenticationUrl = context.GetAuthorizationUrl(requestToken, callbackUrl);
			HttpContext.Session["qzonetokenkey"] = requestToken.TokenKey;
			HttpContext.Session["qzonetokensecret"] = requestToken.TokenSecret;
			return new RedirectResult(authenticationUrl);
		}
//回调页面
public void QzoneCallback ( ) {
			if (Request.QueryString["oauth_vericode"] != null) {
				var requestTokenKey = HttpContext.Session["qzonetokenkey"].ToString();
				var requestTokenSecret = HttpContext.Session["qzonetokensecret"].ToString();
				var verifier = Request.QueryString["oauth_vericode"];
				string key = ConfigurationManager.AppSettings["QzoneCustomerKey"];
				string secret = ConfigurationManager.AppSettings["QzoneConsumerSecret"];
				QzoneSDK.Qzone qzone = new QzoneSDK.Qzone(key, secret, requestTokenKey, requestTokenSecret, verifier);
				QzoneSDK.Qzone qzone2 = new QzoneSDK.Qzone(key, secret, qzone.OAuthTokenKey, qzone.OAuthTokenSecret, string.Empty, true, qzone.OpenID);
				Session["qzoneauthcallback"] = qzone2;
				var currentUser = qzone2.GetCurrentUser();
				var user = (BasicProfile)JsonConvert.Import(typeof(BasicProfile), currentUser);
				if (null != user) {
					QQAuthEntity qqauth = BLLFactory<QQAuthService>.Instance.GetQQAuthEntityByOpenID(qzone2.OpenID);
					if (qqauth != null) {
						AccountState state = UserContext.Instance.QzoneAuthLogin(qzone2.OpenID, Utils.GetRealIP());
						if (state == AccountState.Normal) {
							Response.Write("<script>opener.location.href=\"/\";window.close();</script>");
						} else {
							Response.Write("<script>opener.location.href =\"/site/login\";window.close();</script>");
						}
					} else {
						Response.Write("<script>opener.location.href =\"/site/binduser\";window.close();</script>");
					}
				}
			}
		}

  QQAuthEntity的结构,openid,accesstokenkey,accesstokensecret是腾讯返回的,根本没有qq号,所以很多人误以为会获取到qq号。

public class QQAuthEntity {
		public int ID { get; set; }
		public int UserID { get; set; }
		public string OpenID { get; set; }
		public string AccessTokenKey { get; set; }
		public string AccessTokenSecret { get; set; }
		public DateTime InsertTime { get; set; }
	}

 绑定用户的页面

public ActionResult BindUser ( ) {
			if (Session["qzoneauthcallback"] == null)
				return RedirectToAction("Index");
			else {
				return View();
			}
		}

  在BindUser页面上实现绑定或者创建用户,后台代码就不提供了。

有几点注意的:1、在调试时,必须使用80端口。

       2、修改本地host,将你需要登录的域名指向本地

         以上两个不做的话,你都没办法调试

       3、在调试的时候,不要使用localhost,得使用域名,如http://www.devtext.com,完整的形式,不然HttpContext.Session[“qzonetokenkey”]和HttpContext.Session[“qzonetokensecret”]会为null,你在本地根本就获取不到。这个很郁闷的,一开始不知道,还以为是sdk的问题了。

补充,qq返回的用户头像有三个尺寸规格的,你可以不使用sdk里面的用户模型

具体效果可以访问http://www.devtext.com,有问题也可以联系我。

应该讲清楚了吧?哈哈哈

ps:你会wf4吗?会的话,联系下我吧,请教你几个问题,非常感谢。嘿嘿

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏