第一步:获取AppID AppSecret(去QQ开放平台申请网址https://connect.qq.com/index.html/)
第二步:生成扫描二维码,获取code
https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=yourclient_id&redirect_uri=回调地址&state=" + random
(注:
client_id是在QQ开放平台申请通过后获得的appID,
redirect_uri(重定向地址,需要进行UrlEncode,实现登录接口后自己网站的页面处理,比如跳转到会员后台页面)
response_type:code(写死的,不用管它)
state:(用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验,我是用的生成的随机数,放在session里,等一下验证)
然后就是调用接口代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using System.Net;
using System.IO;
using System.Text;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Text.RegularExpressions;
//using CsharpHttpHelper;
public partial class callback_qqLogin : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session["loginState"] != null && Request.QueryString["state"] != null && Request.QueryString["code"] != null)
{
string state = Request.QueryString["state"].ToString();
if (!Session["loginState"].ToString().Equals(state))
{
Response.Redirect("../Reminder-reviewError.html");
Response.End();
}
else
{
string code = Request.QueryString["code"].ToString();
QQ_callback qq_callback = new QQ_callback();
User_info qq_info = qq_callback.getQQUserInfoJSON(code);
string openId = qq_info.openId;
Handler handler = new Handler();
string userId = handler.GetCallback(openId);
string userName = qq_info.nickname;
//判断是不是第一次登录,如果是就添加到数据库
if ("".Equals(userId))
{
string pwd = "123456";//初始密码
pwd = Encrypt.MD5.MD5Encrypt(pwd);
string userSex = qq_info.gender;
string province = qq_info.province;
string city = qq_info.city;
//添加到数据库
}
//清空session["loginState"] ,当点击QQ登录图标时再自动生成随机数放进去
Session["loginState"] = "";
Response.Redirect("../member/index.html");
}
}
else
{
Response.Redirect("../Reminder-reviewError.html");
}
}
}
通过QQ code获到QQ用户的资料信息
public User_info getQQUserInfoJSON(string code)
{
string client_id = "你在QQ开放平台申请通过后的获得的client_id "";
string appid = "你在QQ开放平台申请通过后的获得的appid";
string Return_url = "你的回调地址";
string state = "text";
string apiurl = string.Format("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id={0}&client_secret={1}&code={2}&redirect_uri={3}&state={4}", client_id, appid, code, Return_url, state);
System.GC.Collect();
System.Net.ServicePointManager.DefaultConnectionLimit = 200;
WebRequest request = WebRequest.Create(apiurl);
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
Encoding encode = Encoding.UTF8;
StreamReader reader = new StreamReader(stream, encode);
string jsonText = reader.ReadToEnd();
string access_token = jsonText.Split('&')[0].Split('=')[1].ToString();
string url_me = string.Format("https://graph.qq.com/oauth2.0/me?access_token={0}", access_token);
request = WebRequest.Create(url_me);
response = request.GetResponse();
stream = response.GetResponseStream();
reader = new StreamReader(stream, encode);
string openIdStr = reader.ReadToEnd();
openIdStr = openIdStr.Substring(openIdStr.IndexOf('(') + 1, (openIdStr.IndexOf(')') - openIdStr.IndexOf('(') - 1)).Trim();
JObject jo = (JObject)JsonConvert.DeserializeObject(openIdStr);
string openId = jo["openid"].ToString();
根据OpenID获取用户信息 可以显示更多 用的就几个 需要的可以自己在下面加
string getinfo = string.Format("https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}", access_token, client_id, openId);
request = WebRequest.Create(getinfo);
response = request.GetResponse();
stream = response.GetResponseStream();
reader = new StreamReader(stream, encode);
string userStr = reader.ReadToEnd();
//this.Label1.Text = userStr;
//this.Label2.Text = openIdStr;
JObject info = (JObject)JsonConvert.DeserializeObject(userStr);
User_info qq_info = new User_info();
qq_info.openId = openId;
qq_info.nickname = info["nickname"].ToString();
qq_info.gender = info["gender"].ToString();
qq_info.province = info["province"].ToString();
qq_info.city = info["city"].ToString();
qq_info.figureurl = info["figureurl"].ToString();//大小为30×30像素的QQ空间头像URL。
reader.Close();
stream.Flush();
stream.Close();
response.Close();
return qq_info;
}
自己定义的User_info
public class User_info
{
public string openId { get; set; }//QQ昵称
public string nickname { get; set; }//QQ昵称
public string gender { get; set; }//QQ性别
public string province { get; set; }//QQ所在省份
public string city { get; set; }//QQ所在地区
public string year { get; set; }//QQ出生年份
public string figureurl { get; set; }//QQ空间头像URL图像30*30
public string figureurl_1 { get; set; } //QQ空间头像URL图像50*50
public string figureurl_2 { get; set; }//QQ空间头像URL图像100*100
}
以上代码就可以实现QQ扫码登录
演示网址(https://www.shisezhe.com/register.html),点击上面的QQ登录图标就可以实现QQ扫码登录,如果有不明白的可以评论