Skip to content
스토브
마지막 업데이트

실제 적용 흐름이 궁금하신가요?

이용 시나리오 / 게임에서 구매하기

쿠폰

이해하기


스토브 플랫폼의 쿠폰 서비스를 연동하면, 스토브 파트너스에서 쿠폰을 발행해 게임·웹에서 이용자에게 아이템 등 보상을 지급할 수 있어요.
쿠폰은 사전 등록·콜라보·이벤트 보상, 마케팅 유입·전환 트래킹, CS 수동 보상 등에 활용해 이용자 리텐션을 높이는 데 쓰여요.

쿠폰 팝업 지원 범위 및 노출 위치
ㆍ SDK 팝업 지원: 모바일 게임, 멀티플랫폼(PC+모바일) 게임 (PC 빌드 포함)
ㆍ iOS·PC 전용 게임: SDK 팝업 대신 스토브 웹사이트 쿠폰함·게임 홈페이지에서 등록
ㆍ 노출 위치: CP사(개발사)가 게임 UX에 맞춰 지정 (예: 메인 로비 > 설정 > 쿠폰 등록)

쿠폰 유형과 보상

쿠폰의 종류와 보상 구성을 함께 살펴보면 상황에 맞는 쿠폰을 고를 수 있어요.

어떤 쿠폰을 써야 할까요?

상황에 맞는 쿠폰 유형을 먼저 골라보세요.


쿠폰 유형 선택 가이드

이용자가 코드를 직접 입력하나요?

├─ 예 · 1인당 고유 코드 1개 (사전등록·CS·개인 이벤트) → 일반 쿠폰

├─ 예 · 여러 명이 함께 쓰는 공용 코드 1개 (SNS·콜라보) → 대표(공용) 쿠폰

├─ 예 · 사전 등록된 대상만 코드 입력·사용 가능 (베타·등급 전용) → 대상 지정 쿠폰

├─ 아니오 · 특정 이용자 계정에 바로 지급 (VIP·CS·출석) → 계정 지급 쿠폰

└─ 아니오 · 다운로드 받은 이용자 계정에 바로 지급 (현재는 주로 스토어에서 사용) → 다운로드 쿠폰

쿠폰 유형

쿠폰 유형에 따라 발급 방식과 이용자가 쿠폰을 받는 경험이 달라져요.

쿠폰 유형 구분 특징 주요 활용
일반 쿠폰 1 : 1 한 코드를 한 사람만 사용, 코드 직접 입력 사전 등록·개인 이벤트·CS 보상
대표(공용) 쿠폰 1 : N 한 코드를 여러 사람이 사용, 공개 코드 입력 콜라보·SNS·시즌 이벤트
계정 지급 쿠폰 자동 지급 입력 없이 쿠폰함에 자동 적재 VIP·오류·CS 수동 보상
대상 지정 쿠폰 지정 대상만 등록된 대상만 사용 가능 (대상 검증) 베타 테스터·등급 전용 이벤트
다운로드 쿠폰 스토어 연동 스토어에서 다운로드 후 쿠폰함 적재 (추가 연동 필요)
※ CP사가 다운로드 쿠폰함을 직접 구축·연동하면 인게임에서도 사용 가능하나, 현재는 주로 "스토어"에서 사용해요
스토어 방문 유도
무엇을 보상으로 줄까요? (쿠폰 속성)

쿠폰 유형이 "누구에게 · 어떻게 나눠줄까"라면, 쿠폰 속성은 "무엇을 줄까"예요.
발행할 때는 유형을 먼저 정하고, 그다음 속성(보상)을 설정하는 순서예요.


보상 종류 무엇을 주나요 특징 / 제약
아이템 쿠폰 인게임 아이템·재화 회원번호 또는 캐릭터번호 기준으로 지급
할인 쿠폰 결제 시 할인 (정액/정률) 인게임·스토어 모두 사용
※ 인게임 할인 쿠폰은 결제창에서 사용
※ 장바구니/꾸러미 할인 옵션은 스토어 전용
게임이용권 쿠폰 스토어 게임을 무료로 이용할 수 있는 이용권 스토어에서만 사용 가능
자주 쓰는 조합 예시 (유형 × 보상)

