목차 1. Samsung In-App Purchase 소개 다운로드 IAP 3.0 Helper & Sample IAP 3 제약사항 IAP 3 개발모드 지원상품타입 IAP 3

Similar documents
어댑터뷰

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

13ÀåÃß°¡ºÐ

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

( )부록

리니어레이아웃 - 2 -

03장

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

INAPP결제 API 가이드

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

PowerPoint Template

신림프로그래머_클린코드.key

Microsoft PowerPoint - 04-UDP Programming.ppt

JUNIT 실습및발표

Facebook API

C++ Programming

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

PowerPoint 프레젠테이션

슬라이드 1

Interstage5 SOAP서비스 설정 가이드

학습목표 선언하여디자인을하는방법을이해하고, 실행할수있다. 시작화면을만드는방법과대체리소스를사용하는방법을이해하고실행할수있다. About 과같은상자를구현하고, 테마를적용하는법을이해하고실행할수있다.

PowerPoint Presentation

OpenCV와 함께하는 컴퓨터 비전 프로그래밍 캠프

01장

JAVA PROGRAMMING 실습 08.다형성

이것은리스트뷰의 setadapter 메소드에잘표현되어있습니다. setadapter 는리스트뷰에사용할데이터객체를넘겨주는메소드입니다. 일반적으로생각한다면 ArrayAdapter 객체를생성하여사용할데이터를저장할것이고데이터가저장된 ArrayAdapter 객체를 setadapt

윈도우시스템프로그래밍

Windows 8에서 BioStar 1 설치하기

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

오핀 (OFIN) SDK Guide Fintech Mobile SDK Guide - Android V 1.0 OPPFLIB 1

슬라이드 1

슬라이드 1

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

안드로이드2_14

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

DocsPin_Korean.pages

PowerPoint Presentation

50_1953.pdf

슬라이드 1

09-interface.key

Microsoft Word - src.doc

PowerPoint 프레젠테이션

Daum 카페

Cluster management software

SBR-100S User Manual

Design Issues

Microsoft PowerPoint - CSharp-10-예외처리

슬라이드 1

ISP and CodeVisionAVR C Compiler.hwp

rmi_박준용_final.PDF

PowerPoint Presentation

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

Secure Programming Lecture1 : Introduction

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

PowerPoint Presentation

Microsoft PowerPoint - Java7.pptx

View Licenses and Services (customer)

슬라이드 1

Spring Boot/JDBC JdbcTemplate/CRUD 예제

슬라이드 1

02 C h a p t e r Java

ALTIBASE 사용자가이드 Templete

JMF3_심빈구.PDF

Microsoft Word - Armjtag_문서1.doc

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

MasoJava4_Dongbin.PDF

REMON Android SDK GUIDE (SDK Version 1.4.1) 1 / 25

1

헬로, 안드로이드 13 주차 SQL 활용하기 (2) 강대기동서대학교컴퓨터정보공학부

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

Android Master Key Vulnerability

C# Programming Guide - Types

쉽게 풀어쓴 C 프로그래밊

07 자바의 다양한 클래스.key

2_안드로이드UI

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

NTD36HD Manual

Google Maps Android API v2

Dialog Box 실행파일을 Web에 포함시키는 방법

슬라이드 1

PowerPoint 프레젠테이션

// 화면을터치하였을때해야할작업구현 case MotionEvent.ACTION_MOVE: // 화면을드래그하였때 // 화면을드래그하였을때해야할작업구현 case MotionEvent.ACTION_UP: // 화면에서터치가사라질때 // 화면에서터치가사라질때해야할자업구현 c

Network Programming

12-file.key

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

SMART ZONE CAST ANDROID SDK 적용가이드 NIT

JAVA PROGRAMMING 실습 09. 예외처리

Transcription:

Samsung In-App Purchase v3.0 Programming Guide

목차 1. Samsung In-App Purchase... 4 1.1 소개... 4 1.2 다운로드 IAP 3.0 Helper & Sample... 6 1.3 IAP 3 제약사항... 6 1.4 IAP 3 개발모드... 6 1.5 지원상품타입... 8 2. IAP 3 Helper Programming... 8 2.1 새안드로이드프로젝트생성... 9 2.2 IAP Helper 추가... 9 2.3 AndroidManifest.xml 수정... 9 2.4 IAP 연동기능개발... 11 1) 구매하기... 11 2) 구매목록가져오기... 14 3) 캐싱된구매목록가져오기 ( IAP 3.0 Helper 부터지원 )... 23 4) 상품목록가져오기... 26 3. IAP 3 Helper Reference... 30 3.1 SamsungIapHelper... 30 1) getinstance( Context, int )... 30 2) (Deprecated) startpayment( String, String, boolean, OnPaymentListener )... 30 3) startpayment( String, boolean, OnPaymentListener )... 31 4) (Deprecated) getiteminboxlist( String, int, int, String, String, OnGetInboxListener )... 31 5) getiteminboxlist( int, int, String, String, OnGetInboxListener )... 32 6) getiteminboxlist( String, OnGetInboxListener )... 33 7) (Deprecated) getitemlist( String, int, int, String, int, OnGetItemListener )... 33 8) getitemlist( int, int, String, int, OnGetItemListener )... 34 3.2 Result Callback Interface... 35 1) OnPaymentListener... 35 2) OnGetInboxListener... 35 3) OnGetItemListener... 36 3.3 Value Object... 36 1) PurchaseVo 구매결과정보... 36 2) ItemVo 상품정보... 37 3) InboxVo 구매내역정보... 37 4) ErrorVo 요청처리결과... 38 5) VerificationVo 결제유효성검사결과... 38 3.4 Response Code... 39 4. IAP Server-to-Server API Reference... 40 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 2

4.1 appsitemverifyiapreceipt... 40 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 3

1. Samsung In-App Purchase 1.1 소개 Samsung In-App Purchase( 이하 IAP라함 ) 는 3 rd Party Application 내에서삼성결제서비스를연동할수있도록지원하고있습니다. Version 1 에서는 jar 형태의라이브러리로연동하는방식이었으나 Version 2 에서부터는 Application간의독립성을보장하기위해서별도의안드로이드패키지로제공하고있습니다. 이를위해서 IAP와 3 rd Party Application과는 AIDL(Android Interface Definition Language) 방식으로통신하게됩니다. 이런방식은많은장점이있지만 IAP Service 연동, 삼성어카운트연동, IAP 패키지유효성검사 등의다양한처리가요구되기때문에안드로이드에대한전문적인지식뿐만아니라삼성서비스 들에대한이해를필요로합니다. 그래서좀더쉽게 IAP 와연동할수있도록 Version 2 부터별도의 Helper Class 를제공하게되었습 니다. 다음그림은 IAP Helper 를통해서 3 rd Party 어플리케이션이 IAP 와연동하는과정을보여주 고있습니다. 3 rd Party Application 에서는단지 IAP Helper 의 SamsungIapHelper 의메소드를호출하고그최종 결과만처리하면됩니다. 다음은 IAP Helper 를이용해서구매하는기능을구현한소스코드입니다. public class PurchaseActivity extends Activity implements OnPaymentListener private SamsungIapHelper miaphelper = null;... Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 4

