Skip to main content

登录接入

客户端登录接入

以下步骤紧接步骤五

步骤六:添加回调处理

需添加 AuthResultObserverLIEventObserver 回调来处理登录的事件。

回调数据结构为 FINTLAuthResult,其中包含登录信息和账号信息,例如 OpenID、账号绑定信息和账号注销状态。

// Add callbacks
AuthResultObserver = UINTLSDKAPI::GetAuthResultObserver().AddUObject(this, &ULevelInfiniteWindow::OnAuthResult_Callback);
// Handle AuthResultObserver callback result
void ULevelInfiniteWindow::OnAuthResult_Callback(FINTLAuthResult AuthResult)
{
if(AuthResult.MethodId == (int32)LIEnterGameMethodId::kLILoginEnterGame)
{
// LI Login success, enter the game here.
}
else if (AuthResult.MethodId == (int32)LIEnterGameMethodId::kLIBindEnterGame)
{
// Bind social account success inside the game
}
}

// Add callbacks
FDelegateHandle LIEventObserver;
LIEventObserver = ULevelInfiniteAPI::GetEventDelegate().AddUObject(this, &ULevelInfiniteWindow::OnLIEvent_Callback);

// Handle LIEventObserver callback result
void ULevelInfiniteWindow::OnLIEvent_Callback(FLIBaseEvent Event)
{
FString logStr;
switch(Event.EventType){
case ELIEventType::GN_READY:
{
break;
}
}
}

步骤七:完成登录流程

调用 LoginChannelWithLIPass 接口打开 LI PASS 登录组件,并指定玩家使用的登录渠道。

如果当前账号尚未关联 LI PASS,且玩家是第一次进入游戏,登录组件将显示关联 LI PASS 的用户界面。

ULevelInfiniteAPI::LoginChannelWithLIPass(EINTLLoginChannel::kChannelPlayStation);

步骤八:配置第三方渠道信息

LI Pass 支持多个主机端第三方渠道:

PlayStation

Nintendo Switch

Xbox Series X|S 和 WinGDK

后台登录接入

请参考 接入概览中的 后台接入

游戏内绑定相关接口说明

(一)游戏内绑定流程必须在登录完成后才可以开始执行,务必保证先完成登录流程。

(二)游戏内绑定流程

1、调用查询绑定状态接口,如果查询到当前账号未绑定LI账号则打开游戏内绑定界面

  • 查询绑定状态接口: UINTLSDKAPI::QueryBindInfo()
  • 打开游戏内绑定界面接口: ULevelInfiniteAPI::OpenBindAccount()
  • 回调处理:
//添加回调监听
AuthResultObserver = UINTLSDKAPI::GetAuthResultObserver().AddUObject(this, &UFloatingSidebar::OnAuthResult_Callback);

//移除回调监听
UINTLSDKAPI::GetAuthResultObserver().Remove(AuthResultObserver);

//点击游戏内绑定按钮时,查询绑定状态
void UFloatingSidebar::OnConsoleBindAccountButtonClicked()
{
UE_LOG(LogTemp, Log, TEXT("OnConsoleBindAccountButtonClicked"));
FINTLAuthResult AuthResult;
if (UINTLSDKAPI::GetAuthResult(AuthResult))
{
// 查询账号绑定状态
UINTLSDKAPI::QueryBindInfo();
} else {
UE_LOG(LogTemp, Log, TEXT("Need login first!"));
}
}

//查询绑定状态回调处理
void UFloatingSidebar::OnAuthResult_Callback(FINTLAuthResult AuthResult)
{
if(AuthResult.MethodId == (int32)LIMethodId::kLIQueryBindInfo) {
if(AuthResult.RetCode == INTL_NAMESPACE::ErrorCode::SUCCESS)
{
UE_LOG(LogTemp, Verbose, TEXT("LI query bind info success bindlist = %s"), *AuthResult.BindList);
TArray <TSharedPtr<FJsonValue>> bindInfoArray;
TSharedRef<TJsonReader<TCHAR>>jsonReader = TJsonReaderFactory<TCHAR>::Create(AuthResult.BindList);
bool isSucess = FJsonSerializer::Deserialize(jsonReader, bindInfoArray);
if (isSucess)
{
UE_LOG(LogTemp, Verbose, TEXT("LI query bind info format JsonObject success"));
bool haveBindLI = false;
FString liEmail;
for(int i = 0; i < bindInfoArray.Num(); i++) //遍历数组,查找LI渠道绑定关系
{
int32 channelId = bindInfoArray[i]->AsObject()->GetIntegerField("channelid");
FString email = bindInfoArray[i]->AsObject()->GetStringField("email");
if(channelId == (int32)EINTLLoginChannel::kChannelLevelInfinite) {
haveBindLI = true;
liEmail = email;
break;
}
}
if(!haveBindLI) {
// 当前账号未绑定 LI 账号,打开游戏内绑定界面
UE_LOG(LogTemp, Verbose, TEXT("UFloatingSidebar::OpenBindAccount"));
ULevelInfiniteAPI::OpenBindAccount();
} else {
UE_LOG(LogTemp, Verbose, TEXT("Account have bind LI!"));
}
} else {
UE_LOG(LogTemp, Warning, TEXT("LI query bind info format JsonObject failed"));
}
}else if (AuthResult.RetCode == INTL_NAMESPACE::ErrorCode::NETWORK_ERROR || AuthResult.RetCode == INTL_NAMESPACE::ErrorCode::TIMEOUT) {
// 网络问题,有必要的话可以尝试重试
UE_LOG(LogTemp, Warning, TEXT("LI query bind info failed, network error, ret_code = %d, ret_msg = %s"), AuthResult.RetCode, *AuthResult.RetMsg);
}else if (AuthResult.ThirdCode == (int32)LIThirdCode::kLITokenDisable || AuthResult.ThirdCode == (int32)LIThirdCode::kLITokenUnavailable || AuthResult.ThirdCode == (int32)LIThirdCode::kLITokenTimeOut) {
UE_LOG(LogTemp, Warning, TEXT("LI query bind info failed, token unavailable, ret_code = %d, ret_msg = %s"), AuthResult.RetCode, *AuthResult.RetMsg);
// 如果游戏内绑定 QueryBindInfo 的时候用户 token 失效,需要重新登录
}else {
UE_LOG(LogTemp, Warning, TEXT("LI query bind info failed, ret_code = %d, ret_msg = %s, third_code = %d, third_msg = %s"), AuthResult.RetCode, *AuthResult.RetMsg, AuthResult.ThirdCode, *AuthResult.ThirdMsg);
}
}
}

2、用户通过LI界面成功绑定LI账号后,可以通过监听 ELIEventType::CONSOLE_INGAME_BIND_COMPLETE 事件处理后续逻辑。

//添加 LIPass 事件监听
LIEventObserver = ULevelInfiniteAPI::GetEventDelegate().AddUObject(this, &UGameScreen::OnLIEvent_Callback);

//移除 LIPass 事件监听
ULevelInfiniteAPI::GetEventDelegate().Remove(LIEventObserver);

//游戏内绑定完成事件回调
void UGameScreen::OnLIEvent_Callback(FLIBaseEvent Event)
{
switch (Event.EventType) {
case ELIEventType::CONSOLE_INGAME_BIND_COMPLETE:
{
UE_LOG(LogTemp, Display, TEXT("LIPass console in game bind complete!"));
// Todo: 将焦点导航到游戏界面
break;
}
case ELIEventType::RESET_GAME_UI_FOCUS:
{
// Todo: 将焦点导航到游戏界面
break;
}
}
}