"이럴 땐 이렇게" — 실제로 자주 쓰이는 조합이에요.

이럴 땐 이 조합

· SNS·콜라보로 아이템 뿌리기 → 대표(공용) 쿠폰 + 아이템

· 개인별 아이템 지급 / 사전등록 / CS 보상 → 일반 쿠폰 + 아이템

· 특정 이용자에게 아이템 바로 지급 (VIP·오류 보상) → 계정 지급 쿠폰 + 아이템

· 인게임 결제 할인 이벤트 → 일반 또는 대표(공용) 쿠폰 + 할인 (이용자는 결제창에서 사용)

· 크리에이터·홍보 이용자에게 게임이용권 지급 (체험 제공) → 계정 지급 쿠폰 + 게임이용권

설정별 화면 예시

쿠폰 유형과 세부 설정에 따라 이용자가 인게임에서 보는 화면과 경험이 달라져요.

설정 조합 이용자 화면
일반 쿠폰 + 앞자리 고정(Prefix) 사용 코드 앞 4자리 고정 (예: FREEXXXXXX) → 브랜드 쿠폰 느낌으로 이벤트·콜라보에 적합
대표 쿠폰 + 난수 자동생성 공개 코드(예: 2350DWG06Z0009S5)를 인게임에 입력, 선착순·기간 제한 설정 가능
계정 지급 쿠폰 (입력 없음) 입력 없이 쿠폰함에 자동 적재, 알림·쿠폰함에서 확인

쿠폰 발행 흐름

쿠폰을 발행하고 이용자에게 전달되기까지의 전체 흐름이에요.

1단계. 쿠폰 정보 설정

파트너스 [Billing > 쿠폰 관리 > 쿠폰 정보 설정]에서 쿠폰 유형·보상·대표 이미지 등을 입력해요.

ℹ️ 이 단계는 최초 1회만 설정하면 돼요. 한 번 설정해두면 이후 발행할 때마다 다시 할 필요가 없고, 유형·보상 등 설정을 바꾸고 싶을 때만 수정하면 돼요. 실제 쿠폰 발행은 2단계부터 반복돼요.

쿠폰 정보 설정 안내
ㆍ 사용할 쿠폰 유형·속성 설정 (발행 전 필수)
ㆍ 스토브 쿠폰함 사용 Y → 내정보 쿠폰함에 게임명 노출 (그룹별 오름차순)
ㆍ 게임이용권 속성은 스토어 전용
ㆍ 대표 이미지는 정보 설정 메뉴 값이 발행 이미지보다 우선
ㆍ 게임명을 스토브로 선택 시 쿠폰 점검 설정 가능


2단계. 쿠폰 발행

파트너스 [Billing > 쿠폰 관리 > 쿠폰 발행]에서 쿠폰 이름 등 기본 정보와 유형·속성을 설정해요.

쿠폰 정보 (쿠폰명·설명·보상 문구·주의사항)
ㆍ 다국어 제공, 인게임 노출 문구(아이템 보상 문구) 입력
ㆍ 쿠폰 정보 복사: 기존 쿠폰 ID 입력 시 대부분의 발행 정보를 자동으로 불러옴


쿠폰 유형 및 속성
ㆍ 사용 국가 기본값은 전체 (일부 국가만 원하면 별도 설정)
ㆍ 유형·속성은 정보 설정 메뉴 값을 불러옴 (다운로드 쿠폰은 스토어 전용, 속성은 보상 정보 연동 시 사용)
ㆍ 유형에 따라 직접 지정한 커스텀 코드(지정어) 또는 앞자리 고정(Prefix) 사용 선택


아이템 쿠폰 발행
ㆍ 아이템 선택 추가로 최대 50개까지 발행 (출석 보상 등 일괄 발행)
ㆍ 기본은 회원 번호 지급, 캐릭터번호 기준 발행 가능 (대표쿠폰 + 아이템 속성만)