protected void oncreate( Bundle savedinstancestate ) super.oncreate( savedinstancestate ); setcontentview( R.layout.activity_main ); miaphelper = SamsungIapHelper.getInstance( this, MODE ); public void dopurchase( View _view ) miaphelper.startpayment(item_id, true, this ); @Override public void onpayment( ErrorVo _errorvo, PurchaseVo _purchasevo )... // 여기에서결제성공 / 실패처리를한다. IAP Version 3 가새롭게릴리즈되었습니다. Version 3 에서달라진점은다음과같습니다. 1. 자동갱신기간제 (Auto-Recurring Subscriptions) 상품기능제공기존에는지정한기간이끝나면종료되는기간제상품만제공하였으나, 매월결제가자동으로갱신되는기간제상품이추가되었습니다. 2. ItemGroupId 제거기존에는 3 rd party application을구분하기위해서갤럭시앱스에서 application마다생성해주는 12자리숫자 ItemGroupId를사용하였으나 application을식별하고관리하기에어려움이있어서 ItemGroupId를 3 rd party application의 PackageName으로변경했습니다. 따라서모든 IAP Helper의 Method에서 ItemGroupId를전달할필요가없어졌습니다. 3. 자유롭게생성할수있는 Item Id Version 2.0까지는갤럭시앱스에서임의로생성하는 12자리숫자를상품에대한 ID로사용하였지만아이템식별과 ID 관리상의어려움이있어서 3 rd party 관리자가 GUN, machinegun, bullet 과같이임으로지정한값을사용할수있도록개선되었습니다. 4. 캐싱된구매목록가져오기추가. 기존에는 3 rd party application 내의모든아이템에대해서기간과수량을지정하여구매목록을요청하였지만새롭게추가된캐싱된구매목록가져오기는지정된상품들에대해서만구매목록을요청할수있도록지원하고있습니다. 특히, 클라이언트사이드캐싱을지원하기때문에좀더빠른응답을보장받을수있습니다. 위와같이 IAP 가개편됨에따라서 IAP Helper 도일부수정되어함께배포되고있습니다. 또한기 존 IAP Version 2 사용자는다음과같은작은변경사항을확인할필요가있습니다. 1. IAP Version 2 에서사용하던 IAP Library 용어가 IAP Helper 로변경되었습니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 5

2. IAP Helper 및 Sample 의패키지명이 com.sec.android.iap 에서 com.samsung.android.sdk.iap 로 변경되었습니다. 3. IAP SDK 의개발환경이 Eclipse 에서 Android Studio 로변경되었습니다. 이제단계별로 IAP Helper 를이용하는방법을구체적인예제를통해서알아보도록하겠습니다. 1.2 다운로드 IAP 3.0 Helper & Sample 삼성개발자사이트의 IAP 부분에서아래의 IAP SDK 파일을다운로드받습니다. SamsungInAppPurchaseSDK_v3.x.x.zip 위압축파일은다음과같이 IAP 3.0 Helper 와 Helper 를활용한샘플소스코드로구성되어있습니 다. 번호 위치 프로젝트 설명 1./Libs AIDL Interface IAP3.0과연동을위한 AIDL Interface 2./Sample/IAP3Helper IAP3Helper IAP3.0과연동을위한 Helper 프로젝트 (AIDL Interface 포함 ) 3./Sample/IAP3Sample IAP3Sample IAP3Helper를이용한샘플어플리케이션프로젝트 제공되는 Helper 와샘플의기준개발환경은다음과같습니다. Android Studio 1.1.0 1.3 IAP 3 제약사항 IAP는안드로이드 API 14부터지원합니다. 그이하의버전에서는정상적으로동작하지않습니다. IAP는삼성전자단말기에서만동작합니다. 그이외의제조사단말기에서는동작하지않습니다. 그이외의제약사항은없습니다. 1.4 IAP 3 개발모드 IAP 는과금때문에결제서비스를테스트하는것이쉽지않습니다. IAP 는다양한상황에서테스트 할수있도록다음과같은 3 가지의모드를지원하고있습니다. Mode 값설명 운영모드 0 운영모드입니다. Release 할때는반드시운영모드로설정해야합 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 6

니다. 운영모드에서만실제결제가발생합니다. 개발자테스트모드 ( 성공 ) 개발자테스트모드 ( 실패 ) 1 항상성공결과를반환하는테스트모드입니다. -1 항상실패결과를반환하는테스트모드입니다. 모드는구매, 구매목록, 상품목록을가져오기위해서 Helper의 getinstance() 로인스턴스를얻을때파라메터로설정을할수있습니다. 개발시에는항상성공결과를넘겨주는 1이나항상실패결과를넘겨주는 -1 로설정하여다양한상황에대해서충분히테스트를하고 Release 할때는반드시운영모드로수정해야합니다. 테스트모드로 Release 했을경우에는실제결제가발생하지않습니다. 간혹 3 rd party 에서테스트모드로 Release 하는경우가있어서 IAP는다음과같이개발자모드로설정되어있음을알리는팝업을보여줍니다. 이팝업을보셨다면반드시모드값을확인하시기바랍니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 7

1.5 지원상품타입 IAP 3 에서는아래와같이다양한상품타입을지원합니다. 타입설명 Consumable 구매한상품을사용하면상품이소진되는경우로재구매가가능한상품 ( 소모성상품 ) 입니다. 예 : 게임에서총알과같은소모성상품 NonConsumable 구매한상품에대해서영구적으로재사용이가능한상품으로재구매가 ( 비소모성상품 ) 불가능한상품입니다. 예 : 단행본책과같이한번구입하면재구매할필요가없는비소모성상품 참고 : 비소모성상품은특성상재구매테스트를할수가없습니다. 이를위해운영모드 ( 0 ) 가아닌테스트모드 ( 1 ) 에서는반복테스트를위해 10분마다재구매가가능하도록초기화됩니다. Non-Recurring 구매한상품에대해서일정기간이지나면재구매가가능한상품입니다. Subscription 예 : 월간잡지나기간제이용권과같이구매한후에일정기간이지나 ( 기간제상품 ) 면재구매가가능한상품. Auto-Recurring 매달자동으로재구매가되는상품입니다. Subscriptions ( 자동갱신기간제상품 ) All( 전체 ) 위세가지타입을모두포함한다. 2. IAP 3 Helper Programming 3rd Party Application 에서 IAP 의결제서비스를사용하기위해서는아래와같은과정으로진행되 어야합니다. 1 새안드로이드프로젝트생성 2 IAP Helper 프로젝트추가 3 AndroidManifest.xml 수정 4 IAP 연동기능개발 본문서에서사용된개발환경은 Android Studio 1.1.0 입니다. 본가이드문서의모든내용은이 개발환경을기준으로합니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 8

