결제

Prev Next

Classic/VPC 환경에서 이용 가능합니다.

결제

GAMEPOT SDK에서 제공하는 인앱 결제 기능을 사용하여 게임 내 아이템을 판매할 수 있습니다. 결제 전에 스토어별 환경 설정에 해당 스토어에 맞도록 설정해야 합니다. 또한, 대시보드 > 결제 > 인앱에 아이템이 추가되지 않았을 경우 'ProductID not found' 라는 오류가 발생됩니다.

Android

Android에서 상품 정보를 조회하고 결제를 요청하며 미처리 결제를 복구하는 방법을 안내합니다.

(AOS) 인앱 정보 가져오기

결제하실 때에 화면에 결제 정보와 현지 통화 정보를 표시해야 합니다. 아래 함수를 통해서 현재 결제 통화나 이름 등을 가져올 수 있습니다. 만일 정상적으로 가져오지 못하는 경우 콘솔 세팅을 확인해 주십시오.

Kotlin:

import com.nbase.sdk.Store

NBase.getProductItems() {products, e -> 
    if (e != null) {
        Log.e("NBase", e.message)
    } else {
        // 인앱 아이템 정보
        Log.e("NBase", products)
    }
}

Java:

NBase nBase = NBase.INSTANCE;

nBase.getProductItems((products, e) -> {
    if (e != null) {
        Log.e("NBase", "getProductItems fail: " + e.getMessage());
    } else {
        if (products != null) {
            Log.e("NBase", "getProductItems success: " + products.toString());
        }
    }
    return null;
});

다음 표는 상품 정보 조회 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
id String productId
productName String 제품 이름
title String 제품 타이틀
price Float 제품 가격
localizedPrice Float 현지화된 가격
productId String 제품 고유 ID
productType String 제품 타입
productDescription String 제품 설명
currency String 통화 단위

(AOS) 결제 요청

가져온 인앱 정보에 productId로 결제를 요청할 수 있습니다.

Kotlin:

import com.nbase.sdk.Store

NBase.purchase(activity, Store.GOOGLE, productId, 메타데이터, options) { purchase, e -> 
    if (e != null) {
        Log.e("NBase", e.message)
    } else {
        Log.e("NBase", purchase)
    }
}

Java:

import com.nbase.sdk.Store;

NBase nBase = NBase.INSTANCE;
nBase.purchase(activity, storeId, productId, 메타데이터, options, (purchase, e) -> {
    if (e != null) {
        Log.e("NBase", "purchase fail: " + e.getMessage());
    } else {
        if (purchase != null) {
            Log.e("NBase", "purchase success: " + purchase.toString());
        }
    }
    return null;
});

다음 표는 결제 요청 시 전달하는 매개변수를 설명합니다.

  • Parameter
Key Type Description Required
activity Activity 현재 액티비티 O
storeId Store 스토어 ID (아래 표 참고) O
productId String productId (대시보드 → 결제 → 인앱 아이템) O
메타데이터 String 메타데이터 X
options String 결제 옵션 기능 X

다음 표는 storeId에 전달할 수 있는 스토어 값을 설명합니다.

Key Description
Store.GOOGLE 구글 스토어
Store.ONE 원 스토어
Store.GALAXY 갤럭시 스토어
Store.AMAZON 아마존 스토어
Store.HUAWEI 화웨이 스토어

다음 표는 결제 요청 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
id String ID
orderId String 주문 ID
storeId String 스토어 ID
productId String 상품 ID
billingKey String 결제 키
signature String 서명
originalJson String 원본 JSON
developerPayload String 개발자 페이로드
packageName String 패키지명
isAcknowledged bool 확인 여부
purchaseState String 구매 상태
purchaseTime String 구매 시간
quantity String 수량
recurringState String 반복 결제 상태
currency String 통화
country String 국가
paymentId String 결제 ID
price Float 가격
iapVersion String 인앱 결제 버전
playerId String 플레이어 ID
serverId String 서버 ID
level Int 레벨
userdata String 사용자 데이터
메타데이터 String 메타데이터
options String 옵션
authCode String 인증 코드

