en ko zh

IAP SDK 프로그래밍

Samsung IAP 인스턴스화

앱이 IAP 요청을 하려면, IapHelper 싱글톤 인스턴스를 생성하기 위해 getInstance() 호출이 필요합니다.

요청

public static IapHelper getInstance( Context _context )

매개변수

매개변수

유형

설명

_context

Context

(필수) Android Context


반환값

IapHelper

코드 조각

Java

private IapHelper iapHelper = IapHelper.getInstance(context);

Kotlin

private val iapHelper: IapHelper = IapHelper.getInstance(context)

운영 모드 설정

IAP는 세 가지 운영 모드를 지원합니다. 하나는 아이템 구매에 대한 청구를 활성화하는 것이고, 다른 두 가지는 아이템 구매에 대한 앱 사용자의 청구 없이 IAP 기능을 테스트하는 것입니다.

setOperationMode()를 호출하지 않으면, 운영 모드는 기본적으로 OPERATION_MODE_PRODUCTION으로 설정됩니다. (테스트는 지원하지 않지만, 베타 테스트 및 일반적인 앱 배포는 가능합니다).

모드

설명

OPERATION_MODE_PRODUCTION

startPayment() 요청은 지정된 대로 처리되고, 성공적인 요청에 대해서는 금융 거래가 발생하고, 실제 결과가 반환됩니다 (성공 또는 실패).

참고: 모든 IAP SDK 요청에 대해:
  • OPERATION_MODE_PRODUCTION 모드에서 구매한 아이템만 소유한 아이템으로 간주됩니다.

OPERATION_MODE_TEST

startPayment() 요청은 지정된 대로 처리되고, 금융 거래는 발생하지 않습니다 (라이선스 테스터는 구매 비용이 청구되지 않습니다).
그리고 항상 결과는 성공으로 반환됩니다.
OPERATION_MODE_TEST 모드의 결제창에 대한 자세한 내용은 아래를 참조하세요.

참고: 모든 IAP SDK 요청에 대해:
  • OPERATION_MODE_TEST 모드에서 구매한 아이템만 소유한 아이템으로 간주됩니다.
  • 인앱 아이템을 구매하려면, 사용자는 Seller Portal에서 앱의 라이선스 테스터 로 등록해야 합니다. 이 모드에서 라이선스 테스터는 항상 인앱 아이템을 무료로 받습니다. 다른 모든 사용자는 인앱 아이템을 구매하려고 하면 오류 메시지가 표시됩니다.

OPERATION_MODE_TEST_FAILURE

모든 IAP SDK 요청이 실패합니다.
이는 앱이 부적절한 입력 및 사용자 동작과 같은 오류를 처리할 수 있는지 확인하기 위한 부정적인 테스트입니다.



요청

public void setOperationMode( OperationMode _mode )

매개변수

매개변수

유형

설명

_mode

운영 모드

(필수) IAP SDK API 요청 처리를 제어하는 IAP 운영 모드:
OPERATION_MODE_PRODUCTION
OPERATION_MODE_TEST
OPERATION_MODE_TEST_FAILURE

코드 조각

Java

iapHelper.setOperationMode(HelperDefine.OperationMode.OPERATION_MODE_TEST);

Kotlin

iapHelper.setOperationMode(HelperDefine.OperationMode.OPERATION_MODE_TEST)

소유한 아이템 가져오기

getOwnedList()는 앱 사용자가 이전에 구매하여 현재 가지고 있는 인앱 아이템 목록을 반환합니다:

  • 아직 사용되지 않았고 소비 처리되지 않은 소모품
  • 비소모품
  • 무료 체험 또는 구독 중인 구독 상품
    • 취소된 구독 항목은 구독 기간이 종료될 때까지 포함됩니다.
    • 구독 가격이 변경되는 경우, 새로운 가격, 갱신 날짜, 사용자 동의 등의 정보가 포함됩니다.

getOwnedList() 는 또한 OnGetOwnedListListener 인터페이스에서 지정한 데이터와 처리 결과를 반환합니다.

요청

public boolean getOwnedList
(   
    String                        _productType,
    OnGetOwnedListListener        _onGetOwnedListListener
)

매개변수

매개변수

유형

설명

_productType

String

(필수) 반환할 인앱 아이템 유형:
item: 소모품 및 비소모품
subscription: 구독 상품
all: 소모품, 비소모품 및 구독 상품

_onGetOwnedListListener

(필수) 반환할 데이터 및 처리 결과를 지정하는 OnGetOwnedListListener 인터페이스


반환값

  • true - 요청이 서버로 성공적으로 전송되었고, 결과는 OnGetOwnedListListener 인터페이스 리스너로 전송됩니다.

  • false - 요청이 서버로 전송되지 않아 처리되지 않았습니다.

응답

void onGetOwnedProducts(ErrorVo errorVo, ArrayList<OwnedProductVo> ownedList)


매개변수

매개변수

유형

설명

errorVo

ErrorVo

처리된 요청 결과

ownedList

ArrayList<OwnedProductVo>

앱 사용자가 소유한 인앱 아이템을 포함하는 객체


ErrorVo

Getter

반환 유형

설명

getErrorCode()

int

응답 코드

getErrorString()

String

오류 메시지

getErrorDetailsString()

String

오류 상세 정보

isShowDialog()

boolean

true: 실패 후, 오류 팝업이 표시됩니다.
false: 실패 후, 오류 팝업이 표시되지 않습니다.


OwnedProductVo

Getter

반환 유형

설명

getItemId()

String

인앱 아이템의 고유 ID

getItemName()

String

인앱 아이템 이름

getItemPrice()

Double

현지 통화로 표시된 인앱 아이템의 현재 현지 가격 (예: 7.99)

getItemPriceString()

String

현지 통화 기호 및 가격 (현지 통화 형식):
  • 통화 기호 + 가격 (예: £7.99)
  • 가격 + 통화 기호 (예: 66815₫)