2.1 새안드로이드프로젝트생성 여기부터는 IAP 기능을사용하는 3 rd Party Application 영역입니다. IAP 기능을사용하는어플리케이션을위한새로운프로젝트를생성해보도록하겠습니다. File -> New Project 메뉴를선택하면새로운안드로이드어플리케이션을생성하는화면이나타납니다. Application Name 은 IAP3Sample 로 Package Name 은 iap3helper.sample.example 로정했습니다. 각 자원하는이름으로입력하시면됩니다. Next 버튼을클릭하고 Minimum SDK 는 API 14 이상으로 선택합니다. 주의 IAP 3.0 부터는 Item Group ID 대신 Package Name 으로어플리케이션을구분하기때문에갤럭시 앱스에등록되어있는 application 패키지명으로지정해야오류없이테스트할수있습니다. Next 버튼을다시클릭하고, Blank Activity 를선택하고 Next 버튼을클릭합니다. Activity 이름과레이아웃이름은기본값을사용하고 Finish 버튼을클릭하면새로운프로젝트가 생성됩니다. 2.2 IAP Helper 추가 이제새로생성한 IAP3Sample 프로젝트에 IAP Helper 프로젝트를추가해야합니다. Project Explorer에서 IAP3Sample 프로젝트를선택하고마우스오른쪽버튼을클릭해서 New -> Module를선택합니다. Import Existing Project를선택하고 Next를 Click 후 Source Directory에서 IAP3Helper 폴더를찾아지정후 Finish를클릭하여추가합니다. 다시 Project Explorer에서 IAP3Sample 프로젝트를선택하고마우스오른쪽버튼을클릭후 Open Module Settings를선택하거나 F4 키로 Project Structure 화면으로이동합니다. IAP3Sample Modules을선택후 Dependencies 탭을클릭하여 + 버튼을선택하면 Choose Modules 화면으로이동합니다. IAP3Helper를선택후 Ok 버튼을클릭하여추가를완료합니다. 2.3 AndroidManifest.xml 수정 아래설명될 AndroidManifest 의권한과 Activity 추가는변경없이고정해서사용되어야합니다. 그래서 IAP Helper 의 AndroidManifest.xml 파일에주석으로포함되어있으니이를복사해서사용 하시면안전하고편리합니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 9

1) 권한추가 IAP 연동을위해서는 com.sec.android.iap.permission.billing 권한이필요합니다. 또한, IAP 는네트워크통신을사용하기때문에 android.permission.internet 권한도추가해야합니다. AndroidManifest.xml에아래와같이권한을추가합니다. <uses-permission android:name="com.sec.android.iap.permission.billing"/> <uses-permission android:name="android.permission.internet"/> 2) IAP Helper 에포함된 Activity 추가 IAP Helper 는투명한 Activity 를통해서 3 rd Party 어플리케이션과통신을하게됩니다. 그래서다 음의세가지 Activity 를 AndroidManifest 파일에추가해야합니다. Activity 이름 com.samsung.android.sdk.iap.li b.activity.inboxactivity com.samsung.android.sdk.iap.li b.activity.paymentactivity com.samsung.android.sdk.iap.li b.activity.itemactivity 설명구매내역을요청하기위해서필요한 Activity 구매요청을위해서필요한 Activity 상품목록을요청하기위해서필요한 Activity <activity android:name="com.samsung.android.sdk.iap.lib.activity.inboxactivity" android:theme="@style/theme.empty" android:configchanges="orientation screensize"/> <activity android:name="com.samsung.android.sdk.iap.lib.activity.paymentactivity" android:theme="@style/theme.empty" android:configchanges="orientation screensize"/> <activity android:name=" com.samsung.android.sdk.iap.lib.activity.itemactivity" android:theme="@style/theme.empty" android:configchanges="orientation screensize"/> 주의 : 위 3 개의 Activity 는투명해야하기때문에모두 android:theme= @style/theme.empty 로설정하고있습니다. 만약투명한테마를지정하지않는다면이 Activity 들이여러분의 Application 을가리는현상이발생하게됩니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 10

2.4 IAP 연동기능개발 1) 구매하기 다음과같이 activity_main.xml 레이아웃을수정해서구매버튼을추가하고구매버튼이클릭되었 을때 dopurchase 메소드가호출되도록했습니다. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" > <!-- Purchase Button --> <Button android:id="@+id/btn_purchase_one_item" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/purchase_one_item" android:onclick="dopurchase"/> </LinearLayout> 이제 MainActivity.java 에서 dopurchase 메소드에서 IAP 에결제를요청하는코드를아래와같 이작성했습니다. public class MainActivity extends Activity implements OnPaymentListener private static final int MODE = SamsungIapHelper.IAP_MODE_COMMERCIAL; // Please change the ITEM_ID for your application. // ======================================================================== private static final String ITEM_ID = "Nuclear"; // ======================================================================== private SamsungIapHelper miaphelper = null; @Override protected void oncreate( Bundle savedinstancestate ) super.oncreate(savedinstancestate); setcontentview( R.layout.activity_main ); miaphelper = SamsungIapHelper.getInstance( this, MODE ); public void dopurchase( View _view ) miaphelper.startpayment( ITEM_ID, true, this ); Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 11

@Override public void onpayment( ErrorVo _errorvo, PurchaseVo _purchasevo ) // 여기에서결제성공 / 실패처리를한다. 위소스코드에서 IAP에구매를요청하는부분은 dopurchase 메소드내부의단한줄입니다. oncreate 메소드에서 SamsungIapHelper를생성하고 dopurchase에서는 startpayment 메소드만호출하면됩니다. 단 startpayment 메소드의세번째인자는 OnPaymentListener 타입이고결제결과를받는콜백메소드 onpayment를위한인터페이스입니다. 위 Activity는 OnPaymentListener를구현하고있기때문에 this가인자로들어갔습니다. 기존에복잡했던초기화과정은모두 IAP Helper 내부에서처리되고구매결과만 onpayment 인 터페이스로들어오게됩니다. Reference startpayment( String, boolean, OnPaymentListener ) 메소드 OnPaymentListener 인터페이스 deprecated method startpayment( String String, boolean, OnPaymentListener ) 이제다음과같이 onpayment 메소드에서결제성공시에 PurchaseVo 값을보여주는코드를추가 해보도록하겠습니다. 여러분의어플리케이션에서결제가성공또는실패시에어떤처리를해 야한다면여기에서하시면됩니다. @Override public void onpayment( ErrorVo _errorvo, PurchaseVo _purchasevo ) AlertDialog.Builder alert = new AlertDialog.Builder( this ); alert.setpositivebutton( android.r.string.ok, new DialogInterface.OnClickListener() @Override public void onclick( DialogInterface dialog, int which ) dialog.dismiss(); ); if( _errorvo!= null ) // If Payment is finished Successfully Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 12

// ================================================================ if( _errorvo.geterrorcode() == SamsungIapHelper.IAP_ERROR_NONE ) alert.settitle( _errorvo.geterrorstring() ); alert.setmessage( _purchasevo.dump() ); // ================================================================ // If Payment is failed // ================================================================ else alert.settitle( "ERROR" ); alert.setmessage( _errorvo.geterrorstring() ); // ================================================================ else alert.settitle( "ERROR" ); alert.setmessage( "ErrorVo is null" ); alert.show(); 이것으로구매를위한모든코딩이완료되었습니다. 실행을해보면다음그림과같은 MainActivity가화면에나타납니다. MainActivity 화면에서 l Purchase 버튼을클릭하면삼성어카운트패스워드를확인하는 Confirm Password 화면이나타납니다. 이화면에서 2 패스워드를입력하고 3 Confirm 버튼을클릭하면결제방법을선택하는화면이나타납니다. 이화면에서 4 결제방법을선택하고 5 Buy 버튼을클릭하면비로소 IAP의구매프로세스가진행됩니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 13