(AOS) 미처리 결제 복구

결제는 완료됐지만 게임에 결과가 전달되지 않은 결제 건을 복구합니다. restorePurchase로 복구를 요청하면 복구된 결제 정보가 setPurchaseRestoreListener로 등록한 리스너에 1건씩 전달됩니다.

참고

nbasesdk 3.0.98 이상에서 사용할 수 있습니다.

  • 복구 리스너 등록

로그인이 완료되면 SDK가 바로 복구를 시작하므로 로그인을 호출하기 전에 한 번 등록해 주십시오. 로그인 시와 앱 복귀 시 SDK가 자동으로 수행하는 복구 결과도 같은 리스너로 전달되며, 같은 결제 건의 성공은 한 번만 전달됩니다.

Kotlin:

NBase.setPurchaseRestoreListener { purchase, e ->
    if (e != null) {
        // 복구 실패
        Log.e("NBase", "restore Failed: ${e.message}")
    } else {
        // 복구 성공: orderId, productId 로 아이템을 지급합니다.
        Log.d("NBase", "restore Success: ${purchase?.get("orderId")} / ${purchase?.get("productId")}")
    }
}

Java:

NBase nBase = NBase.INSTANCE;
nBase.setPurchaseRestoreListener((purchase, e) -> {
    if (e != null) {
        // 복구 실패
        Log.e("NBase", "restore Failed: " + e.getMessage());
    } else if (purchase != null) {
        // 복구 성공: orderId, productId 로 아이템을 지급합니다.
        Log.d("NBase", "restore Success: " + purchase.get("orderId") + " / " + purchase.get("productId"));
    }
    return null;
});

다음 표는 복구 리스너 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
purchase Map<String, Any?>? 복구된 결제 정보. 결제 요청의 Callback 과 같은 키로 전달
e CoreException? 복구 실패 시 오류 정보. 성공 시 null
  • 복구 요청

초기화와 로그인 이후에 호출해 주십시오.

Kotlin:

NBase.restorePurchase(activity) { success, e ->
    if (e != null) {
        Log.e("NBase", "restorePurchase Failed: ${e.message}")
    } else {
        Log.d("NBase", "restorePurchase Success")
    }
}

Java:

NBase nBase = NBase.INSTANCE;
nBase.restorePurchase(activity, (success, e) -> {
    if (e != null) {
        Log.e("NBase", "restorePurchase Failed: " + e.getMessage());
    } else {
        Log.d("NBase", "restorePurchase Success");
    }
    return null;
});

다음 표는 복구 요청 시 전달하는 매개변수를 설명합니다.

  • Parameter
Key Type Description Required
activity Activity 현재 액티비티 O
storeId Store 복구할 스토어. 생략 시 초기화에 설정한 스토어 X

다음 표는 복구 요청 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
success Boolean 복구 요청 시작 여부. 복구된 결제 정보는 리스너로 전달됩니다.
e CoreException? 요청 실패 시 오류 정보. 성공 시 null
  • 복구 리스너 해제

등록한 리스너를 해제합니다.

Kotlin:

NBase.setPurchaseRestoreListener(null)

Java:

NBase.INSTANCE.setPurchaseRestoreListener(null);

iOS

iOS에서 상품 정보를 조회하고 결제를 요청하는 방법을 안내합니다.

(iOS) 인앱 정보 가져오기

결제하실 때에 화면에 결제 정보와 현지 통화 정보를 표시해야 합니다. 아래 함수를 통해서 현재 결제 통화나 이름 등을 가져올 수 있습니다. 만일 정상적으로 가져오지 못하는 경우 콘솔 세팅을 확인해 주십시오.

Swift:

let products = NBase.getProductItems()

Objective-C:

[NBaseBridge.shared getProductItems:^(NSString * _Nullable result) {
    NSLog(@"getProductItems result: %@", result);
}];

다음 표는 상품 정보 조회 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
id String productId
productId String 제품 고유 ID
productName String 제품 이름
productType String 제품 타입
currency String 통화
price Float64 제품 가격
localizedPrice String 현지화된 가격
productDescription String 제품 설명

(iOS) 결제 요청

가져온 인앱 정보에 productId로 결제를 요청할 수 있습니다.

Swift:

NBase.purchase(productId: productId, 메타데이터: 메타데이터, options: options) { result in
    switch result {
    case .success(let data):
        NBase.showToast(message: data?.encodeToJson() ?? "")
    case .failure(let error):
        NBase.showToast(message: error.errorDescription ?? "")
    }
}

Objective-C:

[NBaseBridge.shared purchase:productId 메타데이터:메타데이터 options:options :^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        NSLog(@"purchase Error: %@", error.localizedDescription);
    } else {
        NSLog(@"purchase succeeded with result: %@", result);
    }
}];

다음 표는 결제 요청 시 전달하는 매개변수를 설명합니다.

  • Parameter
Key Type Description Required
productId String 상품 ID (대시보드 > 결제 > 인앱 아이템) O
메타데이터 String 메타데이터 X
options String 결제 옵션 기능 X

다음 표는 결제 요청 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
orderId String 주문 ID
receipt String 영수증
signature String 서명
productId String 상품 ID
storeId String 스토어 ID
country String 국가
quantity Int 수량
paymentId String 결제 ID
currency String 통화
serverId String 서버 ID
playerId String 플레이어 ID
userdata String 사용자 데이터
메타데이터 String 메타데이터
options String 결제 옵션
authCode String 인증 코드
level Int 레벨
price Float64 가격

Unity

Unity에서 상품 정보를 조회하고 결제를 요청하며 Android 미처리 결제를 복구하는 방법을 안내합니다.

(Unity) 인앱 정보 가져오기

결제하실 때에 화면에 결제 정보와 현지 통화 정보를 표시해야 합니다.
아래 함수를 통해서 현재 결제 통화나 이름 등을 가져올 수 있습니다. 만일 정상적으로 가져오지 못하는 경우 콘솔 세팅을 확인해 주십시오.

NBaseSDK.NBase.getProductItems((products, error) => 
{
    if (products != null && products.Count > 0)
    {
        // 제품 목록을 순회합니다.
        foreach (var product in products)
        {
            // 각 제품의 정보를 토스트 메시지로 보여줍니다.
            // 예시에서는 product.ToString()을 호출하고 있지만,
            // 실제로는 product의 구체적인 속성(예: 이름, 가격 등)을 표시할 수 있습니다.
            NBaseSDK.NBase.showToast(product.ToString());
        }
    }
    else
    {
        // 제품 목록이 비어있는 경우, 사용자에게 알립니다.
        NBaseSDK.NBase.showToast("제품 목록이 비어있습니다.");
    }
});

다음 표는 상품 정보 조회 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
Products[].id string productId
Products[].title string 제품 타이틀
Products[].productId string 제품 고유 ID
Products[].productType string 제품 타입
Products[].productName string 제품 이름
Products[].productDescription string 제품 설명
Products[].currency string 통화 단위
Products[].price float 제품 가격

(Unity) 결제 요청

가져온 인앱 정보에 productId 로 결제를 요청할 수 있습니다.

NBaseSDK.NBase.purchase(Store.google.ToString(), productId, 메타데이터, options, (purchase, error) => 
{
    if (error != null)
    {
        Debug.Log(error.Message.ToString());
        return;
    }
    // 결제 성공
});

다음 표는 결제 요청 시 전달하는 매개변수를 설명합니다.

  • Parameter
Key Type Description Required
storeId string 스토어 ID (아래 표 참고) O
productId string productId (대시보드 → 결제 → 인앱 아이템) O
메타데이터 string 메타데이터 X
options string 결제 옵션 기능 X