할인 쿠폰 발행
ㆍ 정액·정률 설정 (정액=일부 아이템만, 정률=전체 아이템만)
ㆍ 정액은 달러 기준 자동 계산 (전월 말일 환율 반영)
ㆍ 장바구니·꾸러미 할인은 스토어 전용



할인 비용 분담
ㆍ 할인 비용·제휴사 수수료는 플랫폼·CP사 간 분담 설정 가능
ㆍ 정산에 영향을 주므로 담당자와 협의 필수


3단계. 이용자 전달

이벤트·SNS·CS 등으로 코드를 전달하고, 계정 지급·다운로드 쿠폰은 자동 적재돼요.

이벤트 참여 보상 수령



4단계. 이용자 수령

인게임 쿠폰 입력창에서 등록하거나 쿠폰함에서 자동 확인하면 보상(아이템·할인)이 지급돼요.

인게임 쿠폰 등록 예시



인게임 할인 쿠폰 사용 예시
ㆍ 인게임 할인 쿠폰은 스토어 할인 쿠폰과 달리 결제창에서 사용해요.


플랫폼·채널별 노출 위치

플랫폼/채널 노출 위치 비고
모바일 (Android) 게임 내 [쿠폰 등록] 버튼 → SDK 쿠폰 팝업 Android 권장
모바일 (iOS) 앱 내 노출 비권장 앱 내 입력 UI·외부 웹 연결 시 리젝 사유 가능 (Apple 가이드라인)
PC (Windows) 게임 내 [쿠폰 등록] 버튼 → SDK 팝업 또는 스토브·게임 공홈 멀티플랫폼 게임만 SDK 팝업
스토브 공식 웹사이트 내 정보 > 쿠폰함 통합 쿠폰 입력, 로그인 필요
게임 공식 홈페이지 자체 UI에서 스토브 쿠폰 API 연동 API 호출 필요, 디자인 커스터마이징 가능

개발하기


모바일 (SDK) - 쿠폰 사용

쿠폰 사용은 SDK가 제공하는 View.useCoupon 한 번의 호출로 끝나요. SDK가 STOVE ItemBox 서버에 사용 처리를 요청하고, 이후 게임 서버 콜백(아이템 지급)까지 이어지는 흐름을 처리해요. 쿠폰박스 리스트 검색·상세 조회·쿠폰박스 쿠폰 사용은 SDK가 아닌 서버 REST API 영역이라 서버 연동 - 아이템박스(Itembox) 섹션을 참고하세요.

iOS 적용 시 주의
Apple 가이드라인 상 앱 내부 쿠폰 입력 UI 노출은 리젝 사유가 될 수 있어요.
iOS 빌드에서는 인게임 쿠폰 입력 화면을 노출하지 마세요.

사전 준비

  • 이용자 로그인이 완료된 상태여야 해요.
  • 파트너스에 팝업 정보가 등록되어 있어야 정상 동작해요. (직접 호출 페이지 방식 제외)

알림
파트너스 설정은 퍼블리싱 기술 담당자를 통해 진행해요.

개발 흐름

  1. 쿠폰 번호 수집 : 게임 내 쿠폰 입력 화면에서 이용자가 입력한 쿠폰 번호를 받아요.
  2. 쿠폰 사용 호출 : View.useCoupon(context, code, callback)을 호출하면 SDK가 ItemBox 서버에 사용 처리를 진행해요.
  3. 결과 처리 : 콜백으로 전달된 Result로 성공/실패를 분기해요. : 실패 시 OperationUI.HandleResult(result, ...)에 위임하면 SDK 공통 안내 화면이 노출돼요.