구매절차가모두완료되고결제가성공하면다음과같은팝업을확인할수있을것입니다. 참고 IAP Helper에서는악의적인구매를방지하기위해서 Client-to-Server Verification을기본제공하고있습니다. 좀더안전한거래를위해서는 Server-to-Server Verification을권장합니다. Server-to- Server Verification에대해서좀더자세히알고싶으신분들은 4. IAP Server-to-Server API Reference를참고하시기바랍니다. 2) 구매목록가져오기 이제사용자가구매한내역을가져오는코드를작성해보도록하겠습니다. 이부분도구매요청과 크게다르지않습니다. 여기서는구매목록을 ListView 를통해서보여주기위해서별도의 InboxListActivity 를추가하도록하겠습니다. 우선 activity_main.xml 레이아웃의구매버튼아래에 InboxListActivity 를실행하는버튼을하나추 가하고클릭되었을때 dogetinboxlist 메소드가호출되도록설정합니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 14

<!-- InboxList Button --> <Button android:id="@+id/btn_get_inbox_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="inboxlist" android:onclick="dogetinboxlist" /> 다음으로 MainActivity.java 에서 dogetinboxlist 메소드를다음과같이구현합니다. 필요한정보들 을 intent 에세팅하고 InboxListActivity 를실행하는내용입니다. public void dogetinboxlist( View _view ) Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat( "yyyymmdd", Locale.getDefault() ); String today = sdf.format( d ); Intent intent = new Intent( MainActivity.this, InboxListActivity.class ); intent.putextra( "IapMode", MODE ); intent.putextra( "StartNum", 1 ); intent.putextra( "EndNum", 15 ); intent.putextra( "StartDate", "20130101" ); intent.putextra( "EndDate", today ); startactivity( intent ); 버튼을누르면 InboxListActivity 의 oncreate 메소드에서 intent 로넘어온값들을저장하고받은값 들을기반으로 IAP 에구매목록을요청하게됩니다. 관련코드는아래와같습니다. public class InboxListActivity extends Activity implements OnGetInboxListener private int miapmode = 1; private int mstartnum = 0; private int mendnum = 0; private String mstartdate = ""; private String menddate = ""; private SamsungIapHelper miaphelper = null; @Override protected void oncreate( Bundle savedinstancestate ) super.oncreate( savedinstancestate ); Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 15

Intent intent = getintent(); if( intent!= null && intent.getextras()!= null && intent.getextras().containskey( "IapMode" ) && intent.getextras().containskey( "StartNum" ) && intent.getextras().containskey( "EndNum" ) && intent.getextras().containskey( "StartDate" ) && intent.getextras().containskey( "EndDate" ) ) Bundle extras = intent.getextras(); miapmode = extras.getint( "IapMode" ); mstartnum = extras.getint( "StartNum" ); mendnum = extras.getint( "EndNum" ); mstartdate = extras.getstring( "StartDate" ); menddate = extras.getstring( "EndDate" ); else Toast.makeText( this, R.string.invalid_parameter, Toast.LENGTH_LONG ).show(); finish(); miaphelper = SamsungIapHelper.getInstance( this, miapmode ); miaphelper.getiteminboxlist( mstartnum, mendnum, mstartdate, menddate, this ); @Override public void ongetiteminbox ( ErrorVo _errorvo, ) ArrayList<InboxVo> _inboxlist 복잡해보이지만대부분 MainActivity에서전달된값들을저장하는코드일뿐입니다. 사실 IAP에구매목록을요청하는부분은노란색으로표시된단두줄뿐입니다. 구매요청과마찬가지로최종결과는 OnGetInboxListener 인터페이스의 ongetiteminbox 메소드로들어옵니다. 실행해보면지금은 ongetiteminbox에아무런코드도들어있지않기때문에결과를눈으로확인할수는없지만 IAP와실제로연동되어그결과를 ongetiteminbox로전송되는것을확인할수있을것입니다. Reference getiteminboxlist( int, int, String, String, OnGetInboxListener ) 메소드 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 16

OnGetInboxListener 인터페이스 Deprecated method getiteminboxlist( String, int, int, String, String, OnGetInboxListener ) 주의 getiteminboxlist 는모드와관계없이모든구매이력을전달합니다. InboxListActivity 를 AndroidManifest.xml 파일에다음과같이추가해야합니다. <activity android:name=".inboxlistactivity" android:label="@string/items_inbox_list" > </activity> 이제 ongetiteminbox 메소드에 ListView 에데이터를추가하는코드를작성하도록하겠습니다. 우 선 InboxListActivity oncreate 메소드에다음코드를추가합니다. 이코드는 Activity 에뷰를제공 하고그뷰들을초기화하는코드입니다. setcontentview( R.layout.inbox_list_layout ); initview(); inbox_list_layout.xml 은다음과같이구성되어있습니다. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical"> <!-- Item Inbox List ListView --> <ListView android:id="@+id/iteminboxlist" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:visibility="gone"/> <!-- Item Inbox List NULL --> <TextView android:id="@+id/nodatatext" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text=" @string/items_inbox_list_is_empty"/> Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 17

</LinearLayout> initview 메소드코드는다음과같습니다. public void initview() minboxlistview = (ListView)findViewById( R.id.itemInboxList ); mnodatatextview = (TextView)findViewById( R.id.noDataText ); mnodatatextview.setvisibility( View.GONE ); minboxlistview.setemptyview( mnodatatextview ); minboxlistadapter = new InboxListAdapter( this, R.layout.inbox_row, minboxlist ); minboxlistview.setadapter( minboxlistadapter ); 그다음으로아래멤버변수들을 InboxListActivity에추가합니다. private ListView minboxlistview = null; private TextView mnodatatextview = null; private ArrayList<InboxVo> minboxlist = new ArrayList<InboxVo>(); private InboxListAdapter minboxlistadapter = null; 위코드에서 minboxlistadapter 가있는데이것은리스트뷰의각 row 에대한뷰를제공하는역할 을하는 AdapterView 입니다. 이와관련된설명을본문서의범위를벗어나기때문에별도로설명 하지는않겠습니다. InboxListAdapter 는다음과같이구성되어있습니다. public class InboxListAdapter extends ArrayAdapter<InboxVo> private int mresid = 0; private LayoutInflater minflater = null; private ArrayList<InboxVo> mitems = null; public InboxListAdapter ( Context int ) ArrayList<InboxVo> _context, _resid, _items super( _context, _resid, _items ); mresid = _resid; mitems = _items; minflater = (LayoutInflater)_context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 18

public static class ViewHolder TextView itemname; TextView itempricestring; TextView itemtype; TextView paymentid; TextView purchasedate; TextView expiredate; @Override public View getview ( final int View ) final ViewGroup _position, _convertview, _parent final InboxVo vo = mitems.get( _position ); ViewHolder vh; View v = _convertview; if( v == null ) vh = new ViewHolder(); v = minflater.inflate( mresid, null ); vh.itemname = (TextView)v.findViewById( R.id.itemName ); vh.itempricestring = (TextView)v.findViewById( R.id.itemPriceString ); vh.itemtype = (TextView)v.findViewById( R.id.itemType ); vh.paymentid = (TextView)v.findViewById( R.id.paymentId ); vh.purchasedate = (TextView)v.findViewById( R.id.purchaseDate ); vh.expiredate = (TextView)v.findViewById( R.id.expireDate ); v.settag( vh ); else vh = (ViewHolder)v.getTag(); vh.itemname.settext( vo.getitemname() ); vh.itempricestring.settext( vo.getitempricestring() ); String itemtype = "Type : "; if( true == "00".equals( vo.gettype() ) ) itemtype += "Consumable"; vh.expiredate.setvisibility( View.GONE ); else if( true == "01".equals( vo.gettype() ) ) itemtype += "NonConsumable"; Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 19

