-
Notifications
You must be signed in to change notification settings - Fork 8
IAP Developer Guide
< 참고 >
본 문서는 원스토어 인앱 SDK v16(API v4)에 대한 가이드 문서입니다. 최신 원스토어 인앱 SDK v17(API v5)에 대한 가이드 문서는 원스토어 개발자센터에서 제공되고 있습니다.
최신 인앱 SDK v17 가이드 문서 링크 : https://dev.onestore.co.kr/devpoc/reference/view/IAP_v17
원스토어에서 제공하는 라이브러리 / 소스코드 / 테스트 APK 를 다운로드한다.
가이드 문서는 웹에서 확인 가능하며, 별도의 파일 배포는 하지 않는다.
샘플코드는 GitHub에 공유 되며, 별도의 배포는 하지 않는다.
- 샘플코드 페이지
- Clone URL : https://github.com/ONE-store/inapp-sdk.git
프로젝트의 구분은 branch로 하며, 아래와 같이 구분한다.
- master : 기본 설명
- iap_sample_dev : IAP를 적용하여 구현한 어플리케이션 프로젝트
- unity_adaptor : Unity 환경에서 IAP 적용을 위한 샘플 라이브러리의 프로젝트
- unity_sample : unity_adaptor를 적용하여 구현한 Unity 어플리케이션 프로젝트
IAP 라이브러리는 서비스 정책의 변경, 기능의 추가 또는 버그 패치를 목적으로 비 정기적으로 업데이트될 수 있다. IAP 라이브러리가 업데이트되면 원스토어 개발자센터에 공지사항으로 안내 되고, 원스토어 개발자센터에 등록한 개발자들에게 e-mail 을 통해 공지한다.
App을 개발하는 시점에 원스토어 개발자센터에 등록되어 있는 최신의 라이브러리를 사용 하여 개발해야 한다. 그렇지 않으면, App 내에서의 인앱 상품 구매가 비정상적으로 동작할 수 있고, 원스토어 개발자센터에 App 등록이 불가할 수 있다.
IAP 를 사용하기 위해서는 상품의 AID와 인앱상품ID가 반드시 필요하며, 따라서 사전에 개발자센터에 판매할 상품과 인앱 상품을 등록해야 한다. 인앱상품의 종류는 아래와 같다.
AID만 발급하면 되므로 APK파일을 미리 업로드 할 필요는 없다.
원스토어 결제는 구글 IAB와 달리 인앱상품 Type 을 미리 구분해야 하며 개발사가 직접 consume 처리 개념이 따로 없다.
| 구분 | 내용 | 비고 |
|---|---|---|
| 소멸성 상품 | 상시 재구매/반복구매가 가능한 상품타입 | consume하지 않아도 반복 재구매가 가능함 |
| 영구성 상품 | 한 번 구매한 뒤 재구매가 불가능한 상품 타입 | |
| 기간제 상품 | 한 번 구매한 뒤 특정 기간 동안 재구매가 불가능한 상품 타입 | 잔여기간은 SDK에서 query로 확인 가능함 |
| 월자동결제 상품 | 매월 일정 금액이 자동결제가 되는 상품타입 | 월정액 해지는 SDK에서 query로 상태변경 가능 |
정식판 전환 상품은 사용을 권장하지 않음
인앱상품을 등록은 일괄등록과 개별등록 2가지 방법이 있다.
구글 플레이 개발자 콘솔, 네이버 앱스토어 개발자센터 등에서 다운로드 받은 인앱상품 목록(CSV)를 간단한 편집 후 한번에 등록할 수 있다.
- 타사 개발자콘솔에서 인앱 상품 목록을 csv 로 다운로드
- 원스토어 개발자센터 업로드 양식 다운로드 또는 링크 클릭 (그림 내 ①)
- 타사에서 받은 CSV파일을 양식에 복사/붙여넣기
- 완성된 양식 파일(xls)를 원스토어 개발자센터에 업로드 (그림 내 ②)
- 등록된 인앱상품을 확인하여
AID와product_id를 확인한다.

원스토어 개발자센터에 로그인 한 후 Apps 메뉴에 들어가서 상품등록 버튼을 누른 후 상품을 등록한다.

In-App정보 에서 인앱상품을 등록한다.
인앱상품 등록 전에 통장 등 정산정보를 먼저 등록해야 한다.

