第一步:获取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*30public string figureurl_1 { get; set; } //QQ空间头像URL图像50*50public string figureurl_2 { get; set; }//QQ空间头像URL图像100*100
}
以上代码就可以实现QQ扫码登录
演示网址(https://www.shisezhe.com/register.html),点击上面的QQ登录图标就可以实现QQ扫码登录,如果有不明白的可以评论