getCurrencyUnit()

String

현지 통화 기호 (예: €, £, $)

getCurrencyCode()

String

현지 통화의 통화 코드(3자리) (예: EUR, GBP, USD)

getItemDesc()

String

인앱 아이템 설명

getType()

String

인앱 아이템 유형:
"item": 소모품 또는 비소모품
"subscription": 구독

getIsConsumable()

boolean

인앱 아이템이 소모품인지 여부
true: 소모품
false: 소모품 아님 (비소모품 또는 구독)

주의: true라면, 소모품이 소비 처리가 되지 않은 경우입니다. 다시 구매하려면, consumePurchasedItems()을 호출하여 소비 처리를 먼저 해야합니다.

getPaymentId()

String

인앱 아이템 결제에 대해 Samsung IAP에서 할당한 고유 식별자

getPurchaseId()

String

인앱 아이템 구매 거래에 대해 Samsung IAP가 할당한 고유 식별자

getPurchaseDate()

String

인앱 아이템 구매 날짜 및 시간 (YYYY‑MM‑DD HH:mm:ss)

getSubscriptionEndDate()

String

구독에 한해, 현재 구독 기간이 만료되는 날짜 및 시간 (YYYY‑MM‑DD HH:mm:ss)

getPassThroughParam()

String

앱이 인앱 구매 및 결제 거래에 할당한 고유 식별자입니다.
PassThroughParam이 입력되지 않으면 빈 문자열("")이 반환됩니다.

getSubscriptionPriceChange()

SubscriptionPriceChangeVo

구독 가격 변경 안내

getJsonString()

String

전송되는 JSON 전체 데이터



SubscriptionPriceChangeVo

Getter

반환 유형

설명

getAppName()

String

앱 이름

getItemName()

String

인앱 아이템 이름

getSubscriptionDurationMultiplier()

String

구독 기간을 결정하는 시간 기준 단위의 숫자 배수입니다.

배수는 getSubscriptionDurationUnit()에서 반환된 값과 결합됩니다.

getSubscriptionDurationUnit()

String

각 구독기간의 시간 기준 단위 ("YEAR", "MONTH", "WEEK")

참고: 단위는 대문자여야 합니다.

getStartDate()

String

새로운 가격이 구독자에게 적용되는 날짜 및 시간 (YYYY‑MM‑DD HH:mm:ss)

getOriginalLocalPrice()

Double

기존 현지 가격 (예: 7.99)

getOriginalLocalPriceString()

String

기존 가격의 현지 통화 기호 및 가격 (현지 통화 형식):
  • 통화 기호 + 가격 (예: £7.99)
  • 가격 + 통화 기호 (예: 66815₫)

getNewLocalPrice()

Double

새 현지 가격 (예: 9.99)

getNewLocalPriceString()

String

새 가격의 현지 통화 기호 및 가격 (현지 통화 형식):
  • 통화 기호 + 가격 (예: £9.99)
  • 가격 + 통화 기호 (예: 70000₫)

isConsented()

boolean

사용자가 가격 변경에 동의했는지 여부를 나타냅니다 (아래 getPriceChangeMode() 참조)
  • true: 사용자가 가격 변경에 동의함.
  • false: 사용자가 가격 변경에 동의 안 함.

동의가 필요한 경우, 기존 구독자가 구독을 갱신할 수 있도록 앱에서 팝업, 알림 또는 설정을 제공하는 것을 권장합니다. (가격 인상 알림 참조)

앱에서 제공하는 메시지에는 사용자가 동의 페이지에 접근할 수 있도록 딥링크를 제공해야 합니다. (Samsung 모바일 기기에서):

samsungapps://SubscriptionDetail?purchaseId={purchaseId}

getPriceChangeMode()

PriceChangeMode

  • PRICE_INCREASE_USER_AGREEMENT_REQUIRED: 기존 가입자의 동의가 필요한 가격 인상
    사용자는 구독을 갱신하기 전에 인상된 가격을 명시적으로 수락해야 합니다.
  • PRICE_INCREASE_NO_USER_AGREEMENT_REQUIRED: 기존 구독자가 아무런 조치를 취하지 않아도 가격이 인상됩니다. 사용자가 거부하지 않는 한, 다음 정기 구독료 결제 시기에 새로운 가격이 청구됩니다.
  • PRICE_DECREASE: 다음 정기 구독 결제 기한이 되면 기존 구독자에게 가격 인하가 적용됩니다.

코드 조각

Java

iapHelper.getOwnedList(HelperDefine.PRODUCT_TYPE_ALL, new OnGetOwnedListListener() {
    @Override
    public void onGetOwnedProducts(@NonNull ErrorVo errorVo, @NonNull ArrayList<OwnedProductVo> ownedList) {
        if (errorVo.getErrorCode() == IapHelper.IAP_ERROR_NONE) {
            for (OwnedProductVo item : ownedList) {
                if (item.getIsConsumable()) {
                    // TODO: Consume the consumable item not yet consumed
                }
                
                // TODO: Check if the subscription price has changed and user consent is required
                SubscriptionPriceChangeVo subscriptionPriceChangeVo = item.getSubscriptionPriceChange();
            }
        } else {
            // TODO: Handle the error
        }
    }
});

Kotlin

iapHelper.getOwnedList(IapHelper.PRODUCT_TYPE_ALL)
{ errorVo: ErrorVo, ownedList: ArrayList<OwnedProductVo> ->
    if (errorVo.errorCode == IapHelper.IAP_ERROR_NONE) {
        for (item in ownedList) {
            if (item.isConsumable) {
                // TODO: Consume the consumable item not yet consumed
            }
            
            // TODO: Check if the subscription price has changed and user consent is required
            val subscriptionPriceChangeVo = item.subscriptionPriceChange
        }
    } else {
        // TODO: Handle the error
    }
}