트러블슈팅

  • ErrorCodes
    DomainErrorCodeDescription조치
    com.stove.server100PC방에서만 사용 가능한 쿠폰사용 환경 안내 메시지를 노출하고 입력 화면을 유지하세요.
    com.stove.server997Not Verify AccessTokenAuth.accessToken을 다시 조회해 재호출하세요. 동일 오류가 지속되면 로그인 흐름으로 유도해 토큰을 재발급받게 하세요.
    com.stove.server998Expired AccessToken로그인 흐름으로 유도해 토큰을 재발급받게 하세요.
    com.stove.server999System Error
    com.stove.server2605해당 멤버쉽 계정은 사용할 수 없습니다.
    com.stove.server5031일일 인증 횟수를 초과하였습니다.안내 메시지를 노출하고 일정 시간 후 재시도하도록 유도하세요.
    com.stove.server5105잘못된 쿠폰 번호입니다.쿠폰 번호 재확인 메시지를 노출하고 입력 화면을 초기화하세요.
    com.stove.server5125이미 사용한 쿠폰입니다.입력 화면을 초기화하고 사용 완료 안내를 노출하세요.
    com.stove.server5130사용 중지된 쿠폰입니다.
    com.stove.server5135유효기간이 만료된 쿠폰입니다.입력 화면을 초기화하고 만료 안내를 노출하세요.
    com.stove.server5155해당 쿠폰의 사용 가능 횟수를 초과하였습니다.입력 화면을 초기화하고 안내 메시지를 노출하세요.
    com.stove.server5161등록 기간이 만료된 쿠폰입니다.
    com.stove.server5162해당 국가에서 사용할 수 없는 쿠폰입니다.
    com.stove.server5164해당 월드에서는 사용할 수 없는 쿠폰입니다.
    com.stove.server5165쿠폰함에서만 사용 가능한 쿠폰입니다.
    com.stove.server5169해당 쿠폰의 사용 기간이 아닙니다.
    com.stove.server5200해당 쿠폰에 대한 사용 대상이 아닙니다.
    com.stove.server5202이미 쿠폰함에 등록된 쿠폰입니다.
    com.stove.server6002해당 쿠폰번호를 더 이상 사용하실 수 없습니다.
    com.stove.server6026사용 횟수가 초과 되었습니다.입력 화면을 초기화하고 안내 메시지를 노출하세요.

이용자 안내가 명확한 케이스
잘못된 쿠폰 번호(5105), 이미 사용한 쿠폰(5125), 만료된 쿠폰(5135), 사용 횟수 초과(5155 / 6026) 등은 인게임 안내 메시지로 노출하세요.
이미 만료/사용 처리된 쿠폰은 재시도가 무의미하니 입력 화면을 초기화하세요.

샘플 코드

csharp
public void UseCoupon()
{
    /**
     * code : 쿠폰 입력 (string)
     **/
    View.UseCoupon("code", (Result result) =>
    {
        if (result.IsSuccessful)
        {
        }
        else
        {
            OperationUI.HandleResult(result, (Result operationResult) =>
            {
                /** ex) 현재 화면 유지 **/
            });
        }
    });
}

Android는 SDK 제공 입력 UI도 사용 가능해요
ViewUI.coupon을 호출하면 스토브 표준 쿠폰 입력 화면이 그대로 뜨고, 이용자가 코드를 입력하면 사용 처리·아이템 지급까지 SDK가 이어서 진행해요.
(Android 전용, iOS 미지원) 자세한 사용법과 샘플 코드는 인게임 기능 — 쿠폰 사용 (Android만 가능)을 참고하세요.

PC (PCSDK) - 쿠폰 팝업

PCSDK ViewSDK가 제공하는 쿠폰 팝업 API를 사용하면 게임 클라이언트 안에서 스토브 쿠폰 입력 화면을 띄울 수 있어요. 이용자가 팝업에서 직접 쿠폰 번호를 입력하면 스토브가 사용 처리·아이템 지급 흐름을 진행해요.

PC SDK 쿠폰 팝업은 멀티플랫폼(PC + 모바일) 게임에서만 사용 가능해요.
파트너스 > Launching > 서비스 연동에서 모바일 게임으로 등록 및 멀티플랫폼 사용으로 지정된 게임이어야 호출이 정상 동작해요.
단일 플랫폼(PC 전용) 게임이라면 게임에서 자체 쿠폰 입력 UI를 만들고 쿠폰 등록 API를 직접 호출하는 흐름으로 대체해야 해요.

