现在QQ第三方快捷登录在网站/App中的应用已经非常普遍,QQ快捷登录不仅可以减少用户登录、注册平台所花费的时间,而且不需要牢记平台账户密码,对于提升用户体验可谓是锦上添花(注:本人是记不住任何网站账号密码的)。
当然,有很多站点没有使用任何第三方登录功能,这里不做过多评价。
下面看下C#中如何实现QQ一键登录功能 没有引用任何第三方封装的帮助类库,全部源码开放,结尾处有DEMO案例,请自行下载。
第一步:请自行到QQ互联(https://connect.qq.com)申请开发者权限,创建属于自己网站的应用
对于这一步 这里不做过多叙述,进入QQ互联按照步骤填写资料后 等待审核就行。
第二步:这里视作第一步已经完成 并取得了APP ID 和 APP Key并已配置好网站回调地址,废话不多说 直接上代码来看。
下面为QQ互联交互处理帮助类,请自行换成自己的ID和Key。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Configuration;
using System.Web;
using System.Web.Script.Serialization;
using System.Text.RegularExpressions;
namespace OAuthQQ.open
{
/// <summary>
/// C#实现QQ快捷登录网站DEMO
/// 来源:www.yunjson.com
/// </summary>
public sealed class QQLogin
{
private const string AppId = "xxxxx";//QQ互联中申请的APPID
private const string AppKey = "xxxxxxxx";//QQ互联中申请的APP Key
private const string RequestAuthorizeUrl = "https://graph.qq.com/oauth2.0/authorize";
private const string RequestAccessTokenUrl = "https://graph.qq.com/oauth2.0/token";
private const string RequestOpenIdUrl = "https://graph.qq.com/oauth2.0/me";
private const string RequestUserInfoUrl = "https://graph.qq.com/user/get_user_info";
public static string getLoginUrl(string state)
{
return RequestAuthorizeUrl "?response_type=code&client_id=" AppId "&redirect_uri=" getCallBackUrl() "&state=" state;
}
public static string getCallBackUrl()
{
return HttpUtility.UrlEncode("http://www.xxxxxx.com/open/open.aspx");//此处链接务必修改为自己网站对应链接
}
private string getTokenUrl(string code)
{
string ret = Utils.httpGet(RequestAccessTokenUrl "?grant_type=authorization_code&client_id=" AppId "&client_secret=" AppKey "&code=" code "&redirect_uri=" getCallBackUrl());
return HttpUtility.ParseQueryString(ret).Get("access_token");
}
private QQOpenIdInfo getOpenId(string accessToken)
{
string ret = Utils.httpGet(RequestOpenIdUrl "?access_token=" accessToken);
if (!ret.StartsWith("callback"))
{
return null;
}
JavaScriptSerializer jss = new JavaScriptSerializer();
int start = ret.IndexOf("(") 1;
int end = ret.IndexOf(")");
return jss.Deserialize<QQOpenIdInfo>(ret.Substring(start, end - start));
}
private QQUserInfo getUserInfo(string access_token, string openId)
{
string ret = Utils.httpGet(RequestUserInfoUrl "?access_token=" access_token "&oauth_consumer_key=" AppId "&openid=" openId);
JavaScriptSerializer jss = new JavaScriptSerializer();
return jss.Deserialize<QQUserInfo>(ret);
}
public OpenInfo login(string code)
{
OpenInfo info = new OpenInfo();
try
{
string accessToken = getTokenUrl(code);
QQOpenIdInfo qqOpenIdInfo = getOpenId(accessToken);
if (qqOpenIdInfo == null)
{
return null;
}
QQUserInfo userInfo = getUserInfo(accessToken, qqOpenIdInfo.OpenId);
info.OpenId = qqOpenIdInfo.OpenId;
info.NickName = userInfo.NickName;
info.Photo = userInfo.Figureurl_1;
}
catch (Exception e)
{
info.ErrorMsg = e.ToString();
info.HasError = false;
}
return info;
}
}
}
下面来看下交互处理调用方法(当然还有一些其他辅助类,这里不做过多解释,请下载源码附件自行查看)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace OAuthQQ.open
{
/// <summary>
/// 首页 运行此页面跳转测试(为保证测试效果,请务必在配置完整后在公网环境进行)
/// 来源:www.yunjson.com
/// </summary>
public partial class qq : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string state = Utils.getRandomNumber().ToString();
HttpCookie loginCookie = new HttpCookie("OAuthQQLogin", state);
Response.Cookies.Add(loginCookie);
Response.Redirect(QQLogin.getLoginUrl(state));
}
}
}
第三步:进行回调地址页面逻辑编写,代码已奉上 请查阅
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace OAuthQQ.open
{
/// <summary>
/// 此页面为登录成功后的回调地址,此页面地址需要在QQ互联接口基本信息中预先配置,否则无法使用
/// 来源:www.yunjson.com
/// </summary>
public partial class open : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string state = Request.QueryString["state"];
string code = Request.QueryString["code"];
if (code == null)
{
//参数不全不处理请求 ,跳转到首页
Response.Redirect("http://www.xxxxxx.com/");
}
OpenInfo info = null;//当前登录用户信息
HttpCookie cookie = Request.Cookies["OAuthQQLogin"];
//qq登录
if (cookie.Value == state)
{
QQLogin qqLogin = new QQLogin();
info = qqLogin.login(code);
}
if (info.HasError)
{
//出错
Response.Write("出错" Server.UrlEncode(info.ErrorMsg));
}
//至此 若info!=null 并且OpenId不为空,则登录成功
if (info != null && !string.IsNullOrEmpty(info.OpenId))
{
//登录成功,获取用户信息
//请在此处理您的登录/注册业务逻辑
string query = "photo=" info.Photo "&nickname=" info.NickName "&openid=" info.OpenId;
Response.Write(query);
}
}
}
}
第四步:说那么多废话,其实以上代码只需要配置AppID 、APPKey、回调地址即可。其他登录、注册逻辑请自行处理。
完成以上代码配置后,就可以进行线上测试,为保证测试效果,请务必在配置完整后在公网环境进行。如有疑问 请进入技术群咨询群主。
第五步:第五步已经没啥能说的了,下面来看下源码目录结构。
点击下载 C#实现QQ快捷登录注册案例源码 回家自行研究吧。看我说的再多,不如自己去实战下来的爽快。