vh.expiredate.setvisibility( View.GONE ); else if( true == "02".equals( vo.gettype() ) ) itemtype += "Subscription"; vh.expiredate.setvisibility( View.VISIBLE ); else if( true == "03".equals( vo.gettype() ) ) itemtype += "Auto Recurring Subscription"; vh.expiredate.setvisibility( View.GONE ); else itemtype += "Unsupported type"; vh.expiredate.setvisibility( View.GONE ); vh.itemtype.settext( itemtype ); vh.paymentid.settext( "Payment ID : " + vo.getpaymentid() ); vh.purchasedate.settext( "Purchase Date : " + vo.getpurchasedate() ); vh.expiredate.settext( "Expire Date : " + vo.getsubscriptionenddate() ); return v; 앞서 InboxAdapter 는리스트뷰의각 row 의뷰를생성해준다고했습니다. 각뷰의행을위한레이 아웃은아래와같이구성되어있습니다. 파일명은 inbox_row.xml 입니다. 이것은앞서설명한 initview 메소드에서 InboxAdapter 를생성할때인자로전달하고있습니다. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingbottom="8dp" android:paddingleft="12dp" android:paddingright="12dp" android:paddingtop="8dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/itemname" android:layout_width="0dp" android:layout_height="wrap_content" android:linespacingextra="8dp" android:singleline="true" android:ellipsize="end" android:textsize="14dp" Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 20

android:textstyle="bold" android:gravity="center_vertical left" android:layout_weight="1" /> <TextView android:id="@+id/itempricestring" android:layout_width="wrap_content" android:layout_height="wrap_content" android:linespacingextra="8dp" android:singleline="true" android:ellipsize="end" android:textsize="14dp" android:textstyle="bold" android:gravity="center_vertical right" android:layout_marginleft="10dp" android:layout_weight="0" /> </LinearLayout> <TextView android:id="@+id/itemtype" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleline="true" android:ellipsize="end" android:textsize="10dp" android:gravity="center_vertical left"/> <TextView android:id="@+id/paymentid" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleline="true" android:ellipsize="end" android:textsize="10dp" android:gravity="center_vertical left"/> <TextView android:id="@+id/purchasedate" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleline="true" android:ellipsize="end" android:textsize="10dp" android:gravity="center_vertical left"/> <TextView android:id="@+id/expiredate" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleline="true" android:ellipsize="end" android:textsize="10dp" android:textcolor="#ff0000" android:gravity="center_vertical left"/> </LinearLayout> Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 21

이제마지막으로결과를처리할 ongetiteminbox 메소드를다음과같이구현했습니다. @Override public void ongetiteminbox ( ErrorVo _errorvo, ) ArrayList<InboxVo> _inboxlist if( _errorvo!= null && _errorvo.geterrorcode() == SamsungIapHelper.IAP_ERROR_NONE ) if( _inboxlist!= null && _inboxlist.size() > 0 ) minboxlist.addall( _inboxlist ); minboxlistadapter.notifydatasetchanged(); 위코드는 Inbox 요청이성공했을경우결과로내려온 _inboxlist 를 minboxlist 에추가하고 minboxlistadapter 에데이터가변경되었음을알려줘서 ListView 를갱신하는역할을수행합니다. 이제실행해보면다음과같이사용자가구매한내역을확인할수있는화면을볼수있습니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 22

3) 캐싱된구매목록가져오기 ( IAP 3.0 Helper 부터지원 ) IAP 3.0 Helper 에서새롭게추가된구매목록가져오기기능에대해서알아보도록하겠습니다. 앞서설명한구매목록은 3 rd party application 내의모든아이템들에대해서일정기간과개수를지정해서가져오는기능이었다면이것은선택된아이템들에대한전체구매목록을가져오는기능을지원합니다. 특히클라이언트사이드에서캐싱기능을제공하기때문에매우빠른응답속도를기대할수 있습니다. 지금부터새로운구매목록 API 를활용한예제를작성해보도록하겠습니다. 앞장에서사용했던 InboxListAdapter.java, inbox_list_layout.xml, inbox_row.xml 은그대로활용합니다. 우선 activity_main.xml 레이아웃의구매버튼아래에 CachedInboxListActivity 를실행하는버튼을 하나추가하고클릭되었을때 dogetcachedinboxlist 메소드가호출되도록설정합니다. <!-- Cached InboxList Button --> <Button android:id="@+id/btn_get_cached_inbox_list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/load_cached_items_inbox_list" android:onclick="dogetcachedinboxlist" /> 다음과같이 MainActivity.java 에원하는아이템들에대한 ID 목록을만들어서추가합니다. private static final String ITEM_IDS = " Nuclear, Claymore, " + " Blockbuster"; 다음으로 MainActivity.java 에서 dogetcachedinboxlist 메소드를다음과같이구현합니다. 필요한 정보들을 intent 에세팅하고 CachedInboxListActivity 를실행하는내용입니다. public void dogetcachedinboxlist( View _view ) Intent intent = new Intent( MainActivity.this, CachedInboxListActivity.class ); intent.putextra( "IapMode", MODE ); intent.putextra( "ItemIds", ITEM_IDS ); startactivity( intent ); Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 23

다음으로 CachedInboxListActivity 클래스를생성하고다음과같이코드를추가합니다. public class CachedInboxListActivity extends Activity implements OnGetInboxListener private int miapmode = 1; private String mitemids = ""; private SamsungIapHelper miaphelper = null; private ListView minboxlistview = null; private TextView mnodatatextview = null; private ArrayList<InboxVo> minboxlist = new ArrayList<InboxVo>(); private InboxListAdapter minboxlistadapter = null; @Override protected void oncreate( Bundle savedinstancestate ) super.oncreate( savedinstancestate ); setcontentview( R.layout.inbox_list_layout ); initview(); Intent intent = getintent(); if( intent!= null && intent.getextras()!= null && intent.getextras().containskey( "IapMode" ) && intent.getextras().containskey( "ItemIds" ) ) Bundle extras = intent.getextras(); miapmode = extras.getint( "IapMode" ); mitemids = extras.getstring( "ItemIds" ); else Toast.makeText( this, R.string.invalid_parameter, Toast.LENGTH_LONG ).show(); finish(); miaphelper = SamsungIapHelper.getInstance( this, miapmode ); miaphelper.getiteminboxlist( mitemids, this ); public void initview() minboxlistview = (ListView)findViewById( R.id.itemInboxList ); mnodatatextview = (TextView)findViewById( R.id.noDataText ); mnodatatextview.setvisibility( View.GONE ); minboxlistview.setemptyview( mnodatatextview ); minboxlistadapter = new InboxListAdapter( this, Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 24

R.layout.inbox_row, minboxlist ); minboxlistview.setadapter( minboxlistadapter ); @Override public void ongetiteminbox ( ErrorVo _errorvo, ) ArrayList<InboxVo> _inboxlist if( _errorvo!= null && _errorvo.geterrorcode() == SamsungIapHelper.IAP_ERROR_NONE ) if( _inboxlist!= null && _inboxlist.size() > 0 ) minboxlist.addall( _inboxlist ); minboxlistadapter.notifydatasetchanged(); 앞서설명했던 InboxListActivity 와구성이거의동일합니다. 다만노란색으로표시된부분의함수 파라미터만조금차이가있습니다. Reference getiteminboxlist( String, OnGetInboxListener ) 메소드 OnGetInboxListener 인터페이스 주의 getiteminboxlist 는모드와관계없이모든구매목록을전달합니다. 마지막으로 AndroidManifest.xml 파일에다음과같이새롭게추가된 CachedInboxListActivity 를 추가합니다. <activity android:name=".cachedinboxlistactivity" android:label="@string/cached_items_inbox_list" > </activity> 이제실행해보면다음과같은결과화면을확인할수있을것입니다. 앞서언급했듯이클라이언트 캐싱을지원하기때문에최초로딩이후에는빠른속도로로딩되는것을확인할수있습니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 25