인앱 아이템 세부 정보 가져오기

getProductsDetails()는 앱에 등록된 하나 이상 또는 모든 인앱 아이템에 대한 정보를 반환합니다.
OnGetProductsDetailsListener 인터페이스에서 지정한 아이템 데이터와 처리 결과를 반환합니다.

요청

public void getProductsDetails
(   
    String                           _productIds,
    OnGetProductsDetailsListener     _onGetProductsDetailsListener
)  

매개변수

매개변수

유형

설명

_productIds

String

(필수) 다음 중 하나로 지정된 하나 이상의 인앱 아이템 ID::
  • 앱 내 모든 아이템을 지정하는 빈 문자열 ("")
  • 하나 이상의 고유합 인앱 아이템 ID (쉼표로 구분) (예: "coins,blocks,lives")

Seller Portal (Applications 페이지 > 앱 상태 클릭 > In App Purchase 탭 > Item ID)에서 아이템 ID를 가져올 수 있습니다.

_onGetProductsDetailsListener

(필수) 반환할 데이터 및 처리 결과를 지정하는 OnGetProductsDetailsListener 인터페이스

응답

void onGetProducts(ErrorVo errorVo, ArrayList<ProductVo> productList)

매개변수

매개변수

유형

설명

errorVo

ErrorVo

처리된 요청 결과

productList

ArrayList<ProductVo>

인앱 아이템의 세부 정보를 포함하는 객체


ErrorVo

Getter

반환 유형

설명

getErrorCode()

int

응답 코드

getErrorString()

String

오류 메시지

getErrorDetailsString()

String

오류 상세 정보

isShowDialog()

boolean

true: 실패 후, 오류 팝업이 표시됩니다.
false: 실패 후, 오류 팝업이 표시되지 않습니다.


ProductVo

Getter

반환 유형

설명

getItemId()

String

인앱 아이템의 고유 ID

getItemName()

String

인앱 아이템 이름

getItemPrice()

Double

현지 통화로 표시된 인앱 아이템의 현재 현지 가격 (예: 7.99)

참고: 표시될 때 항상 소수점 오른쪽에 있는 두 숫자를 포함합니다 (통화 기호는 표시하지 않음). 예를 들어, 현지 가격이 8유로인 경우 "8.00"이 표시됩니다. 가격이 정수일 때 소수점과 소수점 오른쪽에 있는 두 숫자를 표시하지 않으려면, 대신 getItemPriceString()을 사용하세요.

getItemPriceString()

String

현지 통화 기호 및 가격 (현지 통화 형식):
  • 통화 기호 + 가격 (예: £7.99)
  • 가격 + 통화 기호 (예: 66815₫)

참고: 표시될 때 가격이 정수이면 소수점과 소수점 오른쪽의 두 자리는 표시되지 않습니다. 예를 들어, 현지 가격이 8유로이면 "€8"이라는 값이 표시됩니다. 소수점 오른쪽의 두 자리를 표시하려면(가격이 정수더라도) 대신 getItemPrice()를 사용하세요.

getCurrencyUnit()

String

현지 통화 기호 (예: €, £, $)

getCurrencyCode()

String

현지 통화의 통화 코드(3자리) (예: EUR, GBP, USD)

getItemDesc()

String

인앱 아이템 설명

getType()

String

인앱 아이템 유형:
"item": 소모품 또는 비소모품
"subscription": 구독

getIsConsumable()

boolean

인앱 아이템이 소모품인지 여부
true: 소모품
false: 소모품 아님 (비소모품 또는 구독)

getSubscriptionDurationUnit()

String

구독에 한해, 각 구독기간의 시간 기준 단위 ("YEAR", "MONTH", "WEEK").

참고: 단위는 대문자여야 합니다.

getSubscriptionDurationMultiplier()

String

구독에 한해, 구독 기간을 결정하는 시간 기준 단위의 숫자 배수 (예: 1YEAR, 2MONTH, 4WEEK)

배수는 getSubscriptionDurationUnit()에서 반환된 값과 결합됩니다.

getTieredSubscriptionYN()

String

구독에 한해, 신규 할인 혜택 포함 여부
"Y": 상품에 하나 이상의 신규 할인 가격 구독 기간이 있고, 그 다음에 일반 가격 기간이 있는 경우
"N": 상품에 일반 가격 구독 기간만 있는 경우

getTieredPrice()

String

현지 통화로 표시된 신규 할인 가격 (예: 7.99)

getTieredPriceString()

String

신규 할인 가격의 현지 통화 기호 및 가격 (현지 통화 형식):
  • 통화 기호 + 가격 (예: £7.99)
  • 가격 + 통화 기호 (예: 66815₫)

getTieredSubscriptionDurationUnit()

String

신규 할인 혜택 기간의 시간 기준 단위 ("YEAR", "MONTH", "WEEK").

참고: 단위는 대문자여야 합니다.

getTieredSubscriptionDurationMultiplier()

String

신규 할인 혜택 기간을 결정하는 시간 기준 단위의 숫자 배수 (예: 1YEAR, 2MONTH, 4WEEK)

배수는 getTieredSubscriptionDurationUnit()에서 반환된 값과 결합됩니다.

getTieredSubscriptionCount()

String

신규 할인 혜택이 있는 경우, 신규 할인 혜택 기간의 수입니다.

getShowStartDate()

String

구매할 수 있는 시작 날짜 및 시간 (YYYY-MM-DD HH:mm:ss)

getShowEndDate()

String

구매할 수 없게 되는 종료 날짜 및 시간 (YYYY-MM-DD HH:mm:ss)

getItemImageUrl()

String

아이템 이미지 및 썸네일의 URL

getItemDownloadUrl()

String

인앱 아이템을 다운로드할 URL

getFreeTrialPeriod()

String

구독 무료 체험 기간 (일) : 7~999일

getJsonString()

String

