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
| Parameter | Type | Required | Description |
|---|---|---|---|
| period | int | Required | Withdrawal grace period (in days) |
| account_token | string | Required | Account token |
| memo | string | Yes | Withdrawal reason memo |
| platform | string | Required | Platform (e.g., "aos", "ios") |
| device_id | string | Required | Device unique ID |
| device_model | string | Required | Device model name |
| device_os | string | Required | Device OS |
| device_language | string | Required | Device language (e.g., "KO", "EN") |
Response Data
Res Structure
| Field | Type | Description |
|---|---|---|
| Status | FString | Status 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.