Unreal
ViveportSubscriptionDemo.h
#include "Components/ActorComponent.h"
#include "ViveportApi.h"
#include "ViveportSubscription.h"
#include "ViveportSubscriptionDemo.generated.h"
UCLASS( ClassGroup=(Viveport), meta=(BlueprintSpawnableComponent) )
class VIVEPORTSDK_API UViveportSubscriptionDemo : public UActorComponent
{
    GENERATED_BODY()
public:
    // Called when the game starts
    virtual void BeginPlay() override;
    void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
    /** The APP ID for auth verify */
    FString APP_ID = "76d0898e-8772-49a9-aa55-1ec251a21686";
    class MyIsReadyCallback : public ViveportApiStatus2
    {
    public:
        void OnSuccess(
            const FString& result
        ) override;
        void OnFailure(
            int errorCode,
            const FString& errorMessage
        ) override;
    };
private:
    // callback interface
    class MyViveportSubscriptionStatus : public ViveportApiStatus
    {
    protected:
        UViveportSubscriptionDemo* mDemo;
    public:
        void SetDemoPtr(UViveportSubscriptionDemo* p) { mDemo = p; }
    };
    class MySubscriptionInitCallback : public MyViveportSubscriptionStatus
    {
    public:
        void OnSuccess(
        ) override;
        void OnFailure(int error_code
        ) override;
    };
    MySubscriptionInitCallback mySubscriptionInitCallback;
    class MySubscriptionShutdownCallback : public MyViveportSubscriptionStatus
    {
    public:
        void OnSuccess(
        ) override;
        void OnFailure(int error_code
        ) override;
    };
    MySubscriptionShutdownCallback mySubscriptionShutdownCallback;
};ViveportSubscriptionDemo.cpp
#include "ViveportSDKPrivatePCH.h"
#include "ViveportSubscriptionDemo.h"
UViveportSubscriptionDemo::MyIsReadyCallback myIsReadyCallback;
// Called when the game starts
void UViveportSubscriptionDemo::BeginPlay()
{
    Super::BeginPlay();
    mySubscriptionInitCallback.SetDemoPtr(this);
    UViveportApi::Init(&mySubscriptionInitCallback, APP_ID);
}
void UViveportSubscriptionDemo::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    Super::EndPlay(EndPlayReason);
    // Call ViveportApi::Shutdown()
    UViveportApi::Shutdown(&mySubscriptionShutdownCallback);
}
/***************************************************************
*                                   MySubscriptionInitCallback
***************************************************************/
void UViveportSubscriptionDemo::MySubscriptionInitCallback::OnSuccess()
{
    FString fstring("Init success.");
    GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
    UViveportSubscription::IsReady(&myIsReadyCallback);
}
void UViveportSubscriptionDemo::MySubscriptionInitCallback::OnFailure(int error_code)
{
    FString fstring = FString::Printf(TEXT("Init failure. error=%d"), error_code);
    GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
}
/***************************************************************
*                                   MySubscriptionShutdownCallback
***************************************************************/
void UViveportSubscriptionDemo::MySubscriptionShutdownCallback::OnSuccess()
{
    UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][MySubscriptionShutdownCallback] Shutdown success."));
    FString fstring("Shutdown success.");
    GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
}
void UViveportSubscriptionDemo::MySubscriptionShutdownCallback::OnFailure(int error_code)
{
    UE_LOG(ViveportSDK, Error, TEXT("[UViveportSubscriptionDemo][MySubscriptionShutdownCallback] Shutdown failure. Error = %d"), error_code);
    FString fstring = FString::Printf(TEXT("Shutdown failure. error=%d"), error_code);
    GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
}
/***************************************************************
*                                   MyIsReadyCallback
***************************************************************/
void UViveportSubscriptionDemo::MyIsReadyCallback::OnSuccess(const FString& result)
{
    UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][MyIsReadyCallback] IsReady success."));
    FString fstring = FString::Printf(TEXT("Is ready success"));
    GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
    // Get IsWindowsSubscriber
    bool isWindowsSubscriber = UViveportSubscription::IsWindowsSubscriber();
    if (isWindowsSubscriber)
    {
        UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][IsWindowsSubscriber] User is a Windows subscriber"));
        fstring = FString::Printf(TEXT("User is a Windows subscriber"));
        GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
    }
    else
    {
        UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][IsWindowsSubscriber] User isn't a Windows subscriber"));
        fstring = FString::Printf(TEXT("User isn't a Windows subscriber"));
        GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
    }
    // Get IsAndroidSubscriber
    bool isAndoridSubscriber = UViveportSubscription::IsAndroidSubscriber();
    if (isAndoridSubscriber)
    {
        UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][IsAndroidSubscriber] User is a Andorid subscriber"));
        fstring = FString::Printf(TEXT("User is a Andorid subscriber"));
        GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
    }
    else
    {
        UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][IsAndroidSubscriber] User isn't a Andorid subscriber"));
        fstring = FString::Printf(TEXT("User isn't a Andorid subscriber"));
        GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
    }
    SubscriptionTransactionType transactionType = UViveportSubscription::GetTransactionType();
    switch (transactionType)
    {
        case SubscriptionTransactionType::UNKNOWN:
            UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][GetTransactionType] TransactionType is Unknown"));
            fstring = FString::Printf(TEXT("TransactionType is Unknown"));
            GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
            break;
        case SubscriptionTransactionType::PAID:
            UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][GetTransactionType] TransactionType is Paid"));
            fstring = FString::Printf(TEXT("TransactionType is Paid"));
            GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
            break;
        case SubscriptionTransactionType::REDEEM:
            UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][GetTransactionType] TransactionType is Redeem"));
            fstring = FString::Printf(TEXT("TransactionType is Redeem"));
            GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
            break;
        case SubscriptionTransactionType::FREETRIAL:
            UE_LOG(ViveportSDK, Log, TEXT("[UViveportSubscriptionDemo][GetTransactionType] TransactionType is FreeTrial"));
            fstring = FString::Printf(TEXT("TransactionType is FreeTrial"));
            GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
            break;
        default:
            break;
    }
}
void UViveportSubscriptionDemo::MyIsReadyCallback::OnFailure(int error_code, const FString& error_message)
{
    UE_LOG(ViveportSDK, Error, TEXT("[UViveportSubscriptionDemo][MyIsReadyCallback] IsReady failure. Code = %d"), error_code);
    FString fstring = FString::Printf(TEXT("IsReady failure. Code = %d"), error_code);
    GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::White, fstring);
}