名词 | 描述 | 备注 |
---|---|---|
userId | 第三方账号id | |
loginToken | 暗账号登录临时凭证 | 有有效期,建议10分钟内有效 建议生成方法:由"userId+时间戳"加密后生成,使用AES256加密 |
openId | K歌暗账号id | openId与userId需要一一对应,不允许有一对多的关系 |
参数名 | 必选 | 说明 |
---|---|---|
Content-Type | 是 | 固定填 application/json |
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
appid | 是 | string | 应用appid |
token | 是 | string | 第三方授权token |
// 成功
{
"error_code": 0,
"error_msg": "",
"data": {
"user_id": 239120823449,
}
}
// 失败
{
"error_code": 1003,
"error_msg": "Expired"
}
参数名 | 类型 | 说明 |
---|---|---|
error_code | number | 错误码. 非0为失败 |
error_msg | string | error_code非0时的错误消息 |
data | Object | |
user_id | number | 暗账号ID |
user_sid | string | 暗账号ID(字符串型,部分应用支持.) |
错误码 | 说明 |
---|---|
0 | 成功 |
1001 | 系统异常 |
1002 | 参数异常 |
1003 | 授权过期 |
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
appid | 是 | string | 业务透传过来,应用appid |
id | 是 | number | 用户id,数字类型 |
sid | 是 | string | 用户字符串型id (与id只传一个. 使用字符串型id需要特殊申请) |
access_token | 是 | string | 应用的access_token |
{
"appid": "abc",
"access_token": "abc",
"id": 9238283,
}
// 成功
{
"error_code": 0,
"error_msg": "",
"openid": "xxxxx",
}
// 失败
{
"error_code": 3003,
"error_msg": "Sign check failed"
}
参数名 | 类型 | 说明 |
---|---|---|
openid | string | 对应账号的openid |
error_code | int | 错误码 |
error_msg | string | error_code非0时的错误消息 |
错误码 | 说明 |
---|---|
0 | 成功 |
1503 | 未知错误 |
3001 | 参数无效或者参数不完整 |
3003 | 签名错误(应用token校验失败) |
3019 | 暂不支持(应用无权限调用) |
接口 | 描述 |
---|---|
void hiddenAccountLogin(code: String, loginAPI: IKLoginAPI) | 暗帐号登录;code:loignToken,loginAPI:登录事件回调 |
void anonymouslyLogin(loginAPI: IKLoginAPI) | 游客态帐号登录;loginAPI:登录事件回调 |
void clearAccessToken() | 清除登录token |
void cancel(loginAPI: IKLoginAPI, isRelease: Boolean) | 取消登录,isRelease:是否取消登录事件监听,默认true |
void cancel(loginAPIs: ArrayList<IKLoginAPI?>, isRelease: Boolean) | 取消登录,同时取消多个登录监听 |
void loginOut() | 退出登录,同时会取消非持久性的登录监听 |
bindForever(loginAPI: IKLoginAPI) | 绑定持久化的SDK登录事件回调,在调用loginOut后也不会被取消,适用于需要全局监听登录状态的场景 |
isLogin() | 是否有有效的登录token,并不代表已登录 |
bind(loginAPI: IKLoginAPI) | 绑定SDK登录事件回调,在loginOut后此监听会被取消 |
object HiddenAccountLoginManager : IKLoginAPI {
private val mHandler = Handler(Looper.getMainLooper())
override fun dispatchLoginEvent(loginEvent: LoginEvent) {
Log.i("HiddenAccountLogin", "dispatchLoginEvent :$loginEvent")
when (loginEvent) {
is LoginEvent.LoginSuccess -> {
//登录成功
onLoginSuccess(loginEvent.loginParams, loginEvent.tokenInfo)
}
is LoginEvent.AlreadyLogin -> {
//已废弃,接入方无需关注;
//在已登录重新触发登录时会触发此回调,或者在已登录时通过sdk进行网络请求时也会触发此回调
}
is LoginEvent.RefreshTokenSuccess -> {
//在refresh_token有效时(默认一个月),sdk会在access_token失效时(默认两个小时)主动刷新token
//token刷新成功后回调,正常情况接入方也不需要关注
}
is LoginEvent.LoginError -> {
//登录监听最好是全局单例类, 登录失败有两种情况:
// 1。主动调用登录(loginEvent.activelylogin=true);
// 2。请求网络时接口token状态异常需要重新登录(loginEvent.activelyLogin=false)
//如果在登录期间有接口请求,接口请求时可能会触发token刷新,在token刷新不成功时会回调登录失败(activelylogin为false)。
// 为避免这种情况,可以判断如果正在登录,可忽略此类型的登录失败。
if((mIsLoginRunning.get() || mIsAnonymousLoginRunning.get()) && !loginParams.activelyLogin) {
Logger.i(TAG, "login is running, ignore LoginError by activelyLogin(false)")
return
}
//暗帐号或者游客态登录失败,接入方可以做少量重试操作,具体错误码定义见文档
val code = loginEvent.exception?.errorCode?: -1
val msg = loginEvent.exception?.throwable?.message
mHandler.post {
Toast.makeText(
HostApp.getApp,
"登录失败: 错误码:$code ,错误信息: $msg",
Toast.LENGTH_SHORT
).show()
}
//以下是具体的错误码示例
when (code) {
SDKLoginError.REFRESH_TOKEN_NULL -> {
//网络请求时,token失效了需要刷新token,但refresh_token也为空了,(比如已退出登录,或者多设备登录(40004),或者数据被清空了,导致刷新token为空)
//可以重新登录
KtvLoginService.hiddenAccountLogin("demo", "testCode", this)
}
SDKLoginError.REFRESH_TOKEN_EXPIRED -> {
//网络请求时,token失效了需要刷新token,但refresh_token过期了(比如超过一个月了)
//可以重新登录
KtvLoginService.hiddenAccountLogin("demo", "testCode", this)
}
SDKLoginError.REFRESH_TOKEN_ERROR_UNKNOWN -> {
//暗帐号请求刷新token接口失败
//可以重新登录试下,需要控制频次 不要一直重复
KtvLoginService.hiddenAccountLogin("demo", "testCode", this)
}
SDKLoginError.HIDDEN_ACCOUNT_LOGIN_FAIL -> {
//暗帐号登录 请求登录接口失败
//可以重新登录试下,需要控制频次 不要一直重复
KtvLoginService.hiddenAccountLogin("demo", "testCode", this)
}
SDKLoginError.ANONYMOUS_LOGIN_EXPIRED -> {
//游客态登录,但是token为空
//可以重新登录试下,需要控制频次 不要一直重复
KtvLoginService.anonymouslyLogin(this)
}
SDKLoginError.ANONYMOUS_LOGIN_FAIL -> {
//游客态登录,调用服务端接口失败,碰到40002错误码且sdk重试失败
//可以重新登录试下,需要控制频次 不要一直重复
KtvLoginService.anonymouslyLogin(this)
}
SDKLoginError.CANCEL -> {
//CANCEL事件(登录被取消),一般忽略即可
}
else -> {
Toast.makeText(
HostApp.getApp,
"登录失败: 错误码:$code ,错误信息: $msg",
Toast.LENGTH_SHORT
).show()
}
}
return
}
else -> {
}
}
}
//登录前清除旧token
//KtvLoginService.clearAccessToken()
//调用登录
//KtvLoginService.hiddenAccountLogin()
void anonymouslyLogin(loginAPI: IKLoginAPI)
- 游客态帐号登录;loginAPI:登录事件回调第三方账号登录开平虚拟账号(暗账号)
https://api.kg.qq.com/api/v2/virtual_login
https://api.kg.qq.com/test/api/v2/virtual_login
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
appid | 是 | string | 业务透传过来,应用appid |
token | 是 | string | 第三方授权token |
{
"appid": "abc",
"token": "sdjfkwejl",
}
// 成功
{
"error_code": 0,
"error_msg": "",
"openid": "xxxxx",
"access_token": "xxxxx",
"refresh_token": "xxxxx",
"expires_in": 7200,
}
// 失败
{
"error_code": 3003,
"error_msg": "Sign check failed"
}
参数名 | 类型 | 说明 |
---|---|---|
openid | string | 对应账号的openid |
access_token | string | 对应账号的access_token |
refresh_token | string | 对应账号的refresh_token |
expires_in | int | access token有效期 |
error_code | int | 错误码 |
error_msg | string | error_code非0时的错误消息 |
错误码 | 说明 |
---|---|
0 | 成功 |
1503 | 未知错误 |
3001 | 参数无效或者参数不完整 |