360SDK登錄服務(wù)

2018-10-10 10:02 更新

1.初始化接口【客戶端調(diào)用】(必接)


    在應(yīng)用主Activity中,使用Matrix的init方法(注:一定要在主線程調(diào)用

public static void init(final Activity activity)
用于初始化360SDK,在應(yīng)用主Activity的onCreate()函數(shù)中必須調(diào)用1次該方法,否則360SDK處于未初始化狀態(tài),無(wú)法使用其他接口。
當(dāng)360SDK處于未初始化狀態(tài)時(shí),調(diào)用其任何接口都會(huì)返回錯(cuò)誤,錯(cuò)誤碼為-101。
參數(shù):
activity activity對(duì)象
使用例子:
Matrix.init(this);

 


2.登錄授權(quán)流程


    360開放平臺(tái)的登錄流程使用Oauth2協(xié)議標(biāo)準(zhǔn)授權(quán)流程。

 

登錄流程

    1. 應(yīng)用客戶端調(diào)用SDK進(jìn)行登錄 (見本章的接口介紹);

    2. 360SDK與360 服務(wù)器通信進(jìn)行用戶登錄,返回登錄結(jié)果及用戶信息;

    3. 360SDK把登錄結(jié)果返給應(yīng)用客戶端,登錄完成。

 

注意事項(xiàng)

    1. 360SDK登錄接口返回的用戶信息中沒(méi)有qid。如果游戲想要獲取qid,需要通過(guò)應(yīng)用服務(wù)器端向360服務(wù)器端發(fā)起請(qǐng)求,用access token換取qid,具體調(diào)用方式見『獲取用戶信息接口』。

    2. 如果用戶重新登陸,會(huì)獲取到新的token,原token即失效。用戶若用同樣賬號(hào)在不同設(shè)備上登錄同一游戲, 只有最后一次登錄獲取的token是最終有效的。

    3. 調(diào)用任何其他需要登錄后才能調(diào)用的接口時(shí),如果360SDK未處于登錄狀態(tài),會(huì)直接返回錯(cuò)誤,錯(cuò)誤碼為-100。

    4. 調(diào)用注銷接口或銷毀接口會(huì)讓360SDK回到未登錄的狀態(tài)。



3.接口介紹


3.1 登錄接口【客戶端調(diào)用】(必接)

功能說(shuō)明:

    展示登錄界面, 讓用戶登錄。若登錄成功,返回errno為0并帶有用戶信息。

    登錄成功返回結(jié)果,登錄失敗會(huì)停留在登錄界面,除非用戶按返回鍵取消登錄嘗試。

    注意:獲取用戶信息后,應(yīng)用需要保存自身賬號(hào)與360賬號(hào)的綁定關(guān)系。


接口示例:

    /**
     * 使用360SDK的登錄接口, 生成intent參數(shù)
     * 
     * @param isLandScape 是否橫屏顯示登錄界面
     */
    private Intent getLoginIntent(boolean isLandScape) {
Intent intent = new Intent(this, ContainerActivity.class);
    // 必需參數(shù),使用360SDK的登錄模塊
    intent.putExtra(ProtocolKeys.FUNCTION_CODE,
ProtocolConfigs.FUNC_CODE_LOGIN);
// 可選參數(shù),360SDK界面是否以橫屏顯示,默認(rèn)為true,橫屏
intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
    isLandScape);
    //可選參數(shù),是否顯示關(guān)閉按鈕,默認(rèn)不顯示
    intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON,
getCheckBoxBoolean(R.id.isShowClose));
    // 可選參數(shù),是否支持離線模式,默認(rèn)值為false
    intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE,
getCheckBoxBoolean(R.id.isSupportOffline));
    // 可選參數(shù),是否在自動(dòng)登錄的過(guò)程中顯示切換賬號(hào)按鈕,默認(rèn)為false
    intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,
getCheckBoxBoolean(R.id.isShowSwitchButton));
    // 可選參數(shù),是否隱藏歡迎界面
    intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME,
getCheckBoxBoolean(R.id.isHideWellcome));
  /*
 * 指定界面背景(可選參數(shù)):
 *  1.ProtocolKeys.UI_BACKGROUND_PICTRUE 使用的系統(tǒng)路徑,如/sdcard/1.png
 *  2.ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS 使用的assest中的圖片資源,
 *    如傳入bg.png字符串,就會(huì)在assets目錄下加載這個(gè)指定的文件
 *  3.圖片大小不要超過(guò)5M,尺寸不要超過(guò)1280x720,后綴只能是jpg、jpeg或png
 */
// 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑
intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE, getUiBackgroundPicPath());
// 可選參數(shù),指定assets中的圖片路徑,作為背景圖
intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,
                    getUiBackgroundPathInAssets());
// 可選參數(shù),是否需要用戶輸入激活碼,用于游戲內(nèi)測(cè)階段。
// 如果不需激活碼相關(guān)邏輯,客戶傳false或者不傳入該參數(shù)。
intent.putExtra(ProtocolKeys.NEED_ACTIVATION_CODE,
getCheckBoxBoolean(R.id.isNeedActivationCode));
 
    //-- 以下參數(shù)僅僅針對(duì)自動(dòng)登錄過(guò)程的控制
    // 可選參數(shù),自動(dòng)登錄過(guò)程中是否不展示任何UI,默認(rèn)展示。
    intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI,
