登陆整合实现-QQ互联认证(ASP.NET版本)
QQSettingConfig qqSettingConfig = MySiteConfig.GetConfig<QQSettingConfig>();//配置对象 配置QQ的 app id appkey 回调地址
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string state = new Random().Next(, ).ToString();//随机数
context.Session["state"] = state;
string callback = System.Web.HttpUtility.UrlEncode(qqSettingConfig.CallBackAddress + "/QQCallBack.aspx", Encoding.UTF8);//回调处理地址
string url = string.Format("https://graph.qq.com/oauth2.0/authorize?client_id={0}&response_type=code&redirect_uri={1}&state={2}", qqSettingConfig.APPID, callback, state);//互联地址
context.Response.Redirect(url);
}
QQSettingConfig qqSettingConfig = MySiteConfig.GetConfig<QQSettingConfig>();//配置对象 配置QQ的 app id appkey 回调地址
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
try
{
string code = HttpContext.Current.QueryString["code"];
string state = HttpContext.Current.QueryString["state"];
ValidCodeState(code, state);
QQOauthInfo qqOauthInfo = GetOauthInfo(code);
string openID = GetOpenID(qqOauthInfo);
string nickName = GetUserInfo(qqOauthInfo, openID);
if (string.IsNullOrEmpty(nickName))
{
WriteErrMsg("获取不到昵称");
} #region 开始进行注册或者登录
OauthUserModel oauthUserModel = BLL.OauthUserBll.GetInfoByOpenId("qq", openID);
if (!oauthUserModel.IsNull)
{
//已经绑定过则登录
DealLogin(oauthUserModel);
}
else
{
//进行绑定
this.TxtRegUserName.Text = nickName;
this.hidenNiName.Value = nickName;
this.hidenOpenID.Value = openID;
this.LabelNiName.Text = nickName;
this.LabelOpenID.Text = openID;
}
#endregion
}
catch (Exception ex)
{
//ShowError("出错了:"+ ex.Message);
} }
}
/// <summary>
/// 验证code和state
/// </summary>
/// <param name="code"></param>
/// <param name="state"></param>
private void ValidCodeState(string code, string state)
{
if (string.IsNullOrEmpty(code) || string.IsNullOrEmpty(state))
{
ShowError("CODE或者STATE为空");
}
if (Session["state"] == null || Session["state"].ToString() != state)
{
ShowError("STATE不正确");
}
}
QQOauthInfo qqOauthInfo = GetOauthInfo(code);
方法如下
/// <summary>
/// 获取oauth信息
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
private QQOauthInfo GetOauthInfo(string code)
{
string callback = System.Web.HttpUtility.UrlEncode(qqSettingConfig.CallBackAddress + "/QQCallBack.aspx", Encoding.UTF8);
string url = string.Format("https://graph.qq.com/oauth2.0/token?grant_type={0}&client_id={1}&client_secret={2}&code={3}&redirect_uri={4}", "authorization_code", qqSettingConfig.APPID, qqSettingConfig.APPKEY, code, callback);
string res = LoadHtmlUserGetType(url, Encoding.UTF8);
if (!res.Contains("access_token="))
{
ShowError("出错了:空access_token");
}
QQOauthInfo qqOauthInfo = new QQOauthInfo();
qqOauthInfo.AccessToken = CutString(res, "access_token=", "&expires_in=");
qqOauthInfo.ExpiresIn = CutString(res, "&expires_in=", "&refresh_token=");
qqOauthInfo.RefreshToken = res.Split(new string[] { "&refresh_token=" }, StringSplitOptions.None)[];
if (string.IsNullOrEmpty(qqOauthInfo.AccessToken) || string.IsNullOrEmpty(qqOauthInfo.ExpiresIn) || string.IsNullOrEmpty(qqOauthInfo.RefreshToken))
{
ShowError("获取access_token等信息为空");
}
return qqOauthInfo;
}
/// <summary>
/// 截取字符串中两个字符串中的字符串
/// </summary>
/// <param name="str">字符串</param>
/// <param name="startStr">开始字符串</param>
/// <param name="endStr">结束字符串</param>
/// <returns></returns>
public string CutString(string str, string startStr, string endStr)
{
int begin, end;
begin = str.IndexOf(startStr, ) + startStr.Length; //开始位置
end = str.IndexOf(endStr, begin); //结束位置
return str.Substring(begin, end - begin); //取搜索的条数,用结束的位置-开始的位置,并返回
} /// <summary>
/// 通过GET方式获取页面的方法
/// </summary>
/// <param name="urlString">请求的URL</param>
/// <param name="encoding">页面编码</param>
/// <returns></returns>
public string LoadHtmlUserGetType(string urlString, Encoding encoding)
{
HttpWebRequest httpWebRequest = null;
HttpWebResponse httpWebRespones = null;
Stream stream = null;
string htmlString = string.Empty;
try
{
httpWebRequest = WebRequest.Create(urlString) as HttpWebRequest;
}
catch (Exception ex)
{
throw new Exception("建立页面请求时发生错误!", ex);
}
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; Maxthon 2.0)";
try
{
httpWebRespones = (HttpWebResponse)httpWebRequest.GetResponse();
stream = httpWebRespones.GetResponseStream();
}
catch (Exception ex)
{
throw new Exception("接受服务器返回页面时发生错误!", ex);
}
StreamReader streamReader = new StreamReader(stream, encoding);
try
{
htmlString = streamReader.ReadToEnd();
}
catch (Exception ex)
{
throw new Exception("读取页面数据时发生错误!", ex);
}
streamReader.Close();
stream.Close();
return htmlString;
}
public class QQOauthInfo
{
public string AccessToken { get; set; }
public string ExpiresIn { get; set; }
public string RefreshToken { get; set; }
}
string openID = GetOpenID(qqOauthInfo);
方法如下
/// <summary>
/// 获取QQ账号的OpenID
/// </summary>
/// <param name="qqOauthInfo"></param>
/// <returns></returns>
private string GetOpenID(QQOauthInfo qqOauthInfo)
{
string res = LoadHtmlUserGetType("https://graph.qq.com/oauth2.0/me?access_token=" + qqOauthInfo.AccessToken, Encoding.UTF8);
if (!res.Contains("openid"))
{
WriteErrMsg("出错了:获取用户的openid出错");
}
return CutString(res, @"openid"":""", @"""}");
}
string nickName = GetUserInfo(qqOauthInfo, openID); 方法如下
/// <summary>
/// 获取QQ昵称
/// </summary>
/// <param name="qqOauthInfo"></param>
/// <param name="openID"></param>
/// <returns></returns>
private string GetUserInfo(QQOauthInfo qqOauthInfo, string openID)
{
string urlGetInfo = string.Format(@"https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}", qqOauthInfo.AccessToken, qqSettingConfig.APPID, openID);
string resUserInfo = LoadHtmlUserGetType(urlGetInfo, Encoding.UTF8);
if (!resUserInfo.Contains("\"msg\": \"\""))
{
WriteErrMsg("出错了:获取用户信息出错");
}
return CutString(resUserInfo, @"""nickname"": """, @""",");
}
if (string.IsNullOrEmpty(nickName))
{
ShowError("获取不到昵称");
}
#region 开始进行注册或者登录
OauthUserModel oauthUserModel = BLL.OauthUserBll.GetInfoByOpenId("qq", openID);
if (!oauthUserModel.IsNull)
{
//已经绑定过则登录
DealLogin(oauthUserModel);
}
else
{
//进行绑定
this.TxtRegUserName.Text = nickName;
this.hidenNiName.Value = nickName;
this.hidenOpenID.Value = openID;
this.LabelNiName.Text = nickName;
this.LabelOpenID.Text = openID;
}
#endregion
if exists(
select 1 from sys.systable
where table_name='PE_C_OauthUser'
and table_type in ('BASE', 'GBL TEMP')
) then
drop table PE_C_OauthUser
end if; /*==============================================================*/
/* Table: PE_C_OauthUser */
/*==============================================================*/
create table PE_C_OauthUser
(
ID int not null,
NiName nvarchar(50) null,
UserName nvarchar(50) null,
Type nvarchar(50) null,
AddTime datetime null,
Status int null,
OpenID nvarchar(150) null,
UserID int null,
constraint PK_PE_C_OAUTHUSER primary key clustered (ID)
); comment on table PE_C_OauthUser is
'用户和QQ或者微信等其他的Oauth关联'; comment on column PE_C_OauthUser.ID is
'主键ID'; comment on column PE_C_OauthUser.NiName is
'昵称从QQ或者微信取得的昵称'; comment on column PE_C_OauthUser.UserName is
'我方系统用户名'; comment on column PE_C_OauthUser.Type is
'类型:如QQ WEIXIN'; comment on column PE_C_OauthUser.AddTime is
'添加时间'; comment on column PE_C_OauthUser.Status is
'状态'; comment on column PE_C_OauthUser.OpenID is
'是QQ则openid 微信则'; comment on column PE_C_OauthUser.UserID is
'我方系统用户ID'; if exists(
select 1 from sys.systable
where table_name='PE_C_OauthUser'
and table_type in ('BASE', 'GBL TEMP')
) then
drop table PE_C_OauthUser
end if; /*==============================================================*/
/* Table: PE_C_OauthUser */
/*==============================================================*/
create table PE_C_OauthUser
(
ID int not null,
NiName nvarchar(50) null,
UserName nvarchar(50) null,
Type nvarchar(50) null,
AddTime datetime null,
Status int null,
OpenID nvarchar(150) null,
UserID int null,
constraint PK_PE_C_OAUTHUSER primary key clustered (ID)
); comment on table PE_C_OauthUser is
'用户和QQ或者微信等其他的Oauth关联'; comment on column PE_C_OauthUser.ID is
'主键ID'; comment on column PE_C_OauthUser.NiName is
'昵称从QQ或者微信取得的昵称'; comment on column PE_C_OauthUser.UserName is
'我方系统用户名'; comment on column PE_C_OauthUser.Type is
'类型:如QQ WEIXIN'; comment on column PE_C_OauthUser.AddTime is
'添加时间'; comment on column PE_C_OauthUser.Status is
'状态'; comment on column PE_C_OauthUser.OpenID is
'是QQ则openid 微信则'; comment on column PE_C_OauthUser.UserID is
'我方系统用户ID';
if (!oauthUserModel.IsNull)
{
//已经绑定过则登录
DealLogin(oauthUserModel);
}
//进行绑定
this.TxtRegUserName.Text = nickName;
this.hidenNiName.Value = nickName;
this.hidenOpenID.Value = openID;
this.LabelNiName.Text = nickName; this.LabelOpenID.Text = openID;

//添加到绑定表
OauthUserModel oauthUserModelNew = new OauthUserModel();
oauthUserModelNew.AddTime = DateTime.Now;
oauthUserModelNew.NiName = this.hidenNiName.Value;
oauthUserModelNew.OpenID = this.hidenOpenID.Value;
oauthUserModelNew.Status = ;
oauthUserModelNew.Type = "qq";
oauthUserModelNew.UserID = usersInfo.UserId;
oauthUserModelNew.UserName = usersInfo.UserName;
if (!BLL.OauthUserBll.Add(oauthUserModelNew))
{
ShowError("绑定失败");
}
登陆整合实现-QQ互联认证(ASP.NET版本)的更多相关文章
- 分享一下,PHP实现第四方QQ微信扫码登陆,不接入qq互联以及微信开发者平台就可以实现用户对接鹅厂,phpQQ微信扫码登陆
自己抓的QQ包以及整合了网上一些已经封装好了的代码具体如下:QQ: <?php class QQ extends Curl_Api { //获取登录验证码 public function QRc ...
- QQ 互联认证 回调地址提示说要http :// 但是事实不用
真奇怪 腾讯最近人手不够吧 这样的错误也会犯错....
- QQ登录整合/oauth2.0认证-02-跳转到QQ互联页
---------------------------目录---------------------------------- QQ登录整合/oauth2.0认证-01-申请appkey和appid ...
- QQ登录整合/oauth2.0认证-04-调整到QQ互联进行QQ登录
---------------------------------目录------------------------------------- QQ登录整合/oauth2.0认证-03-对第二节的代 ...
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码(转)
OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码
OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...
- QQ互联登陆(Java)
一.准备部分 1.账户注册 腾讯开放平台网址: https://connect.qq.com/index.html 首先需要到开放平台注册QQ互联开发者身份.注册之后创建一个网站应用,注意,需要备案成 ...
- ASP.NET MVC QQ互联接入
ASP.NET MVC QQ Connect 介绍 ASP.NET MVC QQ互联接入Demo. 项目地址:https://gitee.com/Liu_Cabbage/ASP.NET-MVC-QQ- ...
- 第三方登陆-qq互联
看到很多网站都有第三方登陆,使用业余时间自己也要实现一个第三方登陆的功能: 1.登陆qq互联的网站:https://connect.qq.com/index.html 2.点击头像进行资料申请 --- ...
随机推荐
- 高质量程序设计指南C/C++语言——C++/C程序设计入门(2)
*标准C规定,编译器只取前31个字符作为有效的标识符,而标准C++则取前255个字符作为有效的标识符. *把具有特殊含义的字符输出到终端上,尤其是当它们出现在普通字符串或格式控制字符串中时,一般来说有 ...
- ssh无密登录
ssh登录一般两种方式: 1.密码登录 2.密钥验证无需密码 使用方式:1.生成密钥 2.将公钥追加到authorized_keys中,需要注意的是执行权限需为600,这里因而第一次添加使用的是> ...
- 技术不牛如何才拿到国内IT巨头的Offer
不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...
- 权限控制框架Spring Security 和Shiro 的总结
关于权限控制,一开始感觉比较难,后来先是接触了Spring Security 学起来也比较吃力,再是学习了Shiro,感觉简单很多. 总体来说这些框架,主要做了两个事情 Authentication: ...
- 将文件存储到数据库中(MySQL)
package com.play; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundEx ...
- 学习日记之模板方法模式和 Effective C++
模板方法模式: 定义:定义一个操作中的算法的骨架.而将一些步骤延伸到子类中.模板方法使得子类能够不改变算法的结构就可以重定义该算法的某些特定步骤. (1),用了继承,而且肯定这个继承有意义的情况下.就 ...
- iOS开展-CocoaPods安装和使用教程
原文链接: iOS开展-CocoaPods安装和使用教程 修正已经增加了自己的理解. CocoaPods安装和使用教程 Code4App 原创文章.转载请注明出处:http://code4app.co ...
- use MSBuild cmd to build and deploy the database project.
You can use the below command to implement it. SET TargetDBName="Database name" SET DataBa ...
- SSIS: 使用最大ID和最大日期来增量更新表
简单三步: 1. 新增变量 MaxID和MaxCreateDate以及Variable 2. 放置一个 Execute SQL Task ,用SQL 来获取 MaxID和MaxCreateDat ...
- 如何在macox下面配置集成ios和android游戏教程
教程截图: 1.准备工作,配置开发环境: 开发环境:mac ox 10.7.3 + xcode4.2 + ndk r7 + eclipse helios 部署环境:中兴v880 root过了 ...