4) 상품목록가져오기 마지막으로상품목록을가져오는코드를추가해보도록하겠습니다. 상품목록도구매목록처럼 ListView 형식으로보여주는것이좋겠지만기능에충실하게하기위해서구매요청과비슷하게 구현하겠습니다. activity_main.xml 레이아웃에다음과같이상품목록가져오는버튼을추가하고이버튼이 클릭되었을때 dogetitemlist 메소드가호출되도록설정했습니다. <!-- Get Item List Button --> <Button android:id="@+id/btn_get_item_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/load_item_list" android:onclick="dogetitemlist"/> MainActivity 에 dogetitemlist 메소드를다음과같이추가합니다. SamsungIapHelper 의 getitemlist 메소드를호출하기만하면됩니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 26

public void dogetitemlist( View _view ) if( miaphelper == null ) miaphelper = SamsungIapHelper.getInstance( this, MODE ); miaphelper.getitemlist( 1, 15, "00", MODE, this ); 다음으로 MainActivity 선언부에다음과같이 OnGetItemListener 인터페이스구현을추가합니다. public class MainActivity extends Activity implements OnPaymentListener, OnGetItemListener OnGetItemListener 인터페이스의콜백 ongetitem 메소드를다음과같이구현합니다. 아래 코드는최종결과가넘어왔을경우 AlertDialog 에그결과를보여주는코드입니다. @Override public void ongetitem( ErrorVo _errorvo, ArrayList<ItemVo> _itemlist ) AlertDialog.Builder alert = new AlertDialog.Builder( this ); alert.setpositivebutton( android.r.string.ok, new DialogInterface.OnClickListener() @Override public void onclick(dialoginterface dialog, int which) try dialog.dismiss(); catch( Exception e ) e.printstacktrace(); ); if( _errorvo!= null ) if( _errorvo.geterrorcode() == SamsungIapHelper.IAP_ERROR_NONE ) alert.settitle( R.string.item_list ); String message = ""; for( ItemVo vo : _itemlist ) message += vo.dump() + "\n" + "--------------------------------------" + "\n"; Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 27

alert.setmessage( message ); else alert.settitle( R.string.item_list ); alert.setmessage( _errorvo.geterrorstring() ); else alert.settitle( R.string.item_list ); alert.setmessage( "ErrorVo is null" ); try alert.show(); catch( Exception e ) e.printstacktrace(); 예제를실행하면 AlertDialog 에 item 리스트내용을출력하며, 실행결과실패시에는에러 메시지가출력이됩니다. 다음화면처럼구매목록에서구현했던것과같이 ListView 와 AdapterView 를활용해서리스트형태로보여줄수도있습니다. Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 28

1.2 다운로드 IAP 3.0 Helper & Sample 에서다운로드받은 IAP3Sample 프로젝트에는 ListView 로 출력하는예제를포함하고있으니참고하시기바랍니다. Reference getitemlist( int, int, String, int, OnGetItemListener ) 메소드 OnGetItemListener 인터페이스 Deprecated method getitemlist( String, int, int, String, int, OnGetItemListener ) 메소드 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 29

3. IAP 3 Helper Reference 3.1 SamsungIapHelper IAP Helper 에서는구매, 구매목록, 상품목록을위한총 3 개의메소드를제공하고있습니다. 이메 소드들은모두 SamsungIapHelper 클래스내부에존재합니다 1) getinstance( Context, int ) Singleton 방식의 SamsungIapHelper 객체를반환합니다. public static SamsungIapHelper getinstance( Context _context, int _mode ) 파라미터 파라미터 타입 설명 _context Context Android Context _mode int IAP 개발모드 0: 운영모드 1: 개발자테스트모드 ( 반환결과는무조건성공 ) -1: 개발자테스트모드 ( 반환결과는무조건실패 ) 반환값 SamsungIapHelper 2) (Deprecated) startpayment( String, String, boolean, OnPaymentListener ) 구매를요청하는메소드입니다. 이메소드는 IAP 3.0 부터 deprecated 되었습니다. startpayment( String, boolean, OnPaymentListener ) 메소드를사용할것을권장합니다. public void startpayment ( String String boolean OnPaymentListener ) _itemgroupid, _itemid, _showsuccessdialog, _onpaymentlistener 파라미터 파라미터 타입 설명 _itemgroupid String 상품이속해있는그룹의 ID값으로갤럭시앱스를통해서발급 받을수있다. 갤럭시앱스에서 IAP 연동을위해서어플리케이 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 30

션마다발급하는 ID다. IAP 3.0부터는 packagename으로변경되어더이상사용되지않는다. 하위호환성을위해서만유지되고있다. _itemid String 상품의 ID값. _showsuccessdialog booelan true 이면결제성공시 IAP의다이얼로그를보여준다. false 인경우는보여주지않는다. false인경우는 3 rd Party App에서결제결과성공시결과를보여줘야한다. _onpaymentlistener OnPaymentListener 결제결과를 3 rd Party App에게알려주기위한콜백메소드 onpayment() 정의를위한인터페이스. 3) startpayment( String, boolean, OnPaymentListener ) IAP 3.0 에서 Item Group ID 가 Package Name 으로변경되면서새롭게추가된메소드로구매를요 청한다. public void startpayment ( String boolean OnPaymentListener ) _itemid, _showsuccessdialog, _onpaymentlistener 파라미터 파라미터 타입 설명 _itemid String 상품의 ID값. _showsuccessdialog booelan true 이면결제성공시 IAP의다이얼로그를보여준다. false 인경우는보여주지않는다. false인경우는 3 rd Party App에서결제결과성공시결과를보여줘야한다. _onpaymentlistener OnPaymentListener 결제결과를 3 rd Party App에게알려주기위한콜백메소드 onpayment() 정의를위한인터페이스. 4) (Deprecated) getiteminboxlist( String, int, int, String, String, OnGetInboxListener ) 구매목록을가져옵니다. 이메소드는 IAP 3.0부터 deprecated 되었습니다. getiteminboxlist( int, int, String, String, OnGetInboxListener ) 메소드를사용할것을권장합니다. public void getiteminboxlist ( String _itemgroupid, int _startnum, int _endnum, String _startdate, String _enddate, OnGetInboxListener _ongetinboxlistener Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 31

) 파라미터 파라미터 타입 설명 _itemgroupid String 상품이속해있는그룹의 ID값으로갤럭시앱스를통해서발급받을수있다. 갤럭시앱스에서 IAP 연동을위해서어플리케이션마다발급하는 ID다. IAP 3.0부터는 packagename으로변경되어더이상사용되지않는다. 하위호환성을위해서유지되고있다. _startnum int 요청하는구매목록의시작번호. 주의 : 시작번호가 0이아니고 1이다. _endnum int 요청하는구매목록의끝번호. 주의 : 시작번호가 0이아니고 1이다. 예 : _startnum = 1, _endnum = 15 라면 1번부터 15번까지를요청하는것이다. _startdate String 요청하는구매목록의시작일. 예 : 20131031 _enddate String 요청하는구매목록의마지막날짜. 예 : 20131031 _ongetinboxlistener OnGetInboxListener 구매목록요청결과를 3 rd Party App에게전달하기위한콜백메소드 ongetiteminbox() 정의를위한인터페이스. 5) getiteminboxlist( int, int, String, String, OnGetInboxListener ) IAP 3.0 에서 Item Group ID 가 Package Name 으로변경되면서새롭게추가된메소드로구매목록 을가져옵니다. public void getiteminboxlist ( int _startnum, int _endnum, String _startdate, String _enddate, OnGetInboxListener _ongetinboxlistener ) 파라미터 파라미터 타입 설명 _startnum int 요청하는구매목록의시작번호. 주의 : 시작번호가 0이아니고 1이다. _endnum int 요청하는구매목록의끝번호. 주의 : 시작번호가 0이아니고 1이다. 예 : _startnum = 1, _endnum = 15 라면 1번부터 15번까지를 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 32

