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": "" }