# 3. 账号体系

# 3.1 功能介绍

快手账号服务为开发者提供了简单、安全、快速的账号登录授权功能,为用户免去输入账号密码的繁琐步骤,一键通过快手账号授权,即刻体验您的游戏。
在取得用户授权之后,开发者可以通过接口调用的方式获得快手用户的相关公开信息,包括用户昵称、头像等信息。

# 前端样式

# 登录授权

快手联运SDK 会根据用户设备中安装快手客户端的情况,来自动选择使用合适的登录流程。

# 唤起快手客户端授权登录​

如果快手联运SDK检测到用户设备中已经安装了快手客户端,当用户单击快手登录按钮时,会自动唤起设备中的快手客户端,并识别客户端中的登录信息,进行授权登录。

# H5 授权登录

如果快手联运SDK 检测到用户设备中没有安装快手客户端,会自动展示快手授权的H5 界面,用户输入手机号+验证码后,会自动注册快手账号。

# 3.2 整体流程

''

WARNING

注: game_id为AccountMode返回的sdkUserId
注: token为AccountMode返回的sdkToken

# 3.3 开发指南

# 3.3.1 初始化以及生命周期(重要,必须)

仅对需要加入游戏的代码,不包括主动调用的功能
在application设置参数之后,初始化联运SDK,不进行初始化会导致整个功能异常,如果不在 application初始化,可能会导致崩溃。

KwaiAppInfo info = new KwaiAppInfo();
//TODO AppId 必填  需要设置你们自己的AppId 
info.setAppId("ks685673047210945076");
//TODO 应用名称
info.setAppName("斗地主 Demo");
//TODO 是否允许游客登陆, 默认不允许 , 原来有游客登录的游戏SDK更新必改为(true);
info.setAllowTourist(false);
//TODO 正常情况下必须要调用,如果调用登陆接口没有返回失败,也无法弹出登陆弹窗时,可尝试修改此标志为true;
info.setUserPopup(false)
//TODO:  隐私协议同意之前sdk不会有网络请求,默认使用sdk的隐私弹窗
//若需要使用自己的隐私协议,修改此标志为false
info.setUseSdkPrivacyDialog(false) 
    KwaiSdkInitConfig config = new KwaiSdkInitConfig()
    .setApplication(this)
    .setAppInfo(info)
    .setInitListener(new KwaiInitListener() {

        @Override
        public void onSuccess(String channel) {

        }

        @Override
        public void onError(String msg) {

        }
    });
KwaiSdk.init(config);

sdk依赖游戏的生命周期,所以需要设置下面调用,每个界面都需要设置,不设置可能导致功能异常。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  KwaiSdk.onActivityResult(this, requestCode, resultCode, data);
}
@Override
public void onNewIntent(Intent newIntent) {
  super.onNewIntent(newIntent);
  KwaiSdk.onNewIntent(this, newIntent);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  KwaiSdk.onConfigurationChanged(this, newConfig);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  KwaiSdk.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}

需要在游戏隐私协议通过之后调用此接口,不调用会导致功能异常。 推荐在游戏主界面调用,因为此接口之后会申请权限,或者游戏可以自己在隐私之后申请sdk所需权限然后在调用sdk接口。

KwaiSdk.setPrivacyAgree();

除了主动调用sdk的接口,还需要处理sdk的回调 , 不设置会导致防沉迷,用户中心切换账号功能异常。

/**
* TODO 设置全局回掉  必须传入  否则会导致功能不正常
*/
private final KwaiSdkCallback SDK_CALLBACK = new KwaiSdkCallback() {
/**
    * @param userclick 是否点击 使用sdk弹窗时候 会有回掉通知cp
    * 隐私弹窗
    */
@Override
public void onPrivacyAgree(boolean userclick) {
    //第一次为true, 后续都为false,如果使用sdk的隐私,需要在此后在进入游戏
}

/**
    * 强制登出
    * 建议游戏在此处理为 游戏先登出,然后调用SDK登出 然后调用登陆打开登陆界面
    * 防沉迷回走此功能回调
    */
@Override
public void forceLogout() {
    //TODO 有序需要处理游戏本身的登出 
    //TODO 处理完成游戏的登出之后 在调用一下代码。
    KwaiSdk.logoff(new OnLogoffResultListener() {
    @Override
    public void onSuccess() {
        login();
    }

    @Override
    public void onFail(int errorCode) {}
    });
}

/**
    * 切换账号  用户中心点击 切换账号回掉
    * 建议游戏在此处理为 游戏先登出,然后调用 sdk登出,最后调用登陆打开登陆界面
    */
@Override
public void switchAccount() {
    //TODO 首先需要处理游戏本身的登出
    //TODO 处理完成游戏的登出之后 在调用一下代码。

    KwaiSdk.logoff(new OnLogoffResultListener() {
    @Override
    public void onSuccess() {
        Log.e(TAG, "login status : " + KwaiSdk.isLoginSuccess());
        login();
    }

    @Override
    public void onFail(int errorCode) {}
    });
}
};

