# 결제

## 결제 초기화

{% hint style="info" %}
[셋업](/sdk-guide/setup.md#setupsdk)을 완료한 이후에 호출해야 합니다.
{% endhint %}

다음과 같은 기능이 있습니다.

* 결제 기능 초기화
* 모든인앱 상품 정보 제공

{% tabs %}
{% tab title="Example" %}

```csharp
// Action<Result<PubInitBillingResult>> action;
GamePubSDK.Ins.InitBilling(result => {
    result.Match(
        value => {
            // 파라미터로 넘어온 상품 정보로 상점UI를 구성해 주세요.
            foreach (product in value.ProductList)
            {
                // product.ProductId
                // product.Currency
                // product.Price
                // product.Title
                // product.Desc
            }
        },
        error => {
            // error.ErrCode
            // error.Message
        }
    );
});
```

{% endtab %}

{% tab title="Response" %}

<pre class="language-csharp"><code class="lang-csharp">public class PubInitBillingResult
{
    private PubInAppProduct[] productList; // 상품정보 리스트
}

public class PubInAppProduct
{
    private string productId; // 마켓 상품ID
<strong>    private string currency;  // 통화 (예: "KRW")
</strong>    private string price;     // 상품 가격 (예: "￦2,000")
    private string title;     // 마켓에 등록한 상품명
    private string desc;      // 마켓에 등록한 상품 설명
}
</code></pre>

{% endtab %}

{% tab title="Error Code" %}

<table><thead><tr><th width="300.3333333333333">Error</th><th width="84">Code</th><th>Description</th></tr></thead><tbody><tr><td>SUCCESS</td><td>1000</td><td>성공</td></tr><tr><td>NETWORK_ERROR</td><td>2003</td><td>서버 통신 중 장애가 발생했습니다.</td></tr><tr><td>SDK_INTERNAL_ERROR</td><td>2004</td><td> SDK 내부 오류입니다.</td></tr><tr><td>IAP_NOT_INITIALIZED</td><td>4001</td><td>결제 초기화가 완료되지 않았습니다.</td></tr><tr><td>IAP_UNSUPPORTED_MARKET</td><td>4002</td><td>지원하지 않는 스토어입니다.</td></tr><tr><td>IAP_PRODUCT_LIST_NOT_EXISTS</td><td>4003</td><td>초기화할 상품목록이 없습니다.</td></tr><tr><td>IAP_AGENT_GOOGLE_ERROR</td><td>4006</td><td>Google Play 결제 서비스 오류입니다.</td></tr><tr><td>IAP_AGENT_APPLE_ERROR</td><td>4007</td><td>App Store 결제 서비스 오류입니다.</td></tr><tr><td>IAP_AGENT_ONE_ERROR</td><td>4008</td><td>Onestore 결제 서비스 오류입니다.</td></tr><tr><td>IAP_AGENT_GALAXY_ERROR</td><td>4009</td><td>Galaxy Store 결제 서비스 오류입니다.</td></tr><tr><td>IAP_SERVICE_DISCONNECTED</td><td>90000</td><td>결제 초기화를 재수행해 주세요.</td></tr><tr><td>SERVER_INTERNAL_ERROR</td><td>40000</td><td>서버 내부 오류입니다.</td></tr><tr><td>SERVER_UNKNOWN_ERROR</td><td>40002</td><td>서버에서 알 수 없는 오류가 발생했습니다.</td></tr></tbody></table>
{% endtab %}
{% endtabs %}

## 결제

{% hint style="info" %}
[셋업](/sdk-guide/setup.md#setupsdk), [결제 초기화](#undefined), [로그인](#undefined)을 완료한 이후에 호출해야 합니다.
{% endhint %}

인앱상품 결제 기능입니다.

{% tabs %}
{% tab title="Example" %}

```csharp
// string productId;
// string channelId;
// string characterId;
// Action<Result<PubPurchaseResult>> action;
GamePubSDK.Ins.Purchase(
    productId, 
    channelId, 
    characterId, 
    result => {
        result.Match(
            value => {
                // 파라미터로 넘어온 결제정보로 아이템 지급을 진행해 주세요.
                // value.GamepubTid
                // value.PurchaseToken
                // value.OriginalJSONData
            },
            error => {
                // error.ErrCode
                // error.Message
            }
        );
    }
);
```

{% endtab %}

{% tab title="Response" %}

```csharp
public class PubPurchaseResult
{
    private string gamepubTid;        // 게임펍 거래ID
    private string purchaseToken;     // 구매 토큰
    private string originalJSONData;  // 마켓 원본 데이터
}
```

{% endtab %}

{% tab title="Error Code" %}

<table><thead><tr><th width="300.3333333333333">Error</th><th width="84">Code</th><th>Description</th></tr></thead><tbody><tr><td>SUCCESS</td><td>1000</td><td>성공</td></tr><tr><td>NETWORK_ERROR</td><td>2003</td><td>서버 통신 중 장애가 발생했습니다.</td></tr><tr><td>SDK_INTERNAL_ERROR</td><td>2004</td><td> SDK 내부 오류입니다.</td></tr><tr><td>IAP_NOT_INITIALIZED</td><td>4001</td><td>결제 초기화가 완료되지 않았습니다.</td></tr><tr><td>IAP_UNSUPPORTED_MARKET</td><td>4002</td><td>지원하지 않는 스토어입니다.</td></tr><tr><td>IAP_PRODUCT_LIST_NOT_EXISTS</td><td>4003</td><td>초기화할 상품목록이 없습니다.</td></tr><tr><td>IAP_USER_CANCELED</td><td>4004</td><td>결제가 취소되었습니다.</td></tr><tr><td>IAP_PRODUCT_ID_NOT_EXISTS</td><td>4005</td><td>존재하지 않는 Market ProductID 입니다.</td></tr><tr><td>IAP_AGENT_GOOGLE_ERROR</td><td>4006</td><td>Google Play 결제 서비스 오류입니다.</td></tr><tr><td>IAP_AGENT_APPLE_ERROR</td><td>4007</td><td>App Store 결제 서비스 오류입니다.</td></tr><tr><td>IAP_AGENT_ONE_ERROR</td><td>4008</td><td>Onestore 결제 서비스 오류입니다.</td></tr><tr><td>IAP_AGENT_GALAXY_ERROR</td><td>4009</td><td>Galaxy Store 결제 서비스 오류입니다.</td></tr><tr><td>IAP_SERVICE_DISCONNECTED</td><td>90000</td><td>결제 초기화를 재수행해 주세요.</td></tr><tr><td>SERVER_INTERNAL_ERROR</td><td>40000</td><td>서버 내부 오류입니다.</td></tr><tr><td>SERVER_UNKNOWN_ERROR</td><td>40002</td><td>서버에서 알 수 없는 오류가 발생했습니다.</td></tr></tbody></table>
{% endtab %}
{% endtabs %}

## 결제 재시도

{% hint style="warning" %}
Android 환경에서만 동작합니다.
{% endhint %}

{% hint style="info" %}
[셋업](/sdk-guide/setup.md#setupsdk), [결제 초기화](#undefined), [로그인](#undefined)을 완료한 이후에 호출해야 합니다.
{% endhint %}

consume 처리가 실패한 인앱상품이 있을 경우 재처리를 시도하는 기능입니다.

아래와 같은 시점에 호출할 것을 권장합니다.

* 로그인 완료 직후
* 구매 요청 직전
* 게임 내 상점 진입시
* 유저 프로필 또는 우편함 확인시

{% tabs %}
{% tab title="Example" %}

```csharp
// string channelId;
// string characterId;
// Action<Result<PubRetryPurchaseResult>> action;
GamePubSDK.Ins.RetryPurchase(
    channelId, 
    characterId, 
    result => {
        result.Match(
            value => {
                foreach (product in value.PurchaseResults)
                {
                    // 파라미터로 넘어온 결제정보로 아이템 지급을 진행해 주세요.
                    // product.GamepubTid
                    // product.PurchaseToken
                    // product.OriginalJSONData
                }
            },
            error => {
                // error.ErrCode
                // error.Message
            }
        );
    }
);
```

{% endtab %}

{% tab title="Response" %}

```csharp
public class PubRetryPurchaseResult
{
    private PubPurchaseResult[] purchaseResults; // 결제정보 목록
}

public class PubPurchaseResult
{
    private string gamepubTid;        // 게임펍 거래ID
    private string purchaseToken;     // 구매 토큰
    private string originalJSONData;  // 마켓 원본 데이터
}
```

{% endtab %}

{% tab title="Error Code" %}

<table><thead><tr><th width="300.3333333333333">Error</th><th width="84">Code</th><th>Description</th></tr></thead><tbody><tr><td>SUCCESS</td><td>1000</td><td>성공</td></tr><tr><td>NETWORK_ERROR</td><td>2003</td><td>서버 통신 중 장애가 발생했습니다.</td></tr><tr><td>SDK_INTERNAL_ERROR</td><td>2004</td><td> SDK 내부 오류입니다.</td></tr><tr><td>IAP_NOT_INITIALIZED</td><td>4001</td><td>결제 초기화가 완료되지 않았습니다.</td></tr><tr><td>IAP_UNSUPPORTED_MARKET</td><td>4002</td><td>지원하지 않는 스토어입니다.</td></tr><tr><td>IAP_PRODUCT_LIST_NOT_EXISTS</td><td>4003</td><td>초기화할 상품목록이 없습니다.</td></tr><tr><td>IAP_USER_CANCELED</td><td>4004</td><td>결제가 취소되었습니다.</td></tr><tr><td>IAP_PRODUCT_ID_NOT_EXISTS</td><td>4005</td><td>존재하지 않는 Market ProductID 입니다.</td></tr><tr><td>IAP_AGENT_GOOGLE_ERROR</td><td>4006</td><td>Google Play 결제 서비스 오류입니다.</td></tr><tr><td>IAP_AGENT_APPLE_ERROR</td><td>4007</td><td>App Store 결제 서비스 오류입니다.</td></tr><tr><td>IAP_AGENT_ONE_ERROR</td><td>4008</td><td>Onestore 결제 서비스 오류입니다.</td></tr><tr><td>IAP_AGENT_GALAXY_ERROR</td><td>4009</td><td>Galaxy Store 결제 서비스 오류입니다.</td></tr><tr><td>IAP_RETRY_LIST_EMPTY</td><td>4010</td><td>결제를 재시도할 상품이 없습니다.</td></tr><tr><td>IAP_SERVICE_DISCONNECTED</td><td>90000</td><td>결제 초기화를 재수행해 주세요.</td></tr><tr><td>SERVER_INTERNAL_ERROR</td><td>40000</td><td>서버 내부 오류입니다.</td></tr><tr><td>SERVER_UNKNOWN_ERROR</td><td>40002</td><td>서버에서 알 수 없는 오류가 발생했습니다.</td></tr></tbody></table>
{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.igamepub.co.kr/sdk-guide/purchase.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