상품등록을 클릭하여 어플리케이션에서 판매할 상품 정보를 등록한다.
- 상품제목은 판매할 상품의 제목을 입력하고, 해당 상품의 종류를 선택하여 입력한다.
- 인앱 상품경로는 추후 통합 개발자센터 검증시 이용되는 정보이므로 해당 상품이 위치한 경로를 입력한다.
- 상품가격은 부가세 포함 금액을 입력한다.
- 모든 입력이 완료되었으면 저장 버튼을 클릭한다.

등록된 인앱상품을 확인하여 AID와 product_id를 확인한다.

원스토어 IAP 4버전은 사용자의 단말기에 최신 버전의 원스토어 앱과 서비스모듈 (ONE store service)이 설치되어 있어야 정상적으로 동작한다.
원스토어 앱을 실행하면 자동으로 서비스 모듈을 다운로드한다.
IAP SDK를 적용 하기에 앞서, 모델을 고려 할 필요가 있다.
여기서 모델(Model) 이라는 것은 아래 사항을 고려한 전체적인 Flow를 말한다.
- IAP SDK를 통해 구매(결제)
- 구매(결제)에 대한 인증
- App 내에서 권한을 얻는 방식
본 방식은 App Server와의 접속 없이, Smart Phone에 설치된 App 단독으로 인앱 상품를 즉시 제공하고자 할 경우에 사용된다.
App 내에 인앱 상품이 내장되어 있고, 결제가 완료되면 App내에서 구매한 인앱 상품의 사용 잠금을 해제하는 방식이다.

Flow
- App은 IAP API를 호출하여 결제 요청한다.
- IAP Plug-in은 IAP Server에 결제 요청을 송신하고 IAP Server는 결제 요청 처리 후 결제 결과를 전달한다.
- IAP Plug-in 은 결제 결과를 App에게 전달한다.
- 구매한 인앱 상품의 사용을 승인한다.
[강력 권고 흐름(Flow)] 3-1, 3-2 애플리케이션은 결제 결과 수신 후, TxID 전자영수증 검증 후 인앱 상품의 사용을 승인한다.
인앱 상품의 결제 완료 후, App에서 개발사의 App Server로 접속하여 인앱 상품에 대한 사용 권한을 요청하고 허가를 받거나 해당 상품을 다운로드 할 필요성이 있을 때 사용하는 방식이다.
원스토어에서는 App Server에서 사용 권한 확인을 위해 실시간으로 IAP Server에 구매 이력 조회를 할 수 있도록 TID 구매내역 조회 API 및 TxID 전자영수증 검증 API 를 제공한다.

