Skip to main content

Withdrawal Request

This API requests account withdrawal. The account is preserved 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/token/withdrawal
  • Method: PUT
  • Authentication Required: Yes

Request Parameters

ParameterTypeRequiredDescription
periodintRequiredWithdrawal grace period (in days)
account_tokenstringRequiredAccount token
memostringYesWithdrawal reason memo
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 (WithDrawal.h)

// WithDrawal.h
#pragma once

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

// Response callback delegates
DECLARE_DELEGATE_OneParam(FOnWithDrawalSuccess, const FString&);
DECLARE_DELEGATE_OneParam(FOnWithDrawalError, const FString&);

class YOURPROJECT_API FWithDrawal
{
public:
// Request struct (device info is automatically generated in FPlayNANOOHelper::CreateRequestBody())
struct FReq
{
int32 period;
FString account_token;
FString memo;
};

// 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 request
*/
static void Send(
int32 Period,
const FString& AccountToken,
const FString& Memo,
FOnWithDrawalSuccess OnSuccess,
FOnWithDrawalError OnError
);
};

Implementation File (WithDrawal.cpp)

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

void FWithDrawal::Send(
int32 Period,
const FString& AccountToken,
const FString& Memo,
FOnWithDrawalSuccess OnSuccess,
FOnWithDrawalError OnError)
{
// Create request data (device info is automatically included)
TSharedPtr<FJsonObject> JsonObject = FPlayNANOOHelper::CreateRequestBody();

// Add API-specific parameters
JsonObject->SetNumberField(TEXT("period"), Period);
JsonObject->SetStringField(TEXT("account_token"), AccountToken);
if (!Memo.IsEmpty())
{
JsonObject->SetStringField(TEXT("memo"), Memo);
}

// 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/token/withdrawal"));
Request->SetVerb(TEXT("PUT"));
FPlayNANOOHelper::SetCommonHeaders(Request, true); // Include authentication token
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::RequestWithdrawal(const FString& AccessToken, const FString& Reason)
{
FWithDrawal::Send(
7, // 7-day grace period
AccessToken,
Reason,
FOnWithDrawalSuccess::CreateLambda([](const FString& Response)
{
FWithDrawal::FRes Result;
if (Result.FromJson(Response))
{
UE_LOG(LogTemp, Log, TEXT("Account withdrawal request completed: %s"), *Result.Status);
UE_LOG(LogTemp, Log, TEXT("The account will be completely deleted after 7 days."));
}
}),
FOnWithDrawalError::CreateLambda([](const FString& Error)
{
UE_LOG(LogTemp, Error, TEXT("Account withdrawal request failed: %s"), *Error);
})
);
}
Withdrawal Grace Period

When you request withdrawal, the account is preserved for the specified grace period (period). You can cancel the withdrawal by logging in or calling the recovery API within the grace period. After the grace period expires, the account and all data will be permanently deleted.