전송되는 JSON 전체 데이터

코드 조각

Java

iapHelper.getProductsDetails("Nuclear, Claymore, SpeedUp", new OnGetProductsDetailsListener() {
    @Override
    public void onGetProducts(@NonNull ErrorVo errorVo, @NonNull ArrayList<ProductVo> productList) {
        if (errorVo.getErrorCode() == IapHelper.IAP_ERROR_NONE) {
            for (ProductVo item : productList) {
                // TODO: Get details of the item
            }
        } else {
            // TODO: Handle the error
        }
    }
});

Kotlin

iapHelper.getProductsDetails("Nuclear, Claymore, SpeedUp")
{ errorVo: ErrorVo, productList: ArrayList<ProductVo> ->
    if (errorVo.errorCode == IapHelper.IAP_ERROR_NONE) {
        for (item in productList) {
            // TODO: Get details of the item
        }
    } else {
        // TODO: Handle the error
    }
}

인앱 아이템 구매

startPayment()는 지정된 인앱 아이템의 구매 및 결제 거래를 시작하고, 구매 성공 또는 실패를 최종 사용자에게 알릴 수 있습니다.
OnPaymentListener 인터페이스에서 지정된 아이템, 거래 결과 및 처리 결과를 반환합니다.

구매 보안을 강화하기 위해 passThroughParam 매개변수 값을 지정할 수 있습니다.
앱이 생성하고 전달한 passThroughParam값은 응답으로 반환됩니다.

요청

public boolean startPayment
(
    String                  _itemId,
    String                  _passThroughParam,
    OnPaymentListener       _onPaymentListener
)

매개변수

매개변수

유형

설명

_itemId

String

(필수) 구매할 인앱 아이템의 고유 식별자

_passThroughParam

String

(선택) Android 앱에서 구매 및 결제 거래에 할당한 고유 식별자(최대: 255바이트).
지정하면, OnPaymentListener 인터페이스에서 값을 반환합니다.

iap/v6/receipt를 호출하여 구매를 확인하면, passThroughParam 필드에서 값을 반환합니다.

_onPaymentListener

(필수) 반환할 구매 및 결제거래 데이터, 아이템 데이터, 처리 결과를 지정하는 OnPaymentListener 인터페이스


반환값

  • true: 요청이 서버로 성공적으로 전송되었고, 결과는 OnPaymentListener 인터페이스 리스너로 전송됩니다.
  • false: 요청이 서버로 전송되지 않아 처리되지 않았습니다.

응답

void onPayment(ErrorVo errorVo, PurchaseVo purchaseVo)

매개변수

매개변수

유형

설명

errorVo

ErrorVo

처리된 요청 결과

purchaseVo

PurchaseVo

구매 결과를 담고 있는 객체


ErrorVo

Getter

반환 유형

설명

getErrorCode()

int

응답 코드

getErrorString()

String

오류 메시지

getErrorDetailsString()

String

오류 상세 정보

isShowDialog()

boolean

true: 실패 후, 오류 팝업이 표시됩니다.
false: 실패 후, 오류 팝업이 표시되지 않습니다.


PurchaseVo

Getter

반환 유형

설명

getItemId()

String

인앱 아이템의 고유 ID

getItemName()

String

인앱 아이템 이름

getItemPrice()

Double

현지 통화로 표시된 인앱 아이템의 현재 현지 가격 (예: 7.99)

참고: 표시될 때 항상 소수점 오른쪽에 있는 두 숫자를 포함합니다(통화 기호는 표시하지 않음). 예를 들어, 현지 가격이 8유로인 경우 "8.00"이 표시됩니다. 가격이 정수일 때 소수점과 소수점 오른쪽에 있는 두 숫자를 표시하지 않으려면, 대신 getItemPriceString()을 사용하세요.

getItemPriceString()

String

현지 통화 기호 및 가격 (현지 통화 형식):
  • 통화 기호 + 가격 (예: £7.99)
  • 가격 + 통화 기호 (예: 66815₫)

참고: 표시될 때 가격이 정수이면 소수점과 소수점 오른쪽의 두 자리는 표시되지 않습니다. 예를 들어, 현지 가격이 8유로이면 "€8"이라는 값이 표시됩니다. 소수점 오른쪽의 두 자리를 표시하려면(가격이 정수더라도) 대신 getItemPrice()를 사용하세요.

getCurrencyUnit()

String

현지 통화 기호 (예: €, £, $)

getCurrencyCode()

String

현지 통화의 통화 코드(3자리) (예: EUR, GBP, USD)

getItemDesc()

String

인앱 아이템 설명

getType()

String

인앱 아이템 유형:
"item": 소모품 또는 비소모품
"subscription": 구독

getIsConsumable()

boolean

인앱 아이템이 소모품인지 여부
true: 소모품
false: 소모품 아님 (비소모품 또는 구독)

참고: 소모품을 구매한 후, consumePurchasedItems()를 호출하여 소비 처리를 하세요.

getPaymentId()

String

인앱 아이템 결제에 대해 Samsung IAP가 할당한 고유 식별자

getPurchaseId()

String

인앱 아이템 구매 거래에 대해 Samsung IAP가 할당한 고유 식별자

getPurchaseDate()

String

인앱 아이템 구매 날짜 및 시간
(YYYY-MM-DD HH:mm:ss)

getVerifyUrl()

String

IAP 6.0부터 사용되지 않음
getPurchaseId()에서 반환된 구매 ID를 사용하여 구매를 확인하기 위한 IAP server API를 호출하려면, 구매 확인을 참조하세요.

getPassThroughParam()

String

앱이 인앱 구매 및 결제 거래에 할당한 고유 식별자입니다.
PassThroughParam 매개변수가 입력되지 않으면, 빈 문자열 ("")이 반환됩니다.

getItemImageUrl()

String

아이템 이미지 및 썸네일의 URL