사전 준비

  • BaseSDK 초기화(Base_Initialize 또는 Base_InitializeEx)가 완료된 후 ViewSDK를 초기화(View_Initialize)하면 쿠폰 팝업 API를 사용할 수 있어요.
  • 게임 루프에서 Base_RunCallback()이 주기적으로 호출돼야 비동기 콜백이 동작해요.
  • 내장 WebView(WebViewMode::INTERNAL) 팝업을 사용한다면 View_Initialize 대신 View_InitializeWithWndInfo(mainWndHandle)에 게임 메인 HWND를 전달해 초기화해요.

개발 흐름

  1. 초기화 : Base_Initialize(또는 Base_InitializeEx)로 BaseSDK 초기화를 완료한 뒤 View_Initialize()를 호출해요. 내장 WebView 팝업을 사용한다면 View_Initialize 대신 View_InitializeWithWndInfo(mainWndHandle)에 게임 메인 HWND를 전달해 초기화해요.
  2. 쿠폰 팝업 호출 : 이용자가 쿠폰 입력 UI를 요청한 시점에 View_CouponPopup 또는 View_CouponPopupEx를 호출해요.
    • C/C++ : View_CouponPopup(mode, onFinished)를 호출해요. 팝업 종료 이벤트까지 받으려면 View_CouponPopupEx(mode, onFinished, onDestroy)를 사용해요. modeWebViewMode 값이에요.
    • C# : View_CouponPopup(mode, onFinished) 또는 View_CouponPopupEx(mode, onFinished, onDestroy)를 호출해요.
    • onFinished는 팝업 표시 완료 시점, onDestroy는 팝업의 네이티브 리소스가 완전히 정리된 시점에 호출돼요.
  3. WebViewMode 선택 : modeWebViewMode::EXTERNAL(외부 브라우저) 또는 WebViewMode::INTERNAL(SDK 내장 WebView) 중 게임 환경에 맞는 모드를 설정해요. : Exclusive fullscreen 모드 게임은 반드시 WebViewMode::EXTERNAL을 사용해야 해요.
  4. 종료 처리 : onDestroy 콜백을 받아 게임 흐름을 재개해요. 쿠폰 사용 후 인벤토리 새로고침이 필요하면 이 콜백 이후에 수행해요.
  5. 정리 : 쿠폰 팝업 사용을 마치면 View_UnInitialize()로 ViewSDK를 정리하고, 게임 종료 직전 Base_UnInitialize()를 호출해요.

트러블슈팅

상황원인해결 방법
쿠폰 팝업을 호출했는데 아무 반응이 없어요쿠폰 팝업은 멀티플랫폼(PC + 모바일) 게임 전용 기능이에요. 파트너스에 단일 플랫폼으로 등록된 게임에서 호출하면 동작하지 않아요.파트너스에서 게임이 멀티플랫폼으로 등록돼 있는지 확인해야 해요. 단일 플랫폼 게임이라면 게임 자체 쿠폰 입력 화면을 띄우는 흐름으로 대체하면 문제없어요.
쿠폰 팝업이 게임 창 뒤에 가려져 보이지 않아요View_Initialize로 부모 창 핸들 없이 초기화하면 팝업이 별도 윈도우로 떠서 게임 창보다 뒤로 갈 수 있어요. Exclusive fullscreen 모드에서는 내장 WebView(WebViewMode::INTERNAL) 모드 팝업이 Windows API 한계로 게임 창 위로 올라오지 못해요.View_InitializeWithWndInfo(mainWndHandle)에 게임의 메인 HWND를 전달해 초기화해야 해요. Exclusive fullscreen 모드 게임이라면 팝업을 반드시 외부 브라우저(WebViewMode::EXTERNAL) 모드로 호출하면 문제없어요.
팝업 결과 콜백이 호출되지 않아요메인 루프에서 Base_RunCallback()을 호출하지 않으면 SDK가 결과를 게임에 전달할 시점을 잡지 못해요.메인 루프에서 매 프레임 또는 일정 주기로 Base_RunCallback()을 호출해야 해요.

샘플 코드

cpp
#include "ViewSDK.h"

using namespace Stove::PCSDK;
using namespace Stove::PCSDK::Base;
using namespace Stove::PCSDK::View;

