C#实现QQ扫码登录

第一步:获取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扫码登录,如果有不明白的可以评论

你可能感兴趣的:(C#)