# 3.3.2 登录

KwaiSdk.login(new OnLoginResultListener() {
    @Override
    public void onSuccess(AccountModel accountModel) {
        //accountModel.getSdkUserId 游戏主要关注这个用户id
        //KwaiSdk.getGameToken() 游戏主要关注这个token,登陆成功调用该api
    }

    @Override
    public void onFail(int errorCode) {
    // 此方法可以得到对应的message
    // KwaiErrorCode.getErrorMsg(errorCode, ""); 
    }
});

# 3.3.3 获取用户信息并校验token

接口地址:中台域名/game/user_info/v2?app_id=xxxx&game_id=xxxx&game_token=xxxx
方法:GET
参数说明:

字段名 说明
app_id 游戏app 在快手游戏的唯一身份标识
game_id 分配给游戏的用户Id
game_token 用户的登录令牌, 登陆成功后KwaiSdk.getGameToken()返回

TIP

*请求时会做token校验。

返回:
格式:application/json
返回字段说明:

字段名 说明
result 成功 1
game_id 分配给游戏的用户Id,游戏用户的唯一id, 强烈建议使用该id做数据关联
user_name 用户名,游客账号会是 “游客abde” 样式的不重复随机串
user_head 头像 URL,已绑定的会是快手头像,未绑定是一个默认头像
user_gender 性别,游客为空
anonymous 标识当前是否是游客
certificated 是否已通过了实名认证
user_bighead 用户大头像信息
user_city 用户区域信息
ks_openid 快手openId 渠道用户附加信息
age 年龄,必传非空项,默认值 0
adult 是否成年,必传非空项,默认值 false
uid 中台的自增用户id 对应上面game_id, 不全局唯一,后续接口将陆续不再返回,不建议使用
unionID 无需关注
bind_channel ["ks", "passport"] 绑定的账号渠道
ks:快手
passport:独立手机号
ysdk:应用宝
qq:QQ
wechat:微信

# 3.3.4 登出

KwaiSdk.logoff(new OnLogoffResultListener() {
    @Override
    public void onSuccess() {
        //TODO 登出成功,登出之后可以调用一下登陆 出现登陆弹窗,游戏自行决定
        Log.e(TAG, "login status : " + KwaiSdk.isLoginSuccess());
        login();
    }

    @Override
    public void onFail(int errorCode) {}
});

# 3.3.5单校验用户Token

接口地址:中台域名/game/user_info/v2?app_id=xxxx&game_id=xxxx&game_token=xxxx
方法:GET
参数说明:

字段名 说明
app_id 游戏app 在快手游戏的唯一身份标识
game_id 分配给游戏的用户Id
game_token 用户的登录令牌

返回:
格式:application/json
返回字段说明:

字段名 格式
result 成功 1

# 3.4 FAQ

# 3.4.1 登陆失败会返回错误码,登陆相关的错误码如下

code 描述
-10000 重复操作 (比如正在登陆中再次调用登陆接口)
-10004 用户主动取消登陆
-10007 没有找到前台acitivity (确认application中是否初始化sdk, 确认是否在activity的onStart状态之后调用的登陆,或support或者androidx的lifecycle接入不正常)
-10008 重复登陆(登陆状态下 再次调用登陆)
-10009 重复登出(未登陆状态下再次调用登出)
100200101 非法的app , 可能出现在快手app授权登陆,和手机号授权登陆, 出现这种情况,请确认appId, app签名以及包名是否和后台配置的一致
6002/6001 快手授权登陆时候返回此错误码,代表快手账号登陆状态异常,可以尝试重新登陆
-1001 登录身份异常
-1000 注册新角色失败(此问题在v1.4.2.183版本已修复)
-100300101 未实名导致登陆失败
-100300100 触发防沉迷政策导致登陆失败

# 3.4.2 快手授权或者手机号登陆授权返回错误码 100200101

{''result'':100200101,''error'':''unauthorized_client''.''error_msg'':''invalid appId''}

# 3.4.3 短信验证码登录输入正确却提示:验证输入错误

KwaiSdk网络请求是基于okhttp实现的,如果缺少publicsuffixex.gz文件会导致一些网络问题。
直接引入KwaiSdk.aar一般不会有问题,如果开发者使用IDE比较老或者一些其他原因需要把aar拆解手动引入,有可能会因遗漏相关文件导致网络请求问题。
解决方案 参考文档:publicsuffix文件缺失