// 1) ViewSDK 초기화 (Base_Initialize 완료 이후)
auto initResult = View_Initialize();
if (!initResult.IsSuccessful())
{
    return;
}

// 2) 쿠폰 팝업 (Ex 버전: 종료 이벤트 수신)
View_CouponPopupEx(
    WebViewMode::EXTERNAL,
    [](CallbackResult openResult)
    {
        if (openResult.GetResult().IsSuccessful())
        {
            // 팝업 열림 처리
        }
    },
    [](CallbackResult destroyResult)
    {
        // 팝업 종료 시 게임 흐름 재개
    }
);

// 3) 종료 시 정리
View_UnInitialize();

서버 연동 - 아이템박스(Itembox)

이용자가 이벤트에 참여한 경우, 게임 서버는 보상 지급 요청을 수신하고 처리할 수 있도록 연동되어야 해요. 보상 지급 요청은 스토브의 아이템박스(ItemBox) 서버로부터 실시간 Callback 형태의 알림(Notification)으로 전달되며, 게임 서버는 해당 요청을 수신하여 적절한 지급 보상을 처리해주세요.

사전 준비

아래 항목이 사전에 파트너스를 통해 등록되어야 해요

  1. 아이템박스 연동타입 선택: "Stove 서버에서 게임서버로 호출 (Transaction Id 포함)" 선택. 위치: 파트너스 > Launching > 서비스 연동 > SDK 실행 환경 설정

  1. 기본 월드 등록: 월드가 필요없는 게임이라도 기본 월드를 지정해야 해요. (예: world_kr 등). 위치: 파트너스 > Launching > SDK 실행 환경(MO) > 월드/채널 정보 탭

  1. 콜백 서버 URL 등록: 아이템 지급 요청을 수신할 콜백 서버 URL을 등록해요. 위치: 파트너스 > GM > 서비스 연동 > 아이템박스 연동 환경(mo)

Loop back URL 설정 방법
콜백 서버(URL)는 CP사에서 준비되어야 하지만, 준비 전이고 파트너스 테스트가 필요하면 아래 Loop back URL 설정으로 가능해요.
Sandbox: http://i-api.gate8.com/itembox/v2/item/inboundReward
ItemBox와 통신을 위해 ACL 작업이 필요해요. 스토브 플랫폼은 별도 서비스 오픈 정책이 필요하지 않으며, 게임서버만 필시 Inbound 오픈 작업을 해주세요.

아이템지급 API

CP사에서 제공되어야 하는 API 연동 규격에 대해 설명해요.


API 연동 정보

text
POST {파트너스 등록 URL 정보}
Content-Type: application/json

Request

  • Body
NameTypeRequiredExampleDescription
msg_idStringYbaf84a85-abcc-49fc-ba85-54b7c38331e9msg ID는 아이템박스에서 게임서버로 발송될 때 마다 생성
(발송 건 별로 유니크)
msgStringY"aWLoj83ZxAICnRfjA+ayhd7nn1V/Fh/3I....3Of7N0s45uDN6DJjAjwqc="암호화 전달 복호화 필요함
timestampLongY1480512039Msg의 Timestamp (1970년 1월1일 부터 현재 시간까지의 초)
  • 암호화 전 msg payload
