360SDK登录服务
1.初始化接口【客户端调用】(必接)
在应用主Activity中,使用Matrix的init方法(注:一定要在主线程调用)
public static void init(final Activity activity) 用于初始化360SDK,在应用主Activity的onCreate()函数中必须调用1次该方法,否则360SDK处于未初始化状态,无法使用其他接口。 当360SDK处于未初始化状态时,调用其任何接口都会返回错误,错误码为-101。 参数: activity activity对象 使用例子: Matrix.init(this);
2.登录授权流程
360开放平台的登录流程使用Oauth2协议标准授权流程。
登录流程
1. 应用客户端调用SDK进行登录 (见本章的接口介绍);
2. 360SDK与360 服务器通信进行用户登录,返回登录结果及用户信息;
3. 360SDK把登录结果返给应用客户端,登录完成。
注意事项
1. 360SDK登录接口返回的用户信息中没有qid。如果游戏想要获取qid,需要通过应用服务器端向360服务器端发起请求,用access token换取qid,具体调用方式见『获取用户信息接口』。
2. 如果用户重新登陆,会获取到新的token,原token即失效。用户若用同样账号在不同设备上登录同一游戏, 只有最后一次登录获取的token是最终有效的。
3. 调用任何其他需要登录后才能调用的接口时,如果360SDK未处于登录状态,会直接返回错误,错误码为-100。
4. 调用注销接口或销毁接口会让360SDK回到未登录的状态。
3.接口介绍
3.1 登录接口【客户端调用】(必接)
功能说明:
展示登录界面, 让用户登录。若登录成功,返回errno为0并带有用户信息。
登录成功返回结果,登录失败会停留在登录界面,除非用户按返回键取消登录尝试。
注意:获取用户信息后,应用需要保存自身账号与360账号的绑定关系。
接口示例:
/**
* 使用360SDK的登录接口, 生成intent参数
*
* @param isLandScape 是否横屏显示登录界面
*/
private Intent getLoginIntent(boolean isLandScape) {
Intent intent = new Intent(this, ContainerActivity.class);
// 必需参数,使用360SDK的登录模块
intent.putExtra(ProtocolKeys.FUNCTION_CODE,
ProtocolConfigs.FUNC_CODE_LOGIN);
// 可选参数,360SDK界面是否以横屏显示,默认为true,横屏
intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
isLandScape);
//可选参数,是否显示关闭按钮,默认不显示
intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON,
getCheckBoxBoolean(R.id.isShowClose));
// 可选参数,是否支持离线模式,默认值为false
intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE,
getCheckBoxBoolean(R.id.isSupportOffline));
// 可选参数,是否在自动登录的过程中显示切换账号按钮,默认为false
intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,
getCheckBoxBoolean(R.id.isShowSwitchButton));
// 可选参数,是否隐藏欢迎界面
intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME,
getCheckBoxBoolean(R.id.isHideWellcome));
/*
* 指定界面背景(可选参数):
* 1.ProtocolKeys.UI_BACKGROUND_PICTRUE 使用的系统路径,如/sdcard/1.png
* 2.ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS 使用的assest中的图片资源,
* 如传入bg.png字符串,就会在assets目录下加载这个指定的文件
* 3.图片大小不要超过5M,尺寸不要超过1280x720,后缀只能是jpg、jpeg或png
*/
// 可选参数,登录界面的背景图片路径,必须是本地图片路径
intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE, getUiBackgroundPicPath());
// 可选参数,指定assets中的图片路径,作为背景图
intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,
getUiBackgroundPathInAssets());
// 可选参数,是否需要用户输入激活码,用于游戏内测阶段。
// 如果不需激活码相关逻辑,客户传false或者不传入该参数。
intent.putExtra(ProtocolKeys.NEED_ACTIVATION_CODE,
getCheckBoxBoolean(R.id.isNeedActivationCode));
//-- 以下参数仅仅针对自动登录过程的控制
// 可选参数,自动登录过程中是否不展示任何UI,默认展示。
intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI,
getCheckBoxBoolean(R.id.isAutoLoginHideUI));
// 可选参数,静默自动登录失败后是否显示登录窗口,默认不显示
intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,
getCheckBoxBoolean(R.id.isShowDlgOnFailedAutoLogin));
// 社交分享测试参数,发布时要去掉,具体说明见分享接口
// intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG,
// getCheckBoxBoolean(R.id.isDebugSocialShare));
return intent;
}
// 调用接口
protected void doSdkLogin(boolean isLandScape) {
mIsInOffline = false;
Intent intent = getLoginIntent(isLandScape);
IDispatcherCallback callback = mLoginCallback;
if (getCheckBoxBoolean(R.id.isSupportOffline)) {
callback = mLoginCallbackSupportOffline;
}
Matrix.execute(this, intent, callback);
}返回数据格式:
非离线模式下返回的数据格式:
{
"data": {
"expires_in": "36000",
"scope": "",
"refresh_token": "",
"access_token": "6461171100c3bfa3cba24cc332d7d78b311d2bf590f4877c9" // token
},
"errno": 0
}离线模式下返回的数据格式:
{
data: {
mode: "offline" // mode 值为offline代表进入离线模式
},
errno: 1 // errno 值为1
}callback示例:
// 登录接口回调(不支持离线模式)
// 登录、注册的回调
privateIDispatcherCallback mLoginCallback = newIDispatcherCallback() {
@Override
publicvoid onFinished(String data) {
// press back
if (isCancelLogin(data)) {
return;
}
// 显示一下登录结果
Toast.makeText(SdkUserBaseActivity.this, data, Toast.LENGTH_LONG).show();
mIsInOffline = false;
mQihooUserInfo = null;
// 解析access_token
mAccessToken = parseAccessTokenFromLoginResult(data);
if (!TextUtils.isEmpty(mAccessToken)) {
// 需要去应用的服务器获取用access_token获取一下用户信息
getUserInfo();
} else {
Toast.makeText(SdkUserBaseActivity.this, "get access_token failed!",
Toast.LENGTH_LONG).show();
}
}
};
// 登录结果回调(支持离线模式)
private IDispatcherCallback mLoginCallbackSupportOffline
= new IDispatcherCallback() {
@Override
public void onFinished(String data) {
if (isCancelLogin(data)) {
return;
}
Log.d(TAG, "mLoginCallbackSupportOffline, data is " + data);
try {
JSONObject joRes = new JSONObject(data);
JSONObject joData = joRes.getJSONObject("data");
String mode = joData.optString("mode", "");
if (!TextUtils.isEmpty(mode) && mode.equals("offline")) {
Toast.makeText(SdkUserBaseActivity.this,
"login success in offline mode",
Toast.LENGTH_SHORT).show();
mIsInOffline = true;
// 显示一下登录结果
Toast.makeText(SdkUserBaseActivity.this, data,
Toast.LENGTH_LONG).show();
} else {
mLoginCallback.onFinished(data);
}
} catch (Exception e) {
Log.e(TAG, "mLoginCallbackSupportOffline exception", e);
}
}
};3.2 切换账号接口【客户端调用】
功能说明:
游戏方需要在游戏的菜单中添加“切换账号”的入口,方便用户切换账号。
应用调用360SDK切换账号接口, 360SDK显示登录页面,用户可更换账号进行登录。之后的登录流程和返回结果与登录接口一样。
示例代码:
/**
* 使用360SDK的切换账号接口
*
* @param isLandScape 是否横屏显示登录界面
*/
protected void doSdkSwitchAccount(boolean isLandScape) {
Intent intent = getSwitchAccountIntent(isLandScape);
Matrix.invokeActivity(this, intent, mAccountSwitchCallback);
}intent参数说明:
除FUNCTION_CODE外,其他同登录接口
intent.putExtra(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT);
callback的 json格式说明:
同登录接口
3.3 获取用户信息【服务端调用】(选接)
应用服务端获取access token后, 可调用360开放平台服务器端接口/user/me, 获取360用户id以及其它用户信息.
接口地址为 https://openapi.360.cn/user/me
获取用户信息后,应用需要保存游戏自身账号与360用户id(请务必使用360用户id,只有360用户id具有唯一标识性)的绑定关系。并且妥善保存用户信息留待以后使用.
参数说明:
参数 | 必选 | 参数说明 |
access_token | Y | 授权的access token |
fields | N | 允许应用自定义返回字段,多个属性之间用英文半角逗号作为分隔符。不传递此参数则缺省返回id,name,avatar |
返回参数:
参数 | 必选 | 参数说明 |
id | Y | 360用户ID, 用户唯一标识,缺省返回 |
name | Y | 360用户名, 缺省返回 |
avatar | Y | 360用户头像, 缺省返回 |
sex | N | 360用户性别,仅在fields中包含时候才返回,返回值为:男,女或者未知 |
area | N | 360用户地区,仅在fields中包含时候才返回 |
nick | N | 用户昵称,无值时候返回空 |
请求示例:
https://openapi.360.cn/user/me.json?access_token=12345678983b38aabcdef387453ac8133ac3263987654321&fields=id,name,avatar,sex,area
返回示例:
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"id": "201459001",
"name": "360U201459001",
"avatar": "http://u1.qhimg.com/qhimg/quc/...ed6e9c53543903b",
"sex": "未知"
"area": ""
}