getItemDownloadUrl()

String

인앱 아이템을 다운로드할 URL

getOrderId()

String

주문의 고유 식별자

getJsonString()

String

전송되는 JSON 전체 데이터

코드 조각

Java

iapHelper.startPayment("Nuclear", "pLKjLKjLJL87=76df56rf+4f5", new OnPaymentListener() {
    @Override
    public void onPayment(@NonNull ErrorVo errorVo, @Nullable PurchaseVo purchaseVo) {
		if (errorVo.getErrorCode() == IapHelper.IAP_ERROR_NONE) {
            if (purchaseVo != null) {
                String passThroughParam = _purchaseVo.getPassThroughParam();
                // TODO: If you have set a PassThroughParameter in the request,  
                //       you can verify the PassThroughParameter here.

                if (purchaseVo.getIsConsumable()) {
                    String purchaseId = purchaseVo.getPurchaseId();
                    // TODO: Consume the consumable item by calling `consumePurchasedItems()`
            }
        } else {
            // TODO: Handle the error
        }
    }
});

Kotlin

iapHelper.startPayment("Nuclear", "pLKjLKjLJL87=76df56rf+4f5")
{ errorVo: ErrorVo, purchaseVo: PurchaseVo? ->
    if (errorVo.errorCode == IapHelper.IAP_ERROR_NONE) {
        if (purchaseVo != null) {
            val passThroughParam: String = purchaseVo.passThroughParam
            // TODO: If you have set a PassThroughParameter in the request,  
            //       you can verify the PassThroughParameter here.

            if (purchaseVo.isConsumable) {
                val purchaseId: String = purchaseVo.purchaseId
                // TODO: Consume the consumable item by calling `consumePurchasedItems()`
            }
        }
    } else {
        // TODO: Handle the error
    }
}

구매한 소모품 소비

consumePurchasedItems()는 구매한 하나 이상의 소모품을 소비된 것으로 처리하여, 다시 구매할 수 있게 합니다. 앱 사용자는 아이템을 사용했을 수도 있고 사용하지 않았을 수도 있습니다. OnConsumePurchasedItemsListener 인터페이스에서는 지정한 아이템 데이터와 처리 결과를 반환합니다.

요청

public boolean consumePurchasedItems
(
  String                             _purchaseIds,
  OnConsumePurchasedItemsListener    _onConsumePurchasedItemsListener
)

매개변수

매개변수

유형

설명

_purchaseIds

String

(필수) 소비 처리 할 소모품의 구매에 대한 하나 이상의 고유 식별자 값 (쉼표로 구분)

_onConsumePurchasedItems

(필수) 반환할 데이터 및 처리 결과를 지정하는 OnConsumePurchasedItemsListener인터페이스


반환값

  • true: 요청이 서버로 성공적으로 전송되었고, 결과는 OnConsumePurchasedItemsListener 인터페이스 리스너 로 전송됩니다.

  • false: 요청이 서버로 전송되지 않아 처리되지 않았습니다.


응답

void onConsumePurchasedItems(ErrorVo errorVo, ArrayList<ConsumeVo> consumeList)

매개변수

매개변수

유형

설명

errorVo

ErrorVo

처리된 요청 결과

consumeList

ArrayList<ConsumeVo>

소모품 리스트

참고: 예상치 못한 오류로 인해 일부 아이템이 소모되지 못한 경우에도 consumeList에 포함되며, 각 아이템별 처리 결과는 ConsumeVo.getStatusCode()로 확인할 수 있습니다.


ErrorVo

Getter

반환 유형

설명

getErrorCode()

int

응답 코드

getErrorString()

String

오류 메시지

getErrorDetailsString()

String

오류 상세 정보

isShowDialog()

boolean

true: 실패 후, 오류 팝업이 표시됩니다.
false: 실패 후, 오류 팝업이 표시되지 않습니다.


ConsumeVo

Getter

반환 유형

설명

getPurchaseId()

String

인앱 아이템 구매 거래에 대해 Samsung IAP가 할당한 고유 식별자

getStatusCode()

int

Status code
0 : 성공
1 : 잘못된 purchaseID
2 : 주문 실패
3 : 비소모품
4 : 이미 소비됨
5 : 권한이 없는 사용자
9 : 예상치 못한 서비스 오류

getStatusString()

String

Status message
0 : "success"
1 : "Can't find order with this purchaseID."
2 : "Can't consume this purchase because it's not successful order."
3 : "This type of item is not consumable."
4 : "This purchase has been consumed already."
5 : "Can't consume this purchase because the user is not authorized to consume this order."
9 : "service error"

getJsonString()

String

전송되는 JSON 전체 데이터

코드 조각

Java

final String PURCHASEID = "d215d9abcd17b12578a21c0ea7d8821747b64939732a3243b538d8bcae245590";

iapHelper.consumePurchasedItems(PURCHASEID, new OnConsumePurchasedItemsListener() {
    @Override
    public void onConsumePurchasedItems(@NonNull ErrorVo errorVo, @NonNull ArrayList<ConsumeVo> consumeList) {
        if (errorVo.getErrorCode() == IapHelper.IAP_ERROR_NONE) {
            for (ConsumeVo item : consumeList) {
                // TODO: Get details of the consumption
            }
        } else {
            // TODO: Handle the error
        }
    }
});

Kotlin

val PURCHASEID: String = "d215d9abcd17b12578a21c0ea7d8821747b64939732a3243b538d8bcae245590"

iapHelper.consumePurchasedItems(PURCHASEID)
{ errorVo: ErrorVo, consumeList: ArrayList<ConsumeVo> ->
    if (errorVo.errorCode == IapHelper.IAP_ERROR_NONE) {
        for (item in consumeList) {
            // TODO: Get details of the consumption
        }
    } else {
        // TODO: Handle the error
    }
}

구독 프로모션 자격 확인하기

getPromotionEligibility()는 고객에게 적용되는 무료 체험판 및 신규 할인 혜택과 같은 구독의 가격 정책을 반환합니다. 이를 통해 각 고객에게 구매 시 적용 가능한 프로모션에 대해 알릴 수 있습니다. 고객은 결제 전에 사용 가능한 프로모션을 확인할 수 있으므로, 구매를 장려할 수 있습니다.

요청

public void getPromotionEligibility
(
  String _itemIds,
  OnGetPromotionEligibilityListener onGetPromotionEligibilityListener
)

매개변수

매개변수

유형

설명

_itemIds

String

(필수) 하나 이상의 고유한 인앱 아이템 ID. 여러 값은 쉼표로 구분됩니다. 예: "coins,blocks,lives"

_onGetPromotionEligibilityListener

(필수) 구독의 가격 정책 및 처리결과를 지정하는 onGetPromotionEligibility() 인터페이스


응답

void onGetPromotionEligibility(ErrorVo errorVo, ArrayList<PromotionEligibilityVo> pricingList)

매개변수

매개변수

유형

설명

errorVo

ErrorVo

처리된 요청 결과

pricingList

ArrayList<PromotionEligibilityVo>

가격 정책 리스트 (PromotionEligibilityVo 참조).


ErrorVo

Getter

반환 유형

설명

getErrorCode()

int

응답 코드

getErrorString()

String

오류 메시지

getErrorDetailsString()

String

오류 상세 정보

isShowDialog()

boolean

true: 실패 후, 오류 팝업이 표시됩니다.
false: 실패 후, 오류 팝업이 표시되지 않습니다.


PromotionEligibilityVo

Getter

반환 유형

설명

getItemId()

String

인앱 아이템 ID

getPricing()

String

사용자에게 적용되는 가격 정책:
  • "FreeTrial" - 사용자가 구독을 무료로 사용할 수 있는 일정 기간입니다. 이 유형의 구독에 대한 자세한 내용은 무료 체험을 참조하세요.
  • "TieredPrice" - 제한된 기간 동안 할인된 가격을 청구하는 구독입니다. 이 유형의 구독에 대한 자세한 내용은 신규 할인 가격을 참조하세요.
  • "RegularPrice" - 구독 기간마다 정해진 가격을 청구하는 구독입니다. 이 유형의 구독에 대한 자세한 내용은 일반 정기 구독을 참조하세요.

코드 조각

Java

iapHelper.getPromotionEligibility("Nuclear, Claymore, SpeedUp", new OnGetPromotionEligibilityListener() {
    @Override
    public void onGetPromotionEligibility(@NonNull ErrorVo errorVo, @NonNull ArrayList<PromotionEligibilityVo> pricingList) {
        if (errorVo.getErrorCode() == IapHelper.IAP_ERROR_NONE) {
            for (PromotionEligibilityVo pricing : pricingList) {
                // TODO: Get the pricing options of the subscription
            }
        } else {
            // TODO: Handle the error
        }
    }
});

Kotlin

iapHelper.getPromotionEligibility("Nuclear, Claymore, SpeedUp")
{ errorVo: ErrorVo, pricingList: ArrayList<PromotionEligibilityVo> ->
    if (errorVo.errorCode == IapHelper.IAP_ERROR_NONE) {
        for (item in pricingList) {
            // TODO: Get the pricing options of the subscription
        }
    } else {
        // TODO: Handle the error
    }
}

구독 요금제 변경

changeSubscriptionPlan()은 고객이 기존 구독을 동일한 구독 상품의 다른 요금제로 변경할 수 있도록 해줍니다.

변경은 업그레이드(낮은 요금제에서 높은 요금제로 또는 두 개의 동일한 요금제 간 변경) 또는 다운그레이드(높은 요금제에서 낮은 요금제로) 일 수 있습니다.

결제 및 현재 구독 기간에 변경 사항을 적용하는 방법을 선택하려면 비례 배분 모드를 지정해야 합니다.


요청

public boolean changeSubscriptionPlan
(
  String _oldItemId,
  String _newItemId,
  ProrationMode _prorationMode,
  String _passThroughParam,
  OnChangeSubscriptionPlanListener _onChangeSubscriptionPlanListener
)

매개변수

매개변수

유형

설명

oldItemId

String

(필수) 현재 구독 중인 구독 ID

newItemId

String

(필수) 구독을 원하는 구독 ID

prorationMode

ProrationMode

(필수) 구독이 변경될 때 설정할 수 있는 모드는 4가지입니다:
  • INSTANT_PRORATED_DATE: 구독은 즉시 업그레이드되거나 다운그레이드됩니다. 남은 시간은 가격 차이에 따라 조정되고, 다음 청구일을 앞당겨 새 구독에 적립됩니다. 추가 지불은 없습니다.
  • INSTANT_PRORATED_CHARGE: 요금제 업그레이드에만 설정할 수 있습니다. 구독은 즉시 업그레이드되지만 청구 주기는 동일하게 유지됩니다. 남은 기간의 가격 차이는 사용자에게 청구됩니다.
  • INSTANT_NO_PRORATION: 요금제 업그레이드에만 설정할 수 있습니다. 구독은 즉시 업그레이드되고 구독이 갱신되면 새 가격이 청구됩니다. 청구 주기는 동일하게 유지됩니다.
  • DEFERRED: 구독이 갱신될 때 구독이 업그레이드되거나 다운그레이드되며, 새 가격도 청구됩니다. 다운그레이드는 항상 이 모드로 실행됩니다.

4가지 모드에 대한 자세한 내용은 비례 배분 모드를 참조하세요.

passThroughParam

String

(선택) Android 앱에서 구매 및 결제 거래에 할당한 고유 식별자(최대: 255바이트).

지정하면, onChangeSubscriptionPlanListener 인터페이스에서 값을 반환합니다.

iap/v6/receipt를 호출하여 구매를 확인하면, passThroughParam 필드에서 값을 반환합니다.

onChangeSubscriptionPlanListener

(필수) 반환할 구매 및 결제 거래, 아이템 데이터 및 처리 결과를 지정하는 OnChangeSubscriptionPlanListener 인터페이스


반환값

  • true - 요청이 서버로 성공적으로 전송되었고, 결과는 OnChangeSubscriptionPlanListener 인터페이스 리스너로 전송됩니다.
  • false - 요청이 서버로 전송되지 않아 처리되지 않았습니다.

응답

void onChangeSubscriptionPlan(ErrorVo errorVo, PurchaseVo purchaseVo)

매개변수

매개변수

유형

설명

errorVo

ErrorVo

처리된 요청 결과

purchaseVo

PurchaseVo

구매 결과를 담고 있는 객체


ErrorVo

Getter

반환 유형

설명

getErrorCode()

int

응답 코드

getErrorString()

String

오류 메시지

getErrorDetailsString()

String

오류 상세 정보

isShowDialog()

boolean

true: 실패 후, 오류 팝업이 표시됩니다.
false: 실패 후, 오류 팝업이 표시되지 않습니다.


PurchaseVo

Getter

반환 유형

설명

getItemId()

String

인앱 아이템의 고유 ID

getItemName()

String

인앱 아이템 이름

getItemPrice()

Double

현지 통화로 표시된 인앱 아이템의 현재 현지 가격 (예: 7.99)

참고: 표시될 때 항상 소수점 오른쪽에 있는 두 숫자를 포함합니다(통화 기호는 표시하지 않음). 예를 들어, 현지 가격이 8유로인 경우 "8.00"이 표시됩니다. 가격이 정수일 때 소수점과 소수점 오른쪽에 있는 두 숫자를 표시하지 않으려면, 대신 getItemPriceString()을 사용하세요.

getItemPriceString()

String

현지 통화 기호 및 가격 (현지 통화 형식):
  • 통화 기호 + 가격 (예: £7.99)
  • 가격 + 통화 기호 (예: 66815₫)

참고: 표시될 때 가격이 정수이면 소수점과 소수점 오른쪽의 두 자리는 표시되지 않습니다. 예를 들어, 현지 가격이 8유로이면 "€8"이라는 값이 표시됩니다. 소수점 오른쪽의 두 자리를 표시하려면(가격이 정수더라도) 대신 getItemPrice()를 사용하세요.

getCurrencyUnit()

String

현지 통화 기호 (예: €, £, or $)

getCurrencyCode()

String

현지 통화의 통화 코드(3자리) (예: EUR, GBP, USD)

getItemDesc()

String

인앱 아이템 설명

getType()

String

인앱 아이템 유형:
"item": 소모품 또는 비소모품
"subscription": 구독

getIsConsumable()

boolean

인앱 아이템이 소모품인지 여부
true: 소모품
false: 소모품 아님 (비소모품 또는 구독)

참고: 소모품 구매를 확인한 후, consumePurchasedItems()을 호출하여 소비 처리를 하세요.

getPaymentId()

String

인앱 아이템 결제에 대해 Samsung IAP가 할당한 고유 식별자

getPurchaseId()

String

인앱 아이템 구매 거래에 대해 Samsung IAP가 할당한 고유 식별자

getPurchaseDate()

String

인앱 아이템 구매 날짜 및 시간 (YYYY‑MM‑DD HH:mm:ss)

getVerifyUrl()

String

IAP 6.0부터 사용되지 않음
getPurchaseId()에서 반환된 구매 ID를 사용하여 구매를 확인하기 위한 IAP Server API를 호출하려면, 구매 확인을 참조하세요.

getPassThroughParam()

String

앱이 인앱 구매 및 결제 거래에 할당한 고유 식별자입니다.
PassThroughParam 매개변수가 입력되지 않으면, 빈 문자열 ("")이 반환됩니다.

getItemImageUrl()

String

URL of the item’s image and thumbnail

getItemDownloadUrl()

String

인앱 아이템을 다운로드할 URL

getOrderId()

String

Unique identifier of the order

getJsonString()

String

전송되는 JSON 전체 데이터

코드 조각

Java

iapHelper.changeSubscriptionPlan(
    "oldItem",
    "newItem",
    HelperDefine.ProrationMode.INSTANT_PRORATED_DATE,
    "pLKjLKjLJL87=76df56rf+4f5",
    new OnChangeSubscriptionPlanListener() {
        @Override
        public void onChangeSubscriptionPlan(@NonNull ErrorVo errorVo, @Nullable PurchaseVo purchaseVo) {
            if (errorVo.getErrorCode() == IapHelper.IAP_ERROR_NONE) {
                if (purchaseVo != null) {
                	// TODO: Check details about your newly purchased subscription
                    
                    String passThroughParam = purchaseVo.getPassThroughParam();
                    // TODO: If you have set a PassThroughParameter in the request,
                    //       you can verify the PassThroughParameter here.
                }
            } else {
         	   // TODO: Handle the error
            }
        }
});

Kotlin

iapHelper.changeSubscriptionPlan(
    "oldItem",
    "newItem",
    HelperDefine.ProrationMode.INSTANT_PRORATED_DATE,
    "pLKjLKjLJL87=76df56rf+4f5")
	{ errorVo: ErrorVo, purchaseVo: PurchaseVo? ->
        if (errorVo.errorCode == IapHelper.IAP_ERROR_NONE) {
            if (purchaseVo != null) {
                // TODO: Check details about your newly purchased subscription

                val passThroughParam: String = purchaseVo.passThroughParam
                // TODO: If you have set a PassThroughParameter in the request,  
                //       you can verify the PassThroughParameter here.
            }
        } else {
            // TODO: Handle the error
    	}
	}

응답 코드

 

Reponse Code
(Value)

설명

IAP_ERROR_NONE
(0)

성공

IAP_PAYMENT_IS_CANCELED
(1)

결제 취소됨

IAP_ERROR_INITIALIZATION
(-1000)

IAP 초기화 중 오류

참고: 발생 가능한 오류 세부 정보:

  • 10000 : IAP Client이 유효하지 않습니다.
  • 10001 : Samsung Checkout app이 유효하지 않습니다.
  • 10011 : 서비스 초기화에 실패했습니다. 다시 시도하세요.
IAP_ERROR_NEED_APP_UPGRADE
(-1001)

IAP 업그레이드가 필요합니다

IAP_ERROR_COMMON
(-1002)

IAP 실행 중 오류

참고: 발생 가능한 오류 세부 정보:

  • 1005 : 구독 요금제 변경 요청 시, 지정한 기존 구독 상품이 존재하지 않습니다.
  • 1006 : 구독 요금제 변경 요청 시, 지정한 기존 구독 상품을 구독하고 있지 않습니다.
  • 1012 : 구독 요금제 변경 요청 시, 지정한 인앱 아이템이 구독 유형이 아닙니다.
  • 1014 : 구독 요금제 변경이 이미 요청되었습니다.
  • 7002 : 부정의심 거래로 차단되었습니다.
  • 9000 : OPERATION_MODE_TEST_FAILURE가 설정된 경우, getOwnedList()가 실패합니다.
  • 9005 : OPERATION_MODE_TEST_FAILURE가 설정된 경우, consumePurchasedItems()가 실패합니다.
  • 9006 : PassThroughParam이 Base64로 인코딩되지 않았습니다.
  • 9007 : PassThroughParam이 최대 길이를 초과했습니다.
  • 9010 : 소모품이 아직 소비 처리되지 않았습니다.
  • 9013 : OPERATION_MODE_TEST_FAILURE가 설정된 경우, getProductsDetails()가 실패합니다.
  • 9014 : OPERATION_MODE_TEST_FAILURE가 설정된 경우, startPayment()가 실패합니다.
  • 9122 : 잘못된 MCC
  • 9132 : 잘못된 token 또는 사용자 ID
  • 9200 : 잘못된 MCC, MNC, 또는 CSC
  • 9226 : consumePurchasedItems()에 입력한 PurchaseID가 null이거나 잘못되었습니다.
  • 9440 : 안드로이드 OS 최소 버전 미만의 장치는 사용할 수 없습니다.
  • 9441 : 서비스가 일시적으로 중단되었습니다.
  • 9701 : 인증 실패
  • 100001 : 예상치 못한 오류로 인해 요청 결과가 정상적으로 반환되지 않습니다.
  • 100008 : 필수 권한에 동의하지 않았습니다.
  • 100010 : 운영 모드가 OPERATION_MODE_TEST로 설정되어 있고, 사용자가 라이선스 테스터가 아닌 경우 startPayment()는 실패합니다.
IAP_ERROR_ALREADY_PURCHASED
(-1003)

비소모품을 재구매하거나 구독을 만료일 전에 재구매할 때 발생하는 오류입니다.

참고: 발생 가능한 오류 세부 정보:

  • 9224 : 비소모품을 재구매하거나 구독을 만료일 전에 재구매할 수 없습니다.
IAP_ERROR_WHILE_RUNNING
(-1004)

필수 정보 없이 결제를 요청할 때 발생하는 오류입니다.

IAP_ERROR_PRODUCT_DOES_NOT_EXIST
(-1005)

요청한 인앱 아이템을 사용할 수 없는 경우 발생하는 오류입니다.

참고: 발생 가능한 오류 세부 정보:

  • 9202 : 요청한 인앱 아이템은 앱이 배포된 국가 또는 기기에서 유효하지 않습니다. Seller Portal에서 앱 배포 조건을 확인하세요.
  • 9207 : 요청하신 아이템 ID가 현재 운영 모드에 존재하지 않습니다. 아이템 ID를 확인하세요.
IAP_ERROR_CONFIRM_INBOX
(-1006)

서버에 구매 요청을 한 후 앱이 구매 결과를 받지 못할 때 발생하는 오류입니다.
이 경우, 구매가 성공적으로 완료되었을 수 있으므로 구매를 요청한 아이템에 대한 확인이 필요합니다.

IAP_ERROR_ITEM_GROUP_DOES_NOT_EXIST
(-1007)

인앱 아이템의 그룹 ID가 존재하지 않을 때 발생하는 오류입니다.

참고: 발생 가능한 오류 세부 정보:

  • 9201 : 등록된 아이템 정보가 없습니다. Seller Portal에서 인앱 구매 활성화 및 아이템 등록을 확인하세요.
IAP_ERROR_NETWORK_NOT_AVAILABLE
(-1008)

네트워크를 사용할 수 없을 때 발생하는 오류입니다.

IAP_ERROR_IOEXCEPTION_ERROR
(-1009)

IOException

IAP_ERROR_SOCKET_TIMEOUT
(-1010)

SocketTimeoutException

IAP_ERROR_CONNECT_TIMEOUT
(-1011)

ConnectTimeoutException

IAP_ERROR_NOT_EXIST_LOCAL_PRICE
(-1012)

해당 인앱 아이템은 해당 국가에서 판매되지 않습니다.

참고: 발생 가능한 오류 세부 정보:
  • 9134 : 현지 가격이 존재하지 않습니다. (지원되지 않는 MCC)

IAP_ERROR_NOT_AVAILABLE_SHOP
(-1013)

해당 국가에서는 IAP가 지원되지 않습니다.

참고: 발생 가능한 오류 세부 정보:
  • 9259 : MCC는 유효하나 Galaxy Store는 지원되지 않습니다.

IAP_ERROR_INVALID_ACCESS_TOKEN
(-1015)

삼성계정의 액세스 토큰이 유효하지 않습니다.





오류 팝업 예