getCheckBoxBoolean(R.id.isAutoLoginHideUI));
    // 可選參數(shù),靜默自動(dòng)登錄失敗后是否顯示登錄窗口,默認(rèn)不顯示
    intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,
getCheckBoxBoolean(R.id.isShowDlgOnFailedAutoLogin));
    // 社交分享測(cè)試參數(shù),發(fā)布時(shí)要去掉,具體說(shuō)明見分享接口
// intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG, 
//                   getCheckBoxBoolean(R.id.isDebugSocialShare));
    return intent;
}
// 調(diào)用接口
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);
}


返回?cái)?shù)據(jù)格式:

非離線模式下返回的數(shù)據(jù)格式:

{
    "data": {
        "expires_in": "36000",
        "scope": "",
        "refresh_token": "",
        "access_token": "6461171100c3bfa3cba24cc332d7d78b311d2bf590f4877c9" // token
    },
    "errno": 0
}

離線模式下返回的數(shù)據(jù)格式:

{
 data: {
  mode: "offline" // mode 值為offline代表進(jìn)入離線模式
 },
 errno: 1 // errno 值為1
}


callback示例:

// 登錄接口回調(diào)(不支持離線模式)
// 登錄、注冊(cè)的回調(diào)
privateIDispatcherCallback mLoginCallback = newIDispatcherCallback() {
 
    @Override
    publicvoid onFinished(String data) {
            // press back
            if (isCancelLogin(data)) {
                return;
            }
            // 顯示一下登錄結(jié)果
            Toast.makeText(SdkUserBaseActivity.this, data, Toast.LENGTH_LONG).show();
            mIsInOffline = false;
            mQihooUserInfo = null;
            // 解析access_token
            mAccessToken = parseAccessTokenFromLoginResult(data);
 
            if (!TextUtils.isEmpty(mAccessToken)) {
// 需要去應(yīng)用的服務(wù)器獲取用access_token獲取一下用戶信息
                getUserInfo();
            } else {
                Toast.makeText(SdkUserBaseActivity.this, "get access_token failed!",
  Toast.LENGTH_LONG).show();
            }
 
    }
};
 
// 登錄結(jié)果回調(diào)(支持離線模式)
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;
                // 顯示一下登錄結(jié)果
                Toast.makeText(SdkUserBaseActivity.this, data,
                    Toast.LENGTH_LONG).show();
            } else {
                mLoginCallback.onFinished(data);
            }
        } catch (Exception e) {
            Log.e(TAG, "mLoginCallbackSupportOffline exception", e);
        }
    }
};


3.2 切換賬號(hào)接口【客戶端調(diào)用】

功能說(shuō)明:

    游戲方需要在游戲的菜單中添加“切換賬號(hào)”的入口,方便用戶切換賬號(hào)。

    應(yīng)用調(diào)用360SDK切換賬號(hào)接口, 360SDK顯示登錄頁(yè)面,用戶可更換賬號(hào)進(jìn)行登錄。之后的登錄流程和返回結(jié)果與登錄接口一樣。


示例代碼:

/**
     * 使用360SDK的切換賬號(hào)接口
     * 
     * @param isLandScape 是否橫屏顯示登錄界面
     */
protected void doSdkSwitchAccount(boolean isLandScape) {
Intent intent = getSwitchAccountIntent(isLandScape);
Matrix.invokeActivity(this, intent, mAccountSwitchCallback);
}


intent參數(shù)說(shuō)明:

    除FUNCTION_CODE外,其他同登錄接口

intent.putExtra(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT);


callback的 json格式說(shuō)明:

同登錄接口

 

3.3 獲取用戶信息【服務(wù)端調(diào)用】(選接)

    應(yīng)用服務(wù)端獲取access token后, 可調(diào)用360開放平臺(tái)服務(wù)器端接口/user/me, 獲取360用戶id以及其它用戶信息.

    接口地址為 https://openapi.#/user/me

    獲取用戶信息后,應(yīng)用需要保存游戲自身賬號(hào)與360用戶id(請(qǐng)務(wù)必使用360用戶id,只有360用戶id具有唯一標(biāo)識(shí)性)的綁定關(guān)系。并且妥善保存用戶信息留待以后使用.

參數(shù)說(shuō)明:

參數(shù)

必選

參數(shù)說(shuō)明

access_token

Y

授權(quán)的access token

fields

N

允許應(yīng)用自定義返回字段,多個(gè)屬性之間用英文半角逗號(hào)作為分隔符。不傳遞此參數(shù)則缺省返回id,name,avatar


返回參數(shù):

參數(shù)

必選

參數(shù)說(shuō)明

id

Y

360用戶ID, 用戶唯一標(biāo)識(shí),缺省返回

name

Y

360用戶名, 缺省返回

avatar

Y

360用戶頭像, 缺省返回

sex

N

360用戶性別,僅在fields中包含時(shí)候才返回,返回值為:男,女或者未知

area

N

360用戶地區(qū),僅在fields中包含時(shí)候才返回

nick

N

用戶昵稱,無(wú)值時(shí)候返回空


請(qǐng)求示例:

https://openapi.#/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": ""
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)