NameTypeRequiredExampleDescription
game_idStringY스토브_GAME게임 아이디
world_idStringYworld_global월드 아이디
member_noLongY503510플랫폼 이용자의 guid (레거시 게임의 경우 member_no)
nickname_noLongY1603829809플랫폼 이용자의 nickname_no
item_idStringYITEM_K001게임 아이템 아이디
transaction_idStringY6b384ab9d65f422db0abf186a7f79311transaction id(트랜젝션 키 값, 게임서버에서 중복 지급 판단 여부)
service_typeStringYCOUPON서비스타입
"COUPON" : 쿠폰 사용으로 발송
"EVENT" : 이벤트를 통한 발송
item_amtIntegerY3아이템 수량
reward_msgStringN사전등록 이벤트 참여 보상입니다아이템 지급 시 이용자에게 보여줄 메시지
(Coupon 생성 시, 등록하는 내용)
end_dtStringN20150116아이템 지급 만료일 (DateFormat: "yyyyMMdd", Default: 요청 시간으로부터 1달 뒤)
payloadObjectN{
"item_period" : 0
}
아이템박스에서는 CP사에서 필요로 하는 데이터를 해당 json object로 전달
(예를 들어 : 기간제 아이템인 경우 영구, 7일, 30일, 60일이 있다고 하면



Response

게임서버는 ItemBox Call API에 대한 처리 결과를 하단에 명시된 return code를 활용하여 응답(application/json 형식)해야 해요. Content-Type : application/json


  • Body
NameTypeRequiredExampleDescription
return_codeIntegerY0처리 결과 코드
return_messageStringYOK처리 결과 메시지 - 50자 이내 결과 식별 가능한 메세지 전달

  • Return Code
Return codeHTTP Status CodeDescription아이템박스 동작 및 재처리 여부
0200 ok지급 성공 (이미 지급한 transaction_id일 경우도 동일)지급 성공
40001200 ok서버 내부 오류 (API 재호출 시 아이템지급 가능한 케이스의 경우 사용)지급 실패 - 재처리 진행
40002200 ok요청한 아이템 없음지급 실패 - 재처리 미진행
40003200 ok이용자 정보 불일치지급 실패 - 재처리 미진행
40004200 ok메세지 복호화 실패지급 실패 - 재처리 미진행



Sample

  • Request
    • 암호화하지 않은 상태의 Request Body입니다. 실제 게임 서버로 전달 시 "msg" json value 부분이 암호화되어 전송됩니다.
    • 복호화 순서는 전달받은 msg dataBASE64 Decoding 처리를 하고 AES256 Decryption처리를 하셔야 합니다.
    json
    {
        "msg_id": "baf84a85-abcc-49fc-ba85-54b7c38331e9",
        "msg" :
        {
            "game_id":"STOVE_GAME",
            "world_id":"world_global",
            "member_no": 503510,
            "nickname_no": 1603829809,
            "item_id": "ITEM_K001",
            "transaction_id":"6b384ab9d65f422db0abf186a7f79311",
            "service_type":"COUPON",
            "item_amt":3,
            "reward_msg":"사전등록 이벤트 참여 보상입니다",
            "end_dt":"20150116",
            "payload":
            {
                "item_period":0
            }
        },
        "timestamp": 1480512039
    }
    
  • Response
    json
    - Content-Type : application/json
    {
        "return_code": 0,
        "return_message": "성공했습니다."
    }
    



복호화(decrypt) 과정

  • 아이템박스 시스템과 게임 서버 간 요청에 대한 안정성과 유효성 검증을 위해 전송 시 일부 데이터(Json Data - msg values)를 암호화(Encrypted)하여 전송해요. 메시지 본문을 확인하기 위해서는 복호화(decrypt) 작업이 필요해요.
  • 암호화(encrypt) 방식: AES256
  • 복호화(decrypt) 키: Client Secret Key
  • Transformation: AES/CBC/PKCS5Padding
  • IV Spec: 'Client Secret Key' 값의 앞에서 16 자리
  • 복호화 순서: 전달받은 msg data를 BASE64 Decoding 처리를 하고 AES256 Decryption 처리해야 해요.
  • Secret Key 위치: 파트너스 > Launching > 서비스 연동 > 플랫폼 연동 키 > 모바일 서비스 연동 키 > 클라이언트 Secret Key



중복 지급 방어 처리

  • transaction_id는 지급 요청이 발생하면 자동 생성되는 유니크한 값으로 게임 서버와 ItemBox 간의 아이템의 지급 누락 및
    중복 지급 방지 목적에 사용돼요.
  • 게임 서버에서는 보상 지급에 성공한 경우 transaction_id를 게임 내 저장하여 중복 지급이 되지 않도록 관리해야 해요.
  • 만약 ItemBox 서버에서 지급 완료된 transaction_id가 요청되면 게임 서버에서는 response Data "return_code"를 "0"으로 보내주면 돼요.



실패건에 대한 자동 재요청 발생

  • STOVE ItemBox 서비스는 네트워크 장애/서버 오류 등으로 게임 서버 전송이 실패되면 실패 건에 대한 재전송(retry)을
    매 10분당 1번씩 최대 5회 수행해요. 이 경우 "msg" json의 "transaction_id"는 실패 건에 대한 구분키로 사용되므로 게임 서버에서
    "transaction_id"로 지급이 성공하여 처리한 건에 대해서는 저장하고 있어야 해요.
  • 만약 게임 서버에서 지급 처리되었으나 회신 누락이나, 네트워크 오류로 인해 아이템박스 플랫폼에서 실패 처리된 경우,
    재 지급 요청이 발생할 수 있어요.

트러블슈팅

상황원인해결 방법
아이템 지급 API가 미호출돼요모든 사전 준비단계가 정상적으로 수행되지 않으면 발생해요파트너스를 통해 사전 준비 설정이 올바르게 수행되었는지 확인하세요.
CP사 서버 인프라단에서 외부로부터의 API 호출이 차단되진 않았는지도 확인하세요.
메세지 복호화를 실패해요복호화 과정이 정상적으로 수행되지 않으면 발생해요.가이드, 복호화 과정 챕터를 확인하여 정상적인 복호화 key를 사용하여 연동하세요

자주 묻는 질문



Q1. 직접지급방식과 쿠폰박스방식의 차이는 무엇인가요?
A. 직접지급방식은 쿠폰 사용 처리 시 게임에 쿠폰의 보상을 바로 지급 요청하는 방식이에요.
쿠폰박스방식은 쿠폰을 이용자의 쿠폰박스에 등록 후 관리하다가 사용하는 방식으로, 중간에 쿠폰 리스트 확인과 상세 조회 단계가 추가돼요.
Q2. iOS에서 쿠폰 등록 UI를 직접 제공하면 안 되나요?
A. Apple 가이드라인 상 외부 리워드 입력 또는 구매 유도 페이지는 제한되므로, 반드시 앱 외부에서 처리해야 해요.
iOS 앱 내에서 직접적인 쿠폰 입력 기능은 제공하지 않도록 하며, 정책 리젝 방지를 위해 명시적으로 우회 안내를 구성해주세요.
Q3. 게스트 계정도 쿠폰 입력이 가능한가요?
A. 스토브 인증(GUID 기반)을 통해 이용자 식별이 가능하다면 쿠폰 입력이 가능해요.
Q4. 쿠폰 하나에 여러 아이템을 맵핑하면 어떻게 되나요?
A. 하나의 쿠폰에 여러 아이템을 맵핑하면 맵핑된 아이템 개수만큼 게임서버로 지급 요청이 전달돼요.
인게임에서 보상에 필요한 꾸러미와 같은 상품을 만들어서 한 번의 지급 요청만 받을 수 있도록 처리해주세요.
Q5. 중복 지급을 방어하려면 어떻게 해야 하나요?
A. transaction_id를 게임 내 저장하여 중복 지급이 되지 않도록 관리해야 해요.
만약 ItemBox 서버에서 지급 완료된 transaction_id가 재요청되면 게임 서버에서는 response Data "return_code"를 "0"으로 보내주면 돼요.
Q6. ItemBox Callback이 실패하면 어떻게 되나요?
A. STOVE ItemBox 서비스는 네트워크 장애/서버 오류 등으로 게임 서버 전송이 실패되면 10분당 1번씩 최대 5회 자동 재전송(retry)을 수행해요.
재전송 시 동일한 transaction_id가 사용되므로, 게임 서버에서 이미 처리한 건은 중복 지급 없이 "0" return_code로 응답하면 돼요.
Q7. 점검이나 장애로 아이템 지급이 실패했을 때는 어떻게 처리하나요?
A. 파트너스 메뉴에서 재처리 기능이 있으며 실패 건에 대해서는 파트너스 GM > 지급 실패 초기화(mo) 메뉴에서 지급 재처리를 할 수 있어요.



직접 문의하고 싶으신가요? stove.developers@smilegate.com