这是我的页面结构,其中login.aspx页面上有QQ登录按钮,然后引用官方的js,还有根据api写的获取登录后用户信息的js.login.aspx登录页截图。
引用官方js,然后设置一个登录后需要返回的路径data-redirecturi,下面引用的QQLogin.js里面主要写了判断是否登录成功,以及获取信息。代码在下面。
function QQLoginTrue() {
var openid; //登录成功获取openid,
var accesstoken; //获取accessToken
var qqsex;
var qqnickname;
//获取当前登录用户的Access Token以及OpenID
if (QC.Login.check()) {//如果已登录
QC.Login.getMe(function (openId, accessToken) {
//从页面收集OpenAPI必要的参数。get_user_info不需要输入参数,因此paras中没有参数
var paras = {};
//用JS SDK调用OpenAPI
QC.api("get_user_info", paras).success(function (s) {//指定接口访问成功的接收函数,s为成功返回Response对象
//成功回调,通过s.data获取OpenAPI的返回数据
//alert("获取用户信息成功!当前用户昵称为:" + s.data.nickname + "当前用户头像地址:" + s.data.figureurl + "性别:" + s.data.gender + "");
//qqnickname = s.data.nickname;
//qqsex = s.data.gender;
}).error(function (f) {//指定接口访问失败的接收函数,f为失败返回Response对象
//失败回调
alert("获取用户信息失败!");
}).complete(function (c) {//指定接口完成请求后的接收函数,c为完成请求返回Response对象
//完成请求回调
qqnickname = c.data.nickname;
qqsex = c.data.gender;
//alert("openId:用户身份的唯一标识。建议保存在本地,以便用户下次登录时可对应到其之前的身份信息,不需要重新授权。值为:" + openId + " accessToken:表示当前用户在此网站/应用的登录状态与授权信息,建议保存在本地。值为:" + accessToken);
openid = openId;
accesstoken = accessToken;
//这里可以调用自己的保存接口
//alert("openid:"+openid +"accesstoken"+ accesstoken +"昵称:"+ qqnickname +"性别:"+ qqsex);
//判断当前登录的QQ用户是否已经绑定,已经绑定则直接跳转至个人中心,未绑定则保存记录
$.ajax({
type: "POST",
url: "CheckQQ.ashx",
data: { "Command": "QQSave", "openId": openid, "accessToken": accesstoken, "QQNickName": qqnickname, "QQSex": qqsex },
error: function (data) { alert("" + data + "") },
success: function (data) {
if (data == "Bound") {
location.href = "/Home/Default.aspx";
} else if (data == "UserNOFail") {//账号异常,未查询到
alert("没有与此QQ绑定的账号!");
location.href = "/home/Register.aspx";
} else if (data == "ParmNull") {//QQ登录参数有空值
alert("请重新登录QQ");
QC.Login.signOut();
location.reload();
} else if (data == "saveSuccess"|| data=="WaitBind") {//等待绑定
location.href = "/home/QQBind.aspx";
}
},
async: true,
dataType: "text"
});
});
});
}
}
//调用QC.Login方法,指定btnId参数将按钮绑定在容器节点中
QC.Login({
//btnId:插入按钮的节点id,必选
btnId: "qqlogin",
//用户需要确认的scope授权项,可选,默认all
scope: "all",
//按钮尺寸,可用值[A_XL| A_L| A_M| A_S| B_M| B_S| C_S],可选,默认B_S
size: "B_M"
},function (reqData, opts) {//登录成功
//根据返回数据,更换按钮显示状态方法
QQLoginTrue();
var dom = document.getElementById(opts['btnId']),
_logoutTemplate = [
//头像 '<span><img src="{figureurl}" class="{size_key}"/></span>',
//昵称
'<span>{nickname}</span> | ',
//退出
'<span style="cursor:pointer" οnclick="javascript:QC.Login.signOut();">退出</span>'
].join("");
dom && (dom.innerHTML = QC.String.format(_logoutTemplate, {nickname: QC.String.escHTML(reqData.nickname), //做xss过滤
figureurl: reqData.figureurl
}));
},function (opts) {//注销成功
location.reload();
}
);
登录返回页 QQLoginBack.aspx
QQLoginBack.aspx页面是登录返回页,这个页面上引用上官方js,其中data-callback属性设为true,会关闭模拟窗口,然后返回原始页。
这样选择用户登录后,模拟窗口后关闭,然后返回Login.aspx页面,此时login.aspx页面上的js会判断是否已经登录,登录成功后会执行你要的操作。
我上面的js里判断登录成功后获取用户信息,会去查询是否与此网站绑定过,如果没有绑定过,会跳转另外一个页面去绑定QQ,如果绑定过,就会直接登录成功,然后转入个人中心。