Skip to main content

Restore Withdrawn Account

This API restores an account during the withdrawal grace period.

URL Confirmation

This API uses the service-account.playnanoo.com domain.

API Information

  • URL: https://service-account.playnanoo.com/api/v20240401/withdrawal/restore
  • Method: PUT
  • Authentication Required: No

Request Parameters

ParameterTypeRequiredDescription
withdrawal_keystringRequiredWithdrawal key (issued when requesting withdrawal)
platformstringRequiredPlatform (e.g., "aos", "ios")
device_idstringRequiredDevice unique ID
device_modelstringRequiredDevice model name
device_osstringRequiredDevice OS
device_languagestringRequiredDevice language (e.g., "KO", "EN")

Response Data

Res Structure

FieldTypeDescription
StatusFStringStatus value

Unreal C++ Implementation

Header File (WithDrawalRestore.h)

// WithDrawalRestore.h
#pragma once

#include "CoreMinimal.h"
#include "Json.h"
#include "JsonUtilities.h"

// Response callback delegates
DECLARE_DELEGATE_OneParam(FOnWithDrawalRestoreSuccess, const FString&);
DECLARE_DELEGATE_OneParam(FOnWithDrawalRestoreError, const FString&);

class YOURPROJECT_API FWithDrawalRestore
{
public:
// Request struct (device info is automatically generated in FPlayNANOOHelper::CreateRequestBody())
struct FReq
{
FString withdrawal_key;
};

// Response struct
struct FRes
{
FString ErrorCode;
FString Message;
FString Status;

bool FromJson(const FString& JsonString)
{
TSharedPtr<FJsonObject> JsonObject;
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString);

if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
{
JsonObject->TryGetStringField(TEXT("ErrorCode"), ErrorCode);
JsonObject->TryGetStringField(TEXT("Message"), Message);
JsonObject->TryGetStringField(TEXT("Status"), Status);
return true;
}
return false;
}
};

/**
* Send account withdrawal cancellation request
*/
static void Send(
const FString& WithdrawalKey,
FOnWithDrawalRestoreSuccess OnSuccess,
FOnWithDrawalRestoreError OnError
);
};

Implementation File (WithDrawalRestore.cpp)

// WithDrawalRestore.cpp
#include "WithDrawalRestore.h"
#include "PlayNANOOHelper.h"
#include "Http.h"

void FWithDrawalRestore::Send(
const FString& WithdrawalKey,
FOnWithDrawalRestoreSuccess OnSuccess,
FOnWithDrawalRestoreError OnError)
{
// Create request data (device info is automatically included)
TSharedPtr<FJsonObject> JsonObject = FPlayNANOOHelper::CreateRequestBody();

// Add API-specific parameters
JsonObject->SetStringField(TEXT("withdrawal_key"), WithdrawalKey);

// Convert to JSON
FString JsonBody;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&JsonBody);
FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);

// Create HTTP request
TSharedRef<IHttpRequest> Request = FHttpModule::Get().CreateRequest();
Request->SetURL(TEXT("https://service-account.playnanoo.com/api/v20240401/withdrawal/restore"));
Request->SetVerb(TEXT("PUT"));
FPlayNANOOHelper::SetCommonHeaders(Request, false); // No authentication token needed
Request->SetContentAsString(JsonBody);

// Handle response
Request->OnProcessRequestComplete().BindLambda(
[OnSuccess, OnError](FHttpRequestPtr Req, FHttpResponsePtr Res, bool bSuccess)
{
if (bSuccess && Res.IsValid())
{
FString Response = Res->GetContentAsString();
FRes Result;
if (Result.FromJson(Response))
{
if (Result.ErrorCode.IsEmpty())
{
OnSuccess.ExecuteIfBound(Response);
}
else
{
OnError.ExecuteIfBound(Response);
}
}
else
{
OnError.ExecuteIfBound(TEXT("Failed to parse response"));
}
}
else
{
FString ErrorMsg = Res.IsValid() ? Res->GetContentAsString() : TEXT("Request failed");
OnError.ExecuteIfBound(ErrorMsg);
}
});

Request->ProcessRequest();
}

Usage Example

void UYourClass::RestoreWithdrawal(const FString& WithdrawalKey)
{
FWithDrawalRestore::Send(
WithdrawalKey,
FOnWithDrawalRestoreSuccess::CreateLambda([](const FString& Response)
{
FWithDrawalRestore::FRes Result;
if (Result.FromJson(Response))
{
UE_LOG(LogTemp, Log, TEXT("Account restoration completed: %s"), *Result.Status);
UE_LOG(LogTemp, Log, TEXT("You can now use the game normally."));
}
}),
FOnWithDrawalRestoreError::CreateLambda([](const FString& Error)
{
FWithDrawalRestore::FRes Result;
if (Result.FromJson(Error))
{
UE_LOG(LogTemp, Error, TEXT("Account restoration failed: [%s] [%s]"),
*Result.ErrorCode, *Result.Message);

if (Result.ErrorCode == TEXT("WITHDRAWAL_PERIOD_EXPIRED"))
{
UE_LOG(LogTemp, Error, TEXT("Grace period has expired, account cannot be restored."));
}
}
})
);
}
Getting WithdrawalKey

The withdrawal_key can be obtained when requesting withdrawal or through the token status check API. Recovery is only possible within the grace period; after the grace period expires, the account cannot be restored.