다음 표는 storeId에 전달할 수 있는 스토어 값을 설명합니다.

Key Description
Store.google.ToString() 구글 스토어
Store.one.ToString() 원 스토어
Store.galaxy.ToString() 갤럭시 스토어
Store.amazon.ToString() 아마존 스토어
Store.huawei.ToString() 화웨이 스토어

다음 표는 결제 요청 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
storeId string 상점의 고유 ID
paymentId string 결제 ID
iapVersion string 인앱 결제 버전
productId string productId
billingKey string 청구 키
signature string 서명
originalJson string 원본 JSON
orderId string 주문 ID
developerPayload string 개발자 페이로드
packageName string 패키지 이름
isAcknowledged bool 확인 여부
purchaseState int 구매 상태
purchaseTime long 구매 시간
price float 가격
quantity int 수량
currency string 통화 단위

(Unity) 미처리 결제 복구

결제는 완료됐지만 게임에 결과가 전달되지 않은 결제 건을 복구합니다. restorePurchase로 복구를 요청하면 복구된 결제 정보가 setPurchaseRestoreListener로 등록한 리스너에 1건씩 전달됩니다.

참고

nbasesdk-unity-plugin 3.0.18 이상의 Android에서 사용할 수 있습니다.

  • 복구 리스너 등록

로그인이 완료되면 SDK가 바로 복구를 시작하므로 로그인을 호출하기 전에 한 번 등록해 주십시오. 로그인 시와 앱 복귀 시 SDK가 자동으로 수행하는 복구 결과도 같은 리스너로 전달되며, 같은 결제 건의 성공은 한 번만 전달됩니다.

NBaseSDK.NBase.setPurchaseRestoreListener((purchase, error) =>
{
    if (error != null)
    {
        // 복구 실패
        Debug.Log("restore Failed: " + error.Message);
        return;
    }
    // 복구 성공: orderId, productId 로 아이템을 지급합니다.
    Debug.Log("restore Success: " + purchase.orderId + " / " + purchase.productId);
});

다음 표는 복구 리스너 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
purchase Purchase 복구된 결제 정보. 결제 요청의 Callback과 같은 형태
error Error 복구 실패 시 오류 정보. 성공 시 null
  • 복구 요청

초기화와 로그인 이후에 호출해 주십시오.

NBaseSDK.NBase.restorePurchase((success, error) =>
{
    if (error != null)
    {
        Debug.Log("restorePurchase Failed: " + error.Message);
        return;
    }
    Debug.Log("restorePurchase Success");
});

다음 표는 복구 요청 콜백으로 전달되는 값을 설명합니다.

  • Callback
Key Type Description
success bool 복구 요청 시작 여부. 복구된 결제 정보는 리스너로 전달
error Error 요청 실패 시 오류 정보. 성공 시 null
  • 복구 리스너 해제

등록한 리스너를 해제합니다.

NBaseSDK.NBase.removePurchaseRestoreListener();

문제 해결

결제 연동 중 자주 발생하는 오류와 확인 사항을 안내합니다.

Q. ProductID not found 오류가 발생합니다.
A. 대시보드 > 결제 > 인앱에 해당 상품 ID가 등록되어 있는지 확인해 주십시오.

Q. 결제가 진행되지 않습니다.
A. 스토어별 환경 설정을 참고하여 해당 스토어에 맞는 설정이 완료되었는지 확인해 주십시오.

Q. (Android) java.lang.NoClassDefFoundError: Failed resolution of: Lcom/android/billingclient/api/BillingClient;
A. 아래 코드를 추가해 주십시오.

<androidPackage spec="com.android.billingclient:billing:8.0.0" />

Q. (iOS) 인앱 정보를 가져올 수 없습니다.
A. Apple Connect에 등록된 인앱 상품 정보와 앱 환경(Production/Sandbox)이 일치하는지 확인해 주십시오.