Flow
- App은 IAP API를 호출하여 결제 요청한다.
- IAP Plug-in은 IAP Server에 결제 요청을 송신하고 IAP Server는 결제 요청 처리 후 결제 결과를 전달한다.
- IAP Plug-in 은 결제 결과를 App에게 전달한다.
- App은 App Server에 구매한 인앱 상품의 권한 확인을 요청한다.
- App Server에서 사용 권한을 확인한다.
- App Server의 권한 확인 결과에 따라 인앱 상품의 사용을 승인한다.
[강력 권고 흐름(Flow)] 5-1 App Server는 IAP 서버에 구매 재확인 요청 후 인앱 상품의 사용을 승인한다.
IAP SDK는 애플리케이션에서 원스토어 결제 기능을 지원하기 위한 개발 도구이다.
라이브러리는 아래 두 가지 형태로 제공된다. (현재 aar형태의 제공은 고려 중)
- Android Library (.aar)
- Java Library (.jar)
Android용 Java 라이브러리 형태로 제공되며 아래와 같은 구조로 되어 있다.
iap_plugin 폴더
L iap_plugin_[version].aar
L iap_plugin_[version].jar
IAP SDK에 포함되어 있는 라이브러리를 아래와 같이 적절히 위치시킨다.
ex: [Project폴더]/app/libs/
빌드스크립트(ex: app/build.gradle)파일에 라이브러리를 포함 할 수 있도록 설정한다.
- Java Library (.jar)
dependencies {
compile files('libs/iap_plugin_[버전]_[빌드날짜].jar')
}
- Android Library (.aar)
allprojects {
repositories {
flatDir {
dirs 'libs'
}
}
}
dependencies {
compile(name:'iap_plugin_[버전]_[빌드날짜]', ext:'aar')
}
IAP 모듈이 정상 동작하기 위해 AndroidManifest.xml 파일에 IAP 버전 정보을 반드시 설정되어야 한다. 아래의 내용이 설정되지 않으면, 정상적인 동작이 어려울 뿐만 아니라, App의 상품 등록이 실패할 수 있다.
신규버전부터는
AndroidManifest.xml에 퍼미션을 선언할 필요가 없다.또한, SDK에서 필요로 하는 런타임퍼미션에 대한 대응도, SDK에서 처리 하므로 구현할 필요가 없다.
App은 반드시 나열된 meta-data를 모두 설정 해야 한다.
name 의 값은 고정이지만, value 의 값은 API 버전에 따라서 바뀐다.
버전 16.XX.XX의 경우, 아래와 같이 입력하면 된다.
<application ...... >
<meta-data
android:name="iap:api_version"
android:value="4" />
결제 또는 쿼리(UI 노출 되는 경우) 요청 시점에는 portrait 속성을 지닌 결제 Activity가 보여진다.
결제를 요청하는 Activity가 landscape 속성이였다면, 시스템 환경 변화 이벤트가 발생하게 될 것이고 특별한 설정이 없다면 생명주기함수(ex: onDestroy)가 호출될 수 있다.
만약, Activity 에서 IapPlugin 인스턴스와 콜백 인스턴스가 재생성되어, 응답(콜백)이 정상적으로 수신되지 않는 문제가 발생할 수 있다.
간단하게는 IapPlugin을 사용하는 Activity에 아래와 같이
configChanges값을 설정하여 문제를 해결 할 수 있다.
<activity
...
android:configChanges="orientation|screenSize" />
IAP SDK는 3개의 주요 패키지를 제공한다. com.skplanet.dodo 패키지만을 이용하여, 모든 구현이 가능하다.
이전 버전에서는 구현에 도움을 주기 위해, helper와 pdu 패키지 별도로 제공했었다. 하지만, API_VERSION 4 부터는 사용할 필요가 없다. 하위 호환성을 고려하여, 안정성을 강화하여 SDK에 포함 시켰다.
| 컴포넌트 | 설명 |
|---|---|
| com.skplanet.dodo | 구현을 위한 필수 클래스가 존재 |
| com.skplanet.dodo.helper | 기존 샘플에서 제공하던 내용 |
| com.skplanet.dodo.pdu | 기존 샘플에서 제공하던 내용 |
IAP SDK는 IapPlugin 인스턴스에 요청을 하고, 리스너를 통해서 결과를 전달 받는 비동기 방식을 사용하고 있다.
인앱 상품 구매 요청 호출/응답 결과에 따른 적합한 처리는 개발자가 정의하여 구현해야 한다.
원하는 요청을 할 수 있는 클래스이다. 중복 객체를 가질 수 있으며, 각 객체 별로 Development/Release가 설정 된다.
사용이 종료 되면 exit() 메서드를 호출 해야 하며, 이후 IapPlugin에 요청을 하게 되면 런타임 Exception이 발생한다.
/**
* 요청을 위한 IapPlugin 객체 생성
*/
IapPlugin getPlugin(Context context, String pluginmMode)
...
// 디버그용
//mPlugin = IapPlugin.getPlugin(activity, IapPlugin.DEVELOPMENT_MODE);
// 상용
mPlugin = IapPlugin.getPlugin(activity, IapPlugin.RELEASE_MODE);
/**
* 결제 요청 (권장)
*/
String sendPaymentRequest(IapPlugin.RequestCallback requestCallback, PaymentParams params)
/**
* 결제 요청
*/
Bundle sendPaymentRequest(String appId, String pId, String productName, String tId, String bpInfo, IapPlugin.RequestCallback requestCallback)
/**
* 구매내역 조회
* 단일, 다중, 전체 상품 조회가 가능하다.
*/
String sendCommandPurchaseHistory(IapPlugin.RequestCallback requestCallback, ProcessType type, String appId, String... productIds)
/**
* 상품정보 가져오기
*/
String sendCommandProductInfo(IapPlugin.RequestCallback requestCallback, ProcessType type, String appId)
/**
* 구매 가능여부 체크
* 단일, 다중 상품 조회가 가능하다.
*/
String sendCommandCheckPurchasability(IapPlugin.RequestCallback requestCallback, ProcessType type, String appId, String... productIds)
/**
* 구매한 상품 상태 변경
* 정액제 상품의 경우 가입 해지, 소멸성 상품의 경우 포인트 차감 등을 요청
*/
String sendCommandChangeProductProperties(IapPlugin.RequestCallback requestCallback, ProcessType type, String appId, String action, String... productIds)
/**
* 전자 영수증 검증을 위한 함수
*/
void sendReceiptVerificationRequest(String appId, String txId, String signData, ReceiptVerificationTask.RequestCallback callback)
/**
* 종료 함수
* 이후에는 send(요청) 불가 (IllegalStateException 발생)
*/
void exit()
public interface RequestCallback {
void onResponse(IapResponse data);
void onError(String reqid, String errcode, String errmsg);
}
요청(쿼리/결제)에 대한 콜백은 해당 인터페이스를 구현한 것이어야 한다.
인터페이스를 직접 구현 하기 보다는 IapPlugin.AbsRequestCallback를 사용한 것을 추천한다.
IapPlugin.RequestCallback 인터페이스를 구현하고 있으며, 요청에 대한 결과를 받기 위한 추상 클래스이다.
인터페이스를 직접 구현하는 경우에, json결과를 String 전문으로 획득하게 되고 개별적으로 파싱을 구현해야 한다.
하지만, IapPlugin.AbsRequestCallback 추상클래스를 아래와 같이 구현하여 요청(쿼리, 결제) 시 매개변수로 전달하게 되면, 요청에 대한 결과를 데이터 클래스 형태로 받을 수 있다.
리스너는 WeakReference로 관리 되므로 메서드 내에서, 익명 클래스로 생성하여 넘기면 안된다. (SDK v16.03.00 부터는 StrongReference로 변경되었기 때문에 해당 사항 없음)
private IapPlugin.AbsRequestCallback mAbsRequestCallback = new IapPlugin.AbsRequestCallback() {
@Override
protected void onResponse(Response response) {
// 정상적인 응답을 받음
}
@Override
public void onError(String reqid, String errcode, String errmsg) {
// 에러발생
}
};
RequestCallback 인터페이스의 `onError()` 메서드로 에러 코드와 에러 메시지가 전달된다.
onError 에러 코드, 메시지 정의는 레퍼런스 를 참고한다.
- reqid 요청 아이디
- errcode 실패 코드
- errmsg 실패 메시지
원스토어 인앱 SDK 16.04부터 부정한 방법을 통한 원스토어 프로모션의 중복 참여를 막기 위한 기능이 추가되었다.
개발사는 구매 요청 시, 어플리케이션을 사용하는 개인의 고유 식별자를 전달하고 해당 사용자의 프로모션 참여 가능 여부를 같이 전달한다.
데이터 변조 방지하기 위해 고유 식별자를 Hash화 하여 전달하는 것을 권장한다.
프로모션 중복 참여 방지 파라메터 사용 방법은 레퍼런스(SDK) 탭의 sendPaymentRequest 항목을 참조하면 된다.
해당 기능은 참여 제한이 설정된 프로모션에서만 동작하며, 이는 원스토어에서 설정/관리한다.
각 설정 별로 사용자 참여 가능 여부는 아래 표를 참고.
| 사용자 고유 정보 전달 |
promotion 허용 여부 전달 |
사용자(gameUserID)의 참여 회수가 설정된 프로모션 |
기존 원스토어 프로모션 |
|---|---|---|---|
| O | O | 이벤트 참여 가능하며, 참여 회수는 설정된 기준에 따름 |
이벤트 중복 참여 가능 |
| O | X | 이벤트 참여 불가 | 이벤트 중복 참여 가능 |
| X | O | 이벤트 참여 불가 | 이벤트 중복 참여 가능 |
| X | X | 이벤트 참여 불가 | 이벤트 중복 참여 가능 |
해당 기능은 android OS 4.0 이상의 단말에서만 동작한다.
응답 클래스 (결과를 객체 형태로 가지고 있음)이다. IapPlugin.AbsRequestCallback의 onResponse 호출(콜백) 시에 매개변수로 전달 된다.
이 클래스는 서버로 부터 받은 String형태의 결과를 데이터클래스의 형태로 변환한 것이다.
기존에는 샘플프로젝트의 helper 패키지를 통해서 개발자가 직접 변환하였으나, 이번 버전 부터는 변환 후 결과를 주는 것으로 수정 되었다.
모든 필드는 public으로서 직접 접근이 가능하다.
모든 필드는 null 일 수 있다. 서버로 부터 정보를 받지 못한 부분에 대해서는 기본적으로 null이 셋팅 된다.
public class Response {
public final String api_version;
public final String identifier;
public final String method;
public final Result result;
...
}
public static class Result {
public final String message;
public final String code;
public final String txid;
public final String receipt;
public final Integer count;
public final List<Product> product;
...
}
public static class Product {
public String appid;
public String id;
public String name;
public String type;
public String kind;
public Integer validity;
public Double price;
public String startDate;
public String endDate;
public Boolean purchasability;
public Status status;
...
}
public static class Status {
public String code;
public String message;
...
}
요청 처리 타입을 정의한 enum이다.
public enum ProcessType {
BACKGROUND_ONLY,
FOREGROUND_IF_NEEDED,
}
기본적으로 FOREGROUND_IF_NEEDED을 설정을 추천한다.
요청 처리 과정에서 Ui 노출이 필요한 경우가 있다. 예를 들어,
- 퍼미션 요구 화면
- ONE Store Service(OSS) 설치 요구 화면
위와 같은 상황들이 존재한다. 이런 상황에 대해서 요청을 중지 시키고 에러를 받고 싶다면, BACKGROUND_ONLY로 요청을 하면 된다.
- 초기화
// IapPlugin 레퍼런스 선언
private IapPlugin mPlugin;
// 요청결과(쿼리/결제)를 받을 클래스 선언과 생성
private IapPlugin.AbsRequestCallback mAbsRequestCallback = new IapPlugin.AbsRequestCallback() {
@Override
protected void onResponse(Response response) {
// 응답
}
@Override
public void onError(String reqid, String errcode, String errmsg) {
// 에러
}
};
...
// 요청을 위한 객체 생성 및 레퍼런스 저장
mPlugin = IapPlugin.getPlugin(activity, IapPlugin.RELEASE_MODE);
- 결제 요청
// 결제를 위한 PaymentParams 객체 생성
PaymentParams params = new PaymentParams.Builder("OA00123456", "0910012345").build();
...
// 결제 요청
mPlugin.sendPaymentRequest(mAbsRequestCallback, params);
- 구매 내역 조회
mPlugin.sendCommandPurchaseHistory(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, "OA00123456", "0910012345");
- 상품정보 가져오기
mPlugin.sendCommandProductInfo(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, "OA00123456");
- 구매 가능여부 체크
mPlugin.sendCommandCheckPurchasability(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, "OA00123456", "0910012345");
- 구매한 상품 상태 변경
mPlugin.sendCommandChangeProductProperties(mAbsRequestCallback, ProcessType.FOREGROUND_IF_NEEDED, "OA00123456", Action.cancel_subscription.action(), "0910012345");
- 전자 영수증 검증을 위한 함수
// 요청결과(전자영수증검증)를 받을 클래스 선언과 생성
private ReceiptVerificationTask.AbsRequestCallback mRvRequestCallback = new ReceiptVerificationTask.AbsRequestCallback {
@Override
protected void onResponse(VerifyReceipt response) {
// 응답
}
@Override
public void onError(int code) {
// 에러
}
};
...
// 전자 영수증 검증 요청
mPlugin.sendVerifyReceiptRequest(mRvRequestCallback, response.result.txid, "OA00123456", response.result.receipt);
- 결제 응답
@Override
protected void onResponse(Response response) {
// 성공코드
final String successCode = "0000";
// 성공확인
if (successCode.equals(response.result.code)) {
// 결제 성공
}
}
- 구매 내역 조회
@Override
protected void onResponse(Response response) {
final String successCode = "0000"; // 조회 성공코드
if (successCode.equals(response.result.code)) {
// 특정 상품 구매 내역 확인
// 결과에는 복수개 상품이 존재 하므로, 원하는 상품을 획득
for (Response.Product p : response.result.product) {
// 상품 인증성공 체크
final String successStatusCode = "PH00";
if (successStatusCode.equals(p.status.code)) {
// Product p에서 원하는 정보를 획득
}
}
}
}
- 상품정보 가져오기
@Override
protected void onResponse(Response response) {
final String successCode = "0000"; // 조회 성공코드
if (successCode.equals(response.result.code)) {
// 특정 상품 정보 확인
// 결과에는 복수개 상품이 존재 하므로, 원하는 상품을 획득
for (Response.Product p : response.result.product) {
// Product p에서 원하는 정보를 획득
}
}
}
- 구매 가능여부 체크
@Override
protected void onResponse(Response response) {
final String successCode = "0000"; // 조회 성공코드
if (successCode.equals(response.result.code)) {
if (response.result.product != null && response.result.product.size() > 0) {
Response.Product p = response.result.product.get(0);
if (p.purchasability) {
// 구매가능
}
}
}
}
- 구매한 상품 상태 변경
@Override
protected void onResponse(Response response) {
final String successCode = "0000"; // 조회 성공코드
if (successCode.equals(response.result.code)) {
if (response.result.product != null && response.result.product.size() > 0) {
Response.Product p = response.result.product.get(0);
final String successStatusCode = "CS00"; // 상품 상태 변경 성공 결과 코드
if (successStatusCode.equals(p.status)) {
// 자동 결제 상품 해지
}
}
}
}
@Override
protected void onResponse(Response response) {
final String successCode = "0000"; // 조회 성공코드
if (successCode.equals(response.result.code)) {
if (response.result.product != null && response.result.product.size() > 0) {
Response.Product p = response.result.product.get(0);
final String successStatusCode = "SP00"; // 상품 상태 변경 성공 결과 코드
if (successStatusCode.equals(p.status)) {
// 아이템 차감 성공
}
}
}
}
- 전자 영수증 검증을 위한 함수
@Override
public void onResponse(final VerifyReceipt verifyReceipt) {
// 성공코드
final Integer successStatusCode = 0;
final String successDetailCode = "0000";
if (successStatusCode == verifyReceipt.status && successDetailCode.equals(verifyReceipt.detail)) {
if (verifyReceipt.product != null && verifyReceipt.product.size() > 0) {
VerifyReceipt.Product p = verifyReceipt.product.get(0);
// Product p에서 원하는 정보를 획득
}
}
}
앱에 IAP SDK 적용이 완료 되었으면 검증을 요청하기 전에 반드시 Self Test 과정을 거쳐야한다. 정상적인 테스트 결과로 생성된 과금 로그와 구매 내역이 있어야만, (개발자센터) 검수 절차를 거쳐 상품 판매를 개시할 수 있다.
상용 서버에 대한 추가적인 테스트는 여러가지 제약 사항이 존재한다.
따라서, 검수요청은 테스트(Self Test)를 완료 한 후, 상용서버세팅으로 전환만 하여 진행해도 된다.
[상품현황]페이지에서 [In-App]탭을 선택하여 [테스트]버튼을 클릭한다.