요청하는것이다. _startdate String 요청하는구매목록의시작일. 예 : 20131031 _enddate String 요청하는구매목록의마지막날짜. 예 : 20131031 _ongetinboxlistener OnGetInboxListener 구매목록요청결과를 3 rd Party App에게전달하기위한콜백메소드 ongetiteminbox() 정의를위한인터페이스. 6) getiteminboxlist( String, OnGetInboxListener ) IAP 3.0에서새롭게추가된메소드로선택된상품들에대한구매목록을가져옵니다. 특히, 클라이언트사이드캐싱을지원하기때문에빠른응답을보장합니다. public void getiteminboxlist ( String _itemids, OnGetInboxListener _ongetinboxlistener ) 파라미터 파라미터 타입 설명 _itemids String 상품들의 ID값. 다음과같이여러개아이디를, 로구분하여전달할수있다. 예 : "000000057507, 000000057508, 000000057509 _ongetinboxlistener OnGetInboxListener 구매목록요청결과를 3 rd Party App에게전달하기위한콜백메소드 ongetiteminbox() 정의를위한인터페이스. 7) (Deprecated) getitemlist( String, int, int, String, int, OnGetItemListener ) 상품목록을가져옵니다. 이메소드는 IAP 3.0 부터 deprecated 되었습니다. getitemlist( int, int, String, int, OnGetItemListener ) 메소드를사용할것을권장합니다. public void getitemlist ( String int int String int OnGetItemListener ) _itemgroupid, _startnum, _endnum, _itemtype, _mode, _ongetitemlistener 파라미터 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 33

파라미터 타입 설명 _itemgroupid String 상품이속해있는그룹의 ID값으로갤럭시앱스를통해서발급받을수있다. 갤럭시앱스에서 IAP 연동을위해서어플리케이션마다발급하는 ID다. IAP 3.0부터는 packagename으로변경되어더이상사용되지않는다. 하위호환성을위해서유지되고있다. _startnum int 요청하는상품목록의시작번호. 주의 : 시작번호가 0이아니라 1이다. _endnum int 요청하는구매목록의끝번호. 주의 : 시작번호가 0이아니라 1이다. 예 : _startnum = 1, _endnum = 15 라면 1번부터 15번까지를요청하는것이다. _itemtype String 아이템타입 00: Consumable ( 소모성상품 ) 01: NoConsumable ( 비소모성상품 ) 02: Subscription ( 기간제상품 ) 03: Auto-Recurring Subscriptions ( 자동갱신기간제상품 ) IAP 3.0부터제공되는 Type입니다. 10: All ( 모든타입 ) _mode int IAP 개발모드 0: 운영모드 1: 개발자테스트모드 ( 반환결과는무조건성공 ) -1: 개발자테스트모드 ( 반환결과는무조건실패 ) _ongetitemlistener OnGetItemListener 상품목록요청결과를 3 rd Party App에게전달하기위한콜백메소드를 ongetitem() 을정의하는인터페이스. 8) getitemlist( int, int, String, int, OnGetItemListener ) IAP 3.0 에서 Item Group ID 가 Package Name 으로변경되면서추가된메소드로상품목록을가져옵 니다. public void getitemlist ( int int String int OnGetItemListener ) _startnum, _endnum, _itemtype, _mode, _ongetitemlistener 파라미터 파라미터타입설명 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 34

_startnum int 요청하는상품목록의시작번호. 주의 : 시작번호가 0이아니라 1이다. _endnum int 요청하는구매목록의끝번호. 주의 : 시작번호가 0이아니라 1이다. 예 : _startnum = 1, _endnum = 15 라면 1번부터 15번까지를요청하는것이다. _itemtype String 아이템타입 00: Consumable ( 소모성상품 ) 01: NoConsumable ( 비소모성상품 ) 02: Subscription ( 기간제상품 ) 03: Auto-Recurring Subscriptions ( 자동갱신기간제상품 ) IAP 3.0부터제공되는 Type입니다. 10: All ( 모든타입 ) _mode int IAP 개발모드 0: 운영모드 1: 개발자테스트모드 ( 반환결과는무조건성공 ) -1: 개발자테스트모드 ( 반환결과는무조건실패 ) _ongetitemlistener OnGetItemListener 상품목록요청결과를 3 rd Party App에게전달하기위한콜백메소드를 ongetitem() 을정의하는인터페이스. 3.2 Result Callback Interface 1) OnPaymentListener IAP 결제가완료되었을때호출되는콜백메소드를위한인터페이스정의 void onpayment( ErrorVo _errorvo, PurchaseVo _purchasevo ); 결제가완료되었을때호출되는콜백메소드. 파라미터 파라미터 타입 설명 _errorvo ErrorVo 요청결과 (3.3 Value Object 참조 ) _purchasevo PurchaseVo 구매결과 (3.3 Value Object 참조 ) 2) OnGetInboxListener 구매목록요청이완료되었을때호출되는콜백메소드를위한인터페이스 void ongetiteminbox( ErrorVo _errorvo, ArrayList<InboxVo> _inboxlist ); 구매목록요청이완료되었을때호출되는콜백메소드 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 35