[테스트]버튼을 클릭하면, 아래와 같은 Self Test Pop-up 창이 나타난다. [테스트단말]탭에서 테스트에 사용할 단말들의 MDN과 시험용 T stroe Cash 등을 등록한다. 테스트 단말에 등록된 테스트번호를 사용해야 테스트가 가능하다.

Self Test 강제 설정
selfTest 를 하기 어려운 해외개발사 또는 원스토어 미지원 단말기를 사용하는 분들은 "IAP Setting App" 을 사용하시면 정상적으로 테스트를 할 수 있습니다. 위의 APP을 다운받고 아래 설명에 따라서 설정을 하기시 바랍니다.
- "Enable Setting" 을 체크하세요.
- "통신사(Carrier)"를 설정하고 "핸드폰번호(MDN)"를 입력하세요.
- 설정 앱을 끄고, 앱을 테스트 하세요.
Self Test Pop-Up 창의 [상품별 설정] 탭에서는 테스트하고자 하는 App의 인앱 상품 리스트가 표로 나타난다. 리스트에서 시험하고자 하는 임의의 인앱 상품를 선택하여 개별 인앱 상품 시험 환경 설정 페이지로 이동한다. 이동 방법은 인앱 상품의 제목을 선택하여 클릭하면 된다.

인앱 상품 시험 환경 설정 페이지에서는 다양한 결제 상황을 선택하면서 시험해 볼 수 있다. [결과설정]에 제시된 값들 중 하나를 선택하여 [저장] 버튼을 누르면 앞서의 인앱 상품 목록 화면으로 이동한다.
[결과설정]에서 "정상"을 선택했을 때만 과금이 이루어지고, 나머지 값을 선택하면 과금이 이루어 지지 않아야 한다.