파라미터 파라미터 타입 설명 _errorvo ErrorVo 요청결과 (3.3 Value Object 참조 ) _inboxlist ArrayList<InboxVo> 구매목록 (3.3 Value Object 참조 ) 3) OnGetItemListener 상품목록요청이완료되었을때호출되는콜백메소드정의를위한인터페이스 void ongetitem( ErrorVo _errorvo, ArrayList<ItemVo> _itemlist ); 상품목록요청이완료되었을때호출되는콜백메소드 파라미터 파라미터 타입 설명 _errorvo ErrorVo 요청결과 (3.3 Value Object 참조 ) _itemlist ArrayList<ItemVo> 상품목록 (3.3 Value Object 참조 ) 3.3 Value Object 1) PurchaseVo 구매결과정보 멤버변수 타입 설명 mitemid String 상품아이디 mitemname String 상품명 mitemprice Double 상품가격 예 : 7.99 mitempricestring String 통화기호 + 상품가격 예 : 7.99 mcurrencyunit String 통화기호 예 :,, $ mcurrencycode String 통화코드 예 : EUR, GBP, USD mitemdesc String 상품설명 mitemimageurl String 상품이미지 URL mitemdownloadurl String 상품다운로드 URL mpaymentid String 결제아이디 mpurchaseid String 구매아이디 mpurchasedate String 구매일시 (millisecond 형태 ) mverifyurl String mpurchaseid값을이용해서 IAP 서버에유효한구매인지 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 36

확인하기위한 IAP Server URL. mjsonstring String 원본 JSON String 2) ItemVo 상품정보 멤버변수 타입 설명 mitemid String 상품아이디 mitemname String 상품명 mitemprice Double 상품가격 예 : 7.99 mitempricestring String 통화기호 + 상품가격 예 : 7.99 mcurrencyunit String 통화기호 예 :,, $ mcurrencycode String 통화코드 예 : EUR, GBP, USD mitemdesc String 상품설명 mitemimageurl String 상품이미지 URL mitemdownloadurl String 상품다운로드 URL mtype String 상품타입 00: Consumable ( 소모성상품 ) 01: NoConsumable ( 비소모성상품 ) 02: Subscription ( 기간제상품 ) 03: Auto-Recurring Subscriptions ( 자동갱신기간제상품 ) msubscriptiondurationunit String 상품타입이 Subscription인경우상품의유효기간단위로가능한단위는 YEAR, MONTH, WEEK, DAY 모두 4가지로대문자값이다. msubscriptiondurationmultiplier String 상품타입이 Subscription인경우상품의유효기간이다. msubscriptiondurationunit과조합하여 1MONTH와같이표현한다. mjsonstring String 원본 JSON String 3) InboxVo 구매내역정보 멤버변수 타입 설명 mitemid String 상품아이디 mitemname String 상품명 mitemprice Double 상품가격 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 37

예 : 7.99 mitempricestring String 통화기호 + 상품가격 예 : 7.99 mcurrencyunit String 통화기호 예 :,, $ mcurrencycode String 통화코드 예 : EUR, GBP, USD mitemdesc String 상품설명 mitemimageurl String 상품이미지 URL mitemdownloadurl String 상품다운로드 URL mtype String 상품타입 00: Consumable ( 소모성상품 ) 01: NoConsumable ( 비소모성상품 ) 02: Subscription ( 기간제상품 ) 03: Auto-Recurring Subscriptions ( 자동갱신기간제상품 ) mpaymentid String 결제아이디 mpurchaseid String 구매아이디 mpurchasedate String 구매일시 (millisecond 형태 ) msubscriptionenddate String 상품타입이 SubScription인경우유효기간만료일. long 타입으로반환된다. mjsonstring String 원본 JSON String 4) ErrorVo 요청처리결과 멤버변수 타입 설명 merrorcode Int 응답코드 ( 3.4 Response Code 참조 ) merrorstring String 에러메시지 mextrastring String 결과에대한추가적인정보 5) VerificationVo 결제유효성검사결과 멤버변수 타입 설명 mitemid String 상품아이디 mitemname String 상품이름 mitemdesc String 상품설명 mpurchasedate String 구매일시 (millisecond 형태 ) mpaymentid String 결제아이디 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 38

mpaymentamount String 총결제금액 mstatus String 유효성검사결과 3.4 Response Code 응답코드 코드값 설명 IAP_ERROR_NONE 0 성공 IAP_PAYMENT_IS_CANCELED 1 결제취소 IAP_ERROR_INITIALIZATION -1000 IAP 초기화중실패 IAP_ERROR_NEED_APP_UPGRADE -1001 IAP 업그레이드가필요 IAP_ERROR_COMMON -1002 IAP 실행중오류 IAP_ERROR_ALREADY_PURCHASED -1003 Non-Consumable 상품 재 구매 또는 Subscription 상품을유효기간내에재구매하는경우 IAP_ERROR_WHILE_RUNNING -1004 Bundle 정보없이결제를요청한경우 IAP_ERROR_PRODUCT_DOES_NOT_EXIST -1005 요청한상품목록이없는경우 IAP_ERROR_CONFIRM_INBOX -1006 서버에결제요청을한이후에그결과를받지못했다면결제결과가성공은아니지만결제가성공했을가능성이있기때문에구매한상품목록확인이필요한경우. IAP_ERROR_ITEM_GROUP_DOES_NOT_EXIST -1007 아이템그룹아이디가없을경우 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 아이템이해당국가에서팔리지않는경우 IAP_ERROR_NOT_AVAILABLE_SHOP -1013 IAP가해당국가에서서비스되고있지않는경우 Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 39

4. IAP Server-to-Server API Reference 본장에서는 IAP 에서이용할수있는 server-to-server verification 에대해서설명하겠습니다. 이 API 를사용하면 3 rd Party 서버가특정구매가유효한지여부를판별할수있기때문에악의적인구매를차단할수있습니다. 4.1 appsitemverifyiapreceipt IAP 의 verifyurl( 구매유효성확인 URL) 은다음과같이고정된값을사용합니다. verifyurl : https://iap.samsungapps.com/iap/appsitemverifyiapreceipt.as?protocolversion=2.0 IAP 에서는구매요청결과의일부로다음과같이 purchaseid 를반환합니다. purchaseid : d215d9abcd17b12578a21c0ea7d8821747b64939732a3243b538d8bcae245590 3 rd Party 클라이언트어플리케이션에서는자신의서버에 purchaseid 를전달하고, 서버에서는 verifyurl 과 purchaseid 값을이용해서다음과같은형식으로 URL 을만들어서요청하면됩니다. https://iap.samsungapps.com/iap/appsitemverifyiapreceipt.as?protocolversion=2.0&purchaseid=d 215d9abcd17b12578a21c0ea7d8821747b64939732a3243b538d8bcae245590 IAP 서버에서는다음과같이 JSON 포맷으로그결과를보내줍니다. 1) 유효한구매인경우 "itemid" : "57515", "paymentid":"zpmtid20131122gbi0015292", "itemname":"test Pack", "itemdesc":"iap Test Item. Best value!", "purchasedate":"2013-11-22 04:22:36", "paymentamount":"9.000", "status":"true", "paymentmethod":"creditcard", "mode":"real", 2) 유효한구매가아닌경우 "status":"false" Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 40

3) 결과값설명 이름 Type 설명 itemid String 상품 ID itemname String 상품이름 itemdesc String 상품설명 paymentid String 결제아이디 purchasedate String 구매일시 paymentamount String 총결제금액 status String true / false paymentmethod String 상품을구매할때사용된결제방법에대한설명예 : CreditCard, MobileMicroPurchase, PrepaidCard, PSMS, CarrierBilling 등 mode String 상품을구매할때사용된개발모드예 : TEST, REAL Copyright Samsung Electronics Co., Ltd. All rights reserved. Page 41