개발 완료한 앱을 실행한 뒤 결과 설정을 완료한 인앱 상품을 구매하여 테스트한다. 결제가 성공하면 해당 인앱 상품의 테스트 결과가 아래와 같이 Y로 변경된다.

Self Test Pop-up 창의 [과금 로그 조회] 탭에서는 이전 단계에서 설정한 시험 환경에 맞추어 시험한 결과를 확인한다. [결과설정 과금결과]열에는 이전 단계에서 설정한 "결과설정" 값과 과금의 정상 여부가 "성공" 또는 "실패"로 표시된다.

과금 결과가 "실패"인 과금 로그를 선택하면 아래와 같이 과금 로그 상세 페이지로 바뀌면서, 실패 원인에 대한 설명을 볼 수 있다.

상품의 상태에 따라서, 상용테스트가 가능한 것이 다르며 불가 할 수도 있다.
- 등록중 : 테스트 불가, 인앱SDK와 연동 과정에서, -1001에러가 발생 (참고 : 레퍼런스(Result-Code))
-
검증중
- 신규 검증의 경우 : 테스트 불가 (판매중인 상품이 없는 상태)
- 앱 업데이트 검증의 경우 : 판매중인 상품 에 대해서만 테스트 가능
- 판매중 : 테스트 가능
IAP 상품은 원스토어 개발자센터의 App 검증을 통해서 상용 결제 테스트를 완료해야만 배포 및 판매가 가능하다. Self Test가 완료되면, 개발자는 앱에 적용된 개발용 서버 세팅을 상용 서버 세팅으로 변경하여 빌드한 다음 검증을 요청한다.
인앱 상품의 테스트 결과가
Y가 아닌 상품이 하나라도 있으면 검증 요청 버튼이 활성화 되지 않는다. 보다 상세한 내용은 상품 등록 가이드 를 참고
// 디버그용
//mPlugin = IapPlugin.getPlugin(activity, IapPlugin.DEVELOPMENT_MODE);
// 상용
mPlugin = IapPlugin.getPlugin(activity, IapPlugin.RELEASE_MODE);
이용자가 구매한 인앱상품에 대해서 아이템 미지급 등의 이유로 구매취소를 요청할 경우, 취소 절차는 다음과 같다.
- 이용자가 개발사 또는 원스토어 고객센터에 구매취소 요청
- 개발사가 개발자센터에서 결제이력 확인 후 구매취소 요청
- 원스토어 담당부서에서 확인 후 구매취소 처리
고객의 구매이력을 확일할 수 있는 방법은 아래와 같다.
- 개발자센터 > 고객지원 > TxID 구매이력 관리
- 개발자센터 > 직접 문의하기 > 고객VOC > 상세보기(팝업)
보다 상세한 내용은 고객 관리하기가이드를 참고한다.
- 시작하기
- 회원 가입하기
- 상품 등록하기
- 인앱 개발하기
- ARM 개발하기
- 연동규격 개발하기
- 통계 및 정산하기
- 고객 관리하기
- 약관&법률 및 지적재산권센터
- 개발자 가이드
- 소프트웨어 판매약관
- 개발자센터 이용약관
- 개인정보 처리방침
- 개인정보 수집 및 이용안내
- 지적재산권보호센터
- 개인정보 처리방침_원스토어 북스 STUDIO
- 개인정보 처리방침_원스토어 북스 STUDIO__20170531
- 개인정보 처리방침_원스토어 북스 STUDIO__20190320
- 개인정보 처리방침_원스토어 북스 STUDIO__20190520
- 개인정보 처리방침_원스토어 북스 STUDIO__20200117
- 개인정보 처리방침_원스토어 북스 STUDIO__20200203
- 개인정보 처리방침_원스토어 북스 STUDIO__20200729
- 개인정보 처리방침_원스토어 북스 STUDIO__20201222
- 개인정보 처리방침_원스토어 북스 STUDIO__20211027
- 개인정보 처리방침_원스토어 북스 STUDIO__20211201
- 약관&법률(작가)