목차

상수 및 자료형

<작성법 참고>
struct CS_IapItemList
typedef struct CS_IapItemList_ {
    const char* productID;
    const char* formattedString;
    const char* localizedTitle;
    const char* localizedDescription;
    const char* currencyCode;
    long amountMicros;
} CS_IapItemList;
productID : 아이템 ID (PID)
formattedString : 아이템 가격. AppStore 에서 [currency | price] 형식으로 formattedString 값을 넘겨줍니다.
통화 코드는 ISO-4217 입니다. ex) [USD | 0.99]
AppStore의 경우 애플이 공통 인앱 과금 모듈에게 과금 정보를 전달하면,
모듈이 [통화코드 (ISO 4217) | 가격 (USD | 0.99)] 포멧으로 변환해 게임에 전달합니다.
미국, 영국, 일본, 프랑스등의 주요 국가는 통화 코드를 게임의 UI에서 $(USD), ¥(JPY), £(GBP) 등으로 변환해주시고,
나머지 국가는 통화 코드 그대로 노출하시면 됩니다.
PlayStore (Google) 의 경우 구매 유저의 국가 설정에 따라 마켓에서 화폐단위를 변환하여 전달합니다. ( $0.99, \1,000 등)


localizedTitle : 아이템 이름
localizedDescription : 아이템 부가 설명 (단, Lebi 는 해당 아이템 속성이 들어있습니다. N:일반. T:기간제, C:소모성, P:영구성)
currencyCode (string) : 통화코드, Android 의 경우 판매자 계정의 기본 통화코드이기 때문에 formattedString 의 통화기호와 다를 수 있습니다. 2014-12-24 (확인된 날짜) 이후 구매자 기반으로 바꼈습니다. (formattedString 과 통화코드 같음)
amountMicros (int64, long) : 실제가격단위에 * 1,000,000 을 연산하여 소수점을 제거한 수치
ex) 0.99 -> 990000, 1000 -> 1000000000


GET_ITEM_LIST 콜백에서 stateValue로 받을 수 있습니다.

Java / C# : class ItemList

<작성법 참고>
struct CS_IapItemInfo
typedef struct Iap_ItemInfo {
   const char* pid; //빌링시스템에 등록 되어있는 아이템 코드
         int quantity; //수량
   const char* uid; //글로벌 회원시스템 회원 구분 키값
   const char* additionalInfo; //결제 요청시 추가 정보 값
} CS_IapItemInfo;
pid : 빌링시스템에 등록되어있는 아이템 코드
quantity : 구매 할 수량으로 현재는 지원하지 않습니다. 1로 입력. (GooglePlay, KDDI 의 경우, 영구성 아이템 구매시 수량을 0 으로 해주세요)
uid : user의 플랫폼 ID (HUB ID) 를 넣어줍니다. (HubAPI 제공) HUB에 로그인이 되어 있다면 반드시 넣어주어야 합니다.
( HUB API : CS_hubGetUniqueUserId() )
숫자 형태로 입력 해 주세요.
additionalInfo : 게임서버군이 여러개 일 경우, 또는 구매로그에 추가적인 정보가 필요할 경우 등 다양한 경우를 위해 사용합니다.
서버 구분의 경우 "server_id" 라는 키로 jsonString 으로 넣어 주면 됩니다. (이 부분은 서버끼리 조율 가능)
v2.0.6 이후, Tstore 에서 autoVerify 을 false 로 사용할 경우, orderKey 에 게임서버에서 발급받은 TID 를 넣어주면 됩니다.
v2.8.3.2 부터, Tstore 마켓측의 deprecated 로 인해 TID 조회는 불가능 합니다.

Java / C# : 구조체 없이 void iapBuyItem(String pid, int quantity, String uid, String additionalInfo) 에서 바로 입력

<작성법 참고>
struct CS_IapErrorStateValue
typedef struct CS_IapErrorStateValue_ {
   const char* errorCode;
   const char* errorValue;
   const char* errorMsg;
} CS_IapErrorStateValue;
errorCode : 에러코드 (항상 존재)
errorValue : 에러코드에 대한 상세 분류 (마켓에 따라 비어있을 수 있음)
errorMsg : 에러에 대한 문자열 내용 (마켓에 따라 비어있을 수 있음)

Java / C# : class ErrorStateValue

<작성법 참고>
enum CS_IapBillingTarget
typedef enum CS_IapBillingTarget_ {
   //GoogleInAppBilling     =  1,  // deprecated
   TstoreBilling        =  2,
   ollehMarketBilling       =  3,
   OZstoreBilling       =  4,
   ThirdPartyBilling        =  5,
   qiipBilling          =  6,
   HamiBilling          =  7,
   LebiBilling          =  8,
   PlasmaBilling        =  9,
   AmazonBilling        = 10,
   KDDIBilling          = 11,
   MMBilling            = 12,
   MBizBilling          = 13,
   GooglePlayBilling        = 15,
   SamsungInAppBilling      = 16, // Android InAppPurchase v2.16.0+

   MAX_BILLING_TARGET
} CS_IapBillingTarget;

Java / C# : static int BillingTarget (InApp class)

<작성법 참고>
enum CS_IapSuccessStateValue
typedef enum CS_IapSuccessStateValue_ {
   MARKET_NUMBER        = 0,
   MARKET_NAME          = 1,

   GOOGLEINAPP_RECEIPT      = 2,  // deprecated market (use GOOGLEPLAY_RECEIPT)
   GOOGLEINAPP_SIGNATURE    = 3,  // deprecated market (use GOOGLEPLAY_SIGNATURE)

   TSTORE_TRANSACTION       = 4,
//TSTORE_TID            = 4,  // deprecated after v2.8.3
//TSTORE_DATELOCAL      = 5,  // deprecated after v2.8.3

   OLLEHMARKET_TRANSACTIONID    = 6,
   OLLEHMARKET_DATELOCAL    = 7,

   OZSTORE_DATELOCAL        = 8,
   OZSTORE_UKEY             = 37,   // added v2.8.4
   OZSTORE_TXID             = 38,   // added v2.8.4

   THIRDPARTY_ORDERKEY      = 9,    // deprecated after v2.9.1 (use THIRDPARTY_ADDITIONALINFO)
   THIRDPARTY_ADDITIONALINFO    = 9,    // added v2.9.1

   QIIP_DATELOCAL       = 10,

   HAMI_DATELOCAL       = 11,

   LEBI_BILLINGNUM      = 12,

   PLASMA_PAYMENTID     = 13,
   PLASMA_PURCHASEID        = 14,
   PLASMA_ITEMID        = 15,
   PLASMA_VERIFYURL     = 16,
   PLASMA_PARAM1        = 17,
   PLASMA_PARAM2        = 18,
   PLASMA_PARAM3        = 19,
   PLASMA_PURCHASEDATE      = 20,

   AMAZON_PRODUCTID         = 21,
   AMAZON_USERID                = 22,
   AMAZON_PURCHASETOKEN     = 23,   // deprecated after v2.9.1 (use AMAZON_RECEIPTID)
   AMAZON_RECEIPTID         = 23,   // added v2.9.1
   AMAZON_REQUESTID         = 24,
   AMAZON_MARKETPLACE           = 40,   // added v2.9.1
   AMAZON_ITEMPRICE         = 41,   // added v2.14.4

   KDDI_TRANSACTION     = 25,
   KDDI_SIGNATURE       = 26,

   MM_ORDERID           = 27,
   MM_PURCHASEDATE      = 28,

   MBIZ_EMONEY          = 29,
   MBIZ_PURCHASEDATE        = 30,

   GOOGLEPLAY_RECEIPT       = 35,
   GOOGLEPLAY_SIGNATURE     = 36,
   GALAXYSTORE_TRANSACTION     = 42,
   ONESTORE_INIT_FAILED     = 43,

   MAX_SUCCESS_STATE_VALUE  = 46
} CS_IapSuccessStateValue;

Java / C# : static int SuccessStateValue (InAppCallback class)

<작성법 참고>
enum INAPP_RESULT
typedef enum INAPP_RESULT_TYPE {
   GET_ITEM_LIST = 1, //서버로부터 아이템에 대한 정보를 받음
   BUY_SUCCESS = 2, //구매 성공
   BUY_FAILED = 3, //구매 실패
   BUY_CANCELED =  4, //구매 취소(유저에 의한 취소)
   RESTORE_SUCCESS = 5, //복구 성공
   RESTORE_FINISHED    = 6,   //복원 완료. iOS only
   RESTORE_FAILED      = 7,    //복원 실패. iOS only
   PURCHASE_UPDATED =8,  //Android only
   PROMOTE_PURCHASE = 9, // Appstore 구매요청 pid를 전달받음 iOS only
   NOT_OWNED = 10,  // Appstore 구매요청 pid 없음 iOS only

   MAX_INAPP_RESULT
}INAPP_RESULT;

Java / C# : 콜백 함수형태로 존재

<작성법 참고>
enum LICENSE_RESULT
typedef enum LICENSE_RESULT_TYPE {
   AUTHORIZE_LICENSE_SUCCESS    = 100,
   AUTHORIZE_LICENSE_FAILED = 101
} LICENSE_RESULT;
Android 의 KDDI 마켓만 사용

Java / C# : 콜백 함수형태로 존재

<작성법 참고>
enum SELECT_TARGET_RESULT
typedef enum SELECT_TARGET_RESULT_TYPE
{
   TARGETING_SUCCESS    = 200,
   TARGETING_FAILED = 201
} SELECT_TARGET_RESULT;
Android 의 GoogleInApp, GooglePlay, Lebi 마켓만 사용

Java / C# : 콜백 함수형태로 존재


함수

<작성법 참고>
int CS_IapInitialize(char** pid, char* appid, int autoVerify, IapCB cb)
  • Description
    iOS 만 사용.
    InApp Purchase 모듈을 초기화 하고, CallBack받을 함수를 지정해 줍니다.
    useAutoLogging이 FALSE인 경우 게임서버에서 영수증을 검증합니다. 영수증을 검증한 후 게임서버에서 과금서버로 로그를 남기게 됩니다.
    영수증 정보는 아이템 구매시CS_IapBuyItem CallBack Function 의 stateValue를 확인.
    인앱초기화가 성공하면 GET_ITEM_LIST 콜백이 호출 됩니다.
    GET_ITEM_LIST의 count가 0이거나 콜백을 받지 못하면 모든 구매가 실패로 처리됩니다.
    iOS v2.13.0 부터 기존 StoreStart()에서 등록하던 인앱 스토어 옵저버를 해당 함수 호출 시에 등록하게 됩니다.
  • Return Value

초기화 성공이면 1, 실패면 0 리턴.

초기화 실패 시 인앱 구매(복원)를 요청하면, Crash가 발생합니다. 0 리턴 시 꼭 예외처리를 해야합니다.
초기화 실패하는 경우는 아래와 같습니다.

  • AppStore나 PlayStore가 점검 중으로 item 정보를 못 받음.
  • productID를 잘못 넘김.
  • AppStore, PlayStore Test 계정이 아님.
  • iOS 경우 Test 단말로 등록되지 않았음.
  • iOS 기기 설정에서 인앱구매를 비활성화 시켰을 경우
  • Parameter
in/out Type Name Description
in char** pid

iOS의 AppStore에서 사용 됩니다. 상품의Product ID(사업부 발급) list.
배열의 마지막 값은 반드시 NULL이어야 합니다.
ex) char* pids[]={"com.com2us.mi.global.test.HeallingPotion","com.com2us.mi.global.test.ManaPotion", "com.com2us.mi.global.test.SunSword", "com.com2us.mi.global.test.SunShield", NULL};

in char* appid

Application의 Bundle AppID를 넘겨줍니다.
iOS AppStore일 경우 NULL. 인앱 모듈 내부에서 자동 생성 됩니다.

in int autoVerify

영수증 검증을 게임서버에서 할지, 모듈서버에서 할지 설정합니다.
게임 서버에서 영수증 검증을 하는 경우. FALSE, 게임서버가 없는 싱글 게임인 경우 TRUE로 설정하면 됩니다.

in IapCB cb

콜백 함수를 등록합니다.

  • Remark
    not comment


<작성법 참고>
int CS_IapInitializeEx(int billingTarget, char** pids, char* appid, int autoVerify, IapCB cb)
  • Description
    Android 만 사용. 네트워크 통신이 없는 기본적인 환경 체크 후 initialize 성공일 경우 1을 return 합니다.
  • Return Value
  • Parameter
in/out Type Name Description
in int billingTarget

C2SInApp.h 에 정의되어 있는 enum 값으로, 사용하고자 하는 결제방식을 GooglePlayBilling 등으로 사용하면 됩니다.

in char** pids
  • 상품 고유 아이디 리스트를 넣어주면 콜백의 GET_ITEM_LIST 로 아이템 목록의 정보를 받을 수 있습니다.
  • stateValue 에 CS_IapItemList 구조체가 담겨져 오며, 콜백 함수 파라미터 중 iapItem 에 아이템 갯수(stateValue의 Size) 가 넘어 옵니다. (Callback Func 참고해 주세요.)
  • 사용 하지 않을 시엔 NULL 값을 넣어주면 됩니다.
  • Lebi 는 사용하지만 appid 로 가져오기 때문에 필요 없습니다.
  • 즉, Lebi 만 Null 을 사용 해도 됩니다.
  • Apple, Lebi, Amazon, GooglePlay, OneStore(+구Tstore포함), Samsung GalaxyStore 에서 해당 콜백을 지원하며, Amazon 의 경우, SKU (pid) 를 넣어주면 됩니다.
  • 배열의 마지막 값은 반드시 NULL 이어야 합니다.
ex) char* pids[] = {"a", "b", "c", NULL};
Java / C# 은 null 상관없이 String[]
in char* appid

GoogleInApp(미지원)이나 ThirdParty, Lebi의 경우 해당 PackageName을 넣어주면 되고, 나머지는 사업부에서 발급 받은 마켓별 InAppID(AID 등등)를 넣어주면 됩니다.

pid(상품ID)는 iapBuyItem 에서 넣어주세요.
MM market (China Moblie; 이하 MM, 미지원) 은 appid 와 appkey 2가지가 필요합니다.
CS_IapInitializeEx 시에 appid 파라미터에 '|' 를 구분자로 하여 빈칸 없이,
ex) "300002560201
in int autoVerify

게임서버가 있어서 과금에 대한 검증을 게임서버에서 처리할 경우 false, Single Game의 경우 true를 해줍니다.

false 일 경우 모듈에서 따로 검증을 하지 않으며, GoogleInApp(미지원), GooglePlay 의 경우 영수증의 결제 상태값을 보지 않기 때문에 취소, 환불 영수증도 BUY_SUCCESS 로 내려주게됩니다.
게임서버에서 영수증의 purchaseState 에 따라 주시면 됩니다.
in IapCB cb

콜백 함수를 넣어 줍니다. 콜백함수에 관한건 CallBack Func. 부분 참조.

  • Remark
    Java / C# : iapInitialize(int billingTarget, String[] pids, String appid, boolean autoVerify)
    원스토어 IAP v5 적용 시 API 호출 특이사항 내용을 확인해주세요.


<작성법 참고>
void CS_IapUninitialize()
  • Description
    InApp Module을 해제합니다, 게임 종료시 사용.
  • Return Value

void

  • Remark
    Java / C# : void iapUninitialize()


<작성법 참고>
void CS_IapStoreStart()
  • Description
    게임내에 상점에 들어가거나, BuyItem을 하기 전에 사용합니다. 구매 진행중인 아이템이 있거나, 보내지 못한 로그, 제대로 받지 못한 콜백 데이터 등을 이곳에서 처리합니다.
    상점 진입시 호출 합니다. 이전에 못보낸 로그가 있을 경우 로그를 서버로 보내며, 정상 결제후 아이템을 못 받은 경우 또한 여기서 처리 합니다.
    CS_IapStoreStart를 CS_IapStoreEnd 처리 없이 2중으로 호출할 경우 아이템이 미지급 될수 있습니다. 페어를 맞춰 주시기 바랍니다.
    ~~iOS 의 경우 인앱 스토어 옵저버가 등록 되며,~~ 구매 이전에 반드시 호출 해 주셔야 합니다.
    iOS v2.13.0 부터 IapInitialize()에서 옵저버 등록이 이루어지며 StoreStart()에서는 현재 종료되지 않은 Transaction이 있는지를 확인합니다.
    결과가 BUY_SUCCESS가 아니라면 게임에서는 별도 처리를 할 필요가 없습니다.
  • Return Value

void

  • Remark
    Java / C# : void iapStoreStart()


<작성법 참고>
void CS_IapStoreEnd()
  • Description
    Store 상태에서 나옵니다. CS_IapStoreStart를 2중으로 호출시 아이템 지급이 안되는 문제가 발생할수 있습니다. 꼭 호출 해주시기 바랍니다.
    iOS v2.13.0 부터 deprecated
  • Return Value

void

  • Remark
    Java / C# : void iapStoreEnd()


<작성법 참고>
void CS_IapRestoreItem(char* uid)
  • Description
    해당 유저의 소모성 item을 모두 복구합니다. 성공할 경우 아이템 갯수만큼 RESTORE_SUCCESS 콜백이 전달됩니다.(InAppPurchase 모듈은 구독형 아이템을 지원하지 않습니다.)
    Tstore(IAP v4)와 OllehMarket은 이 기능을 사용할 수 없고, 해당 영구성 Item을 재구매 할 때(iapBuyItem) 복구 합니다.
    (단, Onestore IAP v5에서는 구매가 정상 완료되지 않은 경우 해당 API를 호출하여 복구를 수행합니다. (GooglePlay, Onestore, Samsung GalaxyStore가 유사하게 iapRestoreItem으로 마켓 복구를 요청하도록 되어 있음))
    iapStoreStart API가 호출된 후 iapRestoreItem 호출이 가능합니다. 그리고 iapStoreEnd API가 호출된 후 iapRestoreItem 은 작동하지 않습니다. iapRestoreItem 호출 시 iapStoreStart, iapStoreEnd 와의 순서를 꼭 확인해주세요!
    GooglePlay 의 경우 마켓에서 취소/환불 하였을 경우 복구 아이템 목록에서 제외됩니다.
    이미 제공된 아이템인데 복구 콜백이 없다면 취소/환불 된 것입니다.
    만약 Restore 요청에서 에러가 나게되면 BUY_FAILED 를 리턴 해 줍니다.
    복구할 게 없을때 주는 콜백이나 검증이 없는 마켓의 경우 RESTORE_SUCCESS 을 주되 콜백 Parameter 필드가 비어 있을 수 있습니다.
  • Return Value

void

  • Parameter
in/out Type Name Description
in char* uid

user의 HUB ID를 넣어줍니다. HUB 가 아닐경우 해당 플렛폼의 유저 식별자를 넣어주면 됩니다.(카카오의 userID 등) guest 일 경우엔 guest ID 를 넣어주면 됩니다.

  • Remark
    Java / C# : void iapRestoreItem(String uid)


<작성법 참고>
void CS_IapBuyItem(CS_IapItemInfo iapItemInfo)
  • Description
    해당 아이템을 구매합니다.
    HUB에 로그인이 되어있다면 반드시 넣어주어야 합니다.
    다른 플랫폼일 경우 해당 유저식별자를 넣어주세요.
    네트워크 체크를 하며, 실패시 BUY_CANCELED 콜백을 호출합니다.
    iOS 의 경우 CS_IapStoreStart 이전에 호출할 때 BUY_FAILED 콜백을 리턴합니다. 구매 관련 콜백 호출 전까지 게임 진행을 막아야 합니다.
    iOS 기기 설정 -> 일반-> 차단 -> App 내 구입이 Disable 상태면 AppStore에서 넘긴 Error msg를 그대로 BUY_FAILED Callback과 함께 넘깁니다.
    게임에서는 UI를 통해 Error 내용을 띄우고 '기기 설정으로 구매가 불가능 한 점을' 을 사용자에게 알려야 합니다.
    (예 : “기기의 설정에서(일반→차단) App 내 구입을 승인하세요.”)
    CS_IapBuyItem() 호출 과정에서 마켓의 오류로 BUY_FAILED, BUY_CANCELED 에러코드를 전달받은 경우 사용자에게 구매 과정에 문제가 있음을 알려야 합니다.
    구매 과정에 문제가 있음을 알림을 사용자가 확인한 경우, CS_IapStoreStart() 를 호출하여 마켓의 오류중에 발생한 구매 항목에 대한 복구를 진행해야 합니다.
  • Return Value

void

  • Parameter
in/out Type Name Description
in CS_IapItemInfo iapItemInfo

struct CS_IapItemInfo 참조.

  • Remark
    Java / C# : void iapBuyItem(String pid, int quantity, String uid, String additionalInfo)
    원스토어 IAP v5 적용 시 API 호출 특이사항 내용을 확인해주세요. (클라이언트팀에 문의바랍니다.)


<작성법 참고>
void CS_IapBuyFinish()
  • Description
    v1.1.0 이상에서 추가되었습니다. 구매 성공 콜백을 받아서 Item을 열어주었을 때 이 함수를 호출해 줍니다.
    iOS 의 경우 BUY_SUCCESS 콜백 내부에서 아이템 생성완료를 모듈로 호출하여 알려줍니다.
    이 함수가 호출 되지 않으면 구매 완료 처리 되지 않아, 다음 구매 진입시 아이템이 재발급 되고, 구매하려고 하였던 아이템은 실패처리된다.
    autoVerify 을 사용하지 않는 Network 게임도 영수증 데이터를 받는 BUY_SUCCESS 콜백을 받을 경우, 영수증 데이터 처리 후 호출해 주어야 합니다.
  • Return Value

void

  • Remark
    Java / C# : void iapBuyFinish()


<작성법 참고>
void CS_IapUseTestServer()
  • Description
    테스트 서버로 접속합니다. (Live, Sandbox 서버는 호출 제외)
    Android 의 경우 iapInitialize 전에 호출 합니다.
    iOS 의 경우 Initialize 이후와 StoreStart이전에 1회 호출 하며, 앱 종료 전까지 테스트 서버에 로그를 남기게 됩니다. UnInitilize를 하신다면 Initialize이후에 다시 세팅을 해주셔야 합니다.
    debug모드에서만 테스트 서버에 로그를 남길 수 있습니다. Release모드일 경우는 호출을 하여도 상용 서버로만 로그를 남길 수 있습니다.
    ThirdParty의 경우 테스트구매로 바로 진행됩니다. 다른마켓의 테스트구매는 UI 문서의 Test 부분 참조.
    Plasma(미지원)의 경우 납품 전, 상용 구매 테스트가 불가능합니다. CS_IapUseTestServer() 호출시 developerflag(1)로 설정되어, 구매를 시도하면 무조건 구매 성공 콜백이 오게됩니다. 이 경우 테스트 서버를 통해 확인하는 방법 밖에 없습니다.
    Samsung GalaxyStore 사용 시 해당 API를 호출하였을 경우 GalaxyStore의 샌드박스 환경 결제 환경으로 진행됩니다. GalaxyStore의 샌드박스 환경에서는 구매 요청 시 항상 성공으로 결과가 전달됩니다.(Android InAppPurchase v2.16.0+)
  • Return Value

void

  • Remark
    Java / C# : void CS_IapUseTestServer()


<작성법 참고>
const char* CS_IapModuleGetVersionEx()
  • Description
    인앱 모듈의 버전을 가져옵니다. (iOS Only)
  • Return Value

인앱 모듈의 버전 (ex 1.5.0)


<작성법 참고>
int CS_IapRequestBalance(char* uid)
  • Description
    Lebi 사용시, 잔액을 확인할 때 사용합니다. 만약 return 값이 음수 일 경우 에러 라고 보면 됩니다.
    동기적으로 통신하기때문에 가급적 따로 Thread 를 생성하여 호출 해 주세요.
    현재 Android Lebi 마켓일 경우에만 사용 가능 합니다.
  • Return Value
  • Parameter
in/out Type Name Description
in char* uid

user의 HIVE ID를 넣어줍니다.

  • Remark
    Java / C# : int iapRequestBalance(String uid)


<작성법 참고>
void CS_IapAuthorizeLicense(LicenseCB licensecb)
  • Description
    Market License 인증 기능이 SDK 에 포함되어있는 마켓의 경우 이 API 를 사용 할 수 있습니다. (다른 마켓은 사용하지 않아도 됩니다.)
    현재 사용 가능한 마켓은 KDDI, MM 마켓만 사용 가능 합니다.
    다른 마켓일 경우, This market does not support licensing authorized. 문구를 띄웁니다.
  • Return Value

void

  • Parameter
in/out Type Name Description
in LicenseCB licensecb

하단의 Callback Func. 을 참조해 주세요.

  • Remark
    Java / C# : void CS_IapAuthorizeLicense(LicenseCB licensecb)


<작성법 참고>
void CS_IapSelectTarget(TargetCB targetcb)
  • Description
    GoogleInApp (GooglePlay) 와 Lebi 를 같이 사용 할 경우 IP Check 로 Billing 방식 을 선택할 수 있는 API 입니다. (다른 마켓은 사용하지 않아도 됩니다.)
    현재, 서버와 통신 후 서버에서 IP 를 체크하여, 중국지역일 경우 Lebi, 그 이외의 경우 GoogleInApp(GooglePlay) 을 보냅니다.
    해당 마켓은 GoogleInApp(GooglePlay) + Lebi 일 때 지원합니다.
    해당 마켓 Library 를 모두 추가 된 상태여야 하며, 서버응답을 성공적으로 받았어도 해당 마켓 Library 를 들고 있지 않으면 실패가 됩니다.
    만약 서버통신에 실패 했을 경우, 최근에 성공한 마켓값을 저장하고 있다가 그 값을 전달 합니다.
    GooglePlay 도 지원하고 있으며, GooglePlay Library 가 있는 경우 GooglePlay 를 내려줍니다.
  • Return Value

void

  • Parameter
in/out Type Name Description
in TargetCB targetcb

하단의 Callback Func. 을 참조해 주세요.

  • Remark
    Java / C# : void CS_IapSelectTarget(TargetCB targetcb)


<작성법 참고>
void CS_IapSetUseDialog(boolean b)
  • Description
    Market 에서 샘플로 가이드된 몇몇 결제 완료/실패 내용을 Dialog 로 표시 합니다. 기본 설정은 false 이며 현재 해당 기능을 지원하는 마켓은 MM(미지원) 입니다.
  • Return Value

void

  • Parameter
in/out Type Name Description
in boolean b

Dialog 출력 유무

  • Remark
    Java / C# : void setUseDialog(boolean b)


<작성법 참고>
void CS_IapCheckPromotePurchase()
  • Description
    iOS v2.13.0 부터 Added
    Appstore 에서 구매 요청 전달받은 pid의 유무를 확인합니다. 전달받은 pid가 있다면 PROMOTE_PURCHASE 콜백으로 pid를 전달받고 pid가 없다면 NOT_OWNED 콜백을 받습니다.
    PROMOTE_PURCHASE로 전달받은 pid가 있다면, 게임에서 구매 가능한 시점에 해당 pid로 구매요청을 진행해야 합니다.
    해당 함수를 호출하고 PROMOTE_PURCHASE 콜백으로 pid를 전달 받는건 1회성으로, 한번 전달된 pid 데이터는 재전달이 불가하기 때문에 호출 이후엔 따로 관리가 필요합니다.
    자세한 내용은 PROMOTE_PURCHASE와 NOT_OWNED 콜백을 참고
  • Return Value

void

  • Remark
    Java / C# : void CS_IapCheckPromotePurchase()


<작성법 참고>
void setUseGoogleAccountId(boolean isOn)
  • Description
    Google Inapp 구매 시 환불 여뷰징 방지를 위한 Account Id 값을 구매 정보 추가 여부를 설정하는 기능을 합니다. (v2.15.1 later)
    (무분별한 환불 요청을 지속적으로 하는 유저 판단을 위해 Google에서 딥러닝을 통해 학습되는 정보)

    Google accountId 설명.png
    (Google billing 참고 링크에서 accountId 키워드를 검색하여 확인할 수 있습니다.)
  • Return Value

void

  • Parameter
in/out Type Name Description
in boolean isOn

Account Id를 구매 정보에 추가 여부

  • Remark
    Java / C# : setUseGoogleAccountId(bool isOn)



Java / C# only


<작성법 참고>
InApp(Activity activity, InAppCallback inAppCallback)
  • Description
    일반적인 InApp 객체 생성자. InAppCallback 을 등록하고 해당 함수로 콜백을 받습니다.
  • Return Value
  • Parameter
in/out Type Name Description
in Activity activity

MainActivity

in InAppCallback inAppCallback

Callback을 받기 위한 interface다.

  • Remark
    not comment


<작성법 참고>
InApp(Activity activity, SurfaceViewWrapper wrapperView)
  • Description
    SurfaceView 를 기반으로 돌아가는 프로젝트 일 경우 (Wrapper, cocos2dx 등) GLThread 로 콜백을 받기 위한 생성자
Wrapper Project 의 경우 (ModuleManager 를 사용할 경우) 따로 생성해 주지 않아도 됩니다.
  • Return Value
  • Parameter
in/out Type Name Description
in Activity activity

MainActivity

in SurfaceViewWrapper wrapperView

Callback을 받기 위한 GLSurfaceView 의 확장형인 SurfaceViewWrapper

ModuleManager 에 구현부가 있습니다.
  • Remark
    not comment


<작성법 참고>
void onActivityResult(int requestCode, int resultCode, Intent data)
  • Description
    Google Play Store, Plasma 등 일부 마켓에서는 SDK 나 마켓앱으로부터 응답을 Activity 의 onActivityResult 로 받기 때문에,
    구매를 요청한 Activity 의 onActivityResult 시점에 호출 해 주면 됩니다.
    Wrapper Project 의 경우 따로 호출해 주지 않아도 됩니다.
  • Return Value
  • Parameter
in/out Type Name Description
in int requestCode

onActivityResult 의 requestCode

in int resultCode

onActivityResult 의 resultCode

in Intent data

onActivityResult 의 data

  • Remark
    not comment


<작성법 참고>
void destroy()
  • Description
    모듈을 종료합니다. services 등이 bind 되는 마켓같은 경우 종료하게 되며, Activity 의 onDestroy() 시점이나 앱 종료시 호출 합니다.
    Wrapper Project 의 경우 따로 호출해 주지 않아도 됩니다.
  • Return Value
  • Remark
    not comment


<작성법 참고>
String getVersion()
  • Description
    모듈의 버전을 반환합니다. initialize 전에는 DefaultLibrary 의 버전날짜를 반환하며 (ex: 2013.08.16), initialize 후에는 해당 마켓의 버전을 반환합니다. (ex: 2.8.0)
  • Return Value
  • Remark
    not comment


<작성법 참고>
void setLogged(boolean b)
  • Description
    모듈의 Log 출력 유무를 설정합니다. Eclipse Logcat 에 InApp 이라는 tag 로 남으며, InApp 객채 생성 후 해당 함수를 호출 해주면 됩니다.
호출 시 "InApp Purchase Log is Active." 라는 toast 가 출력됩니다.
  • Return Value
  • Parameter
in/out Type Name Description
in boolean b

로그 출력 유무

  • Remark
    not comment



콜백 함수

<작성법 참고>
void GET_ITEM_LIST(final String pid, final int quantity, final String uid, final String additionalInfo, final Object stateValue)
  • Description
    Initialize시 서버로 부터 받은 아이템에 대한 정보입니다.
해당 콜백을 지원하는 마켓은 Apple, GooglePlay, Lebi, Amazon, OneStore(+구Tstore포함), Samsung GalaxyStore 입니다. (GoogleInApp 은 지원하지 않음)
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in final String pid
in final int quantity
in final String uid
in final String additionalInfo
in final Object stateValue

ItemList 라는 Class[] 을 넘겨주며, 해당 클래스 구조는 class ItemList 를 참고해 주세요.

C Library 에서는 CS_IapItemList 구조체로 넘어오며, 콜백 파라미터 중 void* iapItem 에 int* 로 갯수가 넘어 옵니다. 마찬가지로 struct CS_IapItemList 부분을 참고해 주세요.
  • Remark
    not comment


<작성법 참고>
void BUY_SUCCESS(final String pid, final int quantity, final String uid, final String additionalInfo, final Object stateValue)
  • Description
    구매에 성공하였을때 불리는 콜백입니다. 영구성아이템도 복구가 아닌 초기 구매시 이 콜백이 호출됩니다.
    autoVerify false로 주어서 게임서버에서 검증시, 영수증 데이터를 모듈에서 구분하지 않습니다. 여기서 BUY_SUCCESS는 영수증을 정상적으로 받았다는 의미로, 받은 데이터를 게임서버로 전송하여, 게임서버에서 처리하거나 게임서버에서의 응답으로 처리하여야 합니다. Restore Item 시 RESTORE_SUCCESS 로 응답이 옵니다.(Google 및 Apple Only)
    OneStore IAP v5에서 일부 특별한 상황에서 uid, additionalInfo 정보가 empty String 데이터("")로 전달됩니다.(v2.15.3 ~ v2.16.0) (예로 원스토어 구매 페이지 화면에서 구매가 완료되었으나 원스토어 구매 페이지 마지막 단계에서 앱이 강제 종료되었을 경우(원스토어 마켓 리스토어 상황) 앱을 재실행하여 구매 복구를 통해 BUY_SUCCESS 전달 상황에 해당) 해당 내용은 v2.16.1에서 수정되어 v2.15.2 이하의 경우처럼 정상적으로 uid, additionalInfo 정보를 다시 전달할 수 있도록 개선되었습니다.
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in final String pid
in final int quantity
in final String uid
in final String additionalInfo
in final Object stateValue
String[] (char**) 형태로 넘겨주게 됩니다,
배열의 인덱스 값은 InAppCallback.class (C2SInApp.h) 에 정의 되어있으며, 해당 마켓인덱스에 해당하는 값을 가져다가 쓰면 됩니다,
ex) StateValue[InAppCallback.GOOGLEINAPP_RECEIPT] / StateValue[TSTORE_TID]
  • Remark
    not comment


<작성법 참고>
void BUY_FAILED(final String pid, final int quantity, final String uid, final String additionalInfo, final Object stateValue)
  • Description
    사용자 취소를 제외한 구매 실패시에 호출됩니다. 실패한 이유는 stateValue에 나타납니다.
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in final String pid
in final int quantity
in final String uid
in final String additionalInfo
in final Object stateValue
ErrorStateValue (struct CS_IapErrorStateValue) 형태로 넘겨주게 됩니다.
errorCode 와 errorValue 는 기존처럼 마켓에서 주는 코드가 들어가며, errorMsg 에는 무조건 문구만 포함됩니다.
특히, ollehMarket, KDDI, MM 같은 마켓은 마켓에서 주는 에러문구가 그대로 포함되며, KDDI, MM 의 경우는 일본어, 중국어 로 표현됩니다.
오류 팝업을 띄우실때 오류코드와 함께 띄워주셔도 되며 (CS 편의), UI 상 문구만 띄워주어도 됩니다.
(ollehMarket, KDDI, MM 마켓은 더이상 지원하지 않습니다. 기 구현된 코드가 있는 경우만 참고바랍니다.)
errorCode 는 무조건 존재하지만, errorValue 와 errorMsg 는 초기값인 "" 인 상태가 있을 수 있습니다.
  • Remark
    not comment


<작성법 참고>
void BUY_CANCELED(final String pid, final int quantity, final String uid, final String additionalInfo, final Object stateValue)
  • Description
    사용자에 의해 결제가 취소되었을 때 호출됩니다.
    네트워크가 연결되어있지 않을 시에도 "Network Inactive" 로 호출 됩니다.
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in final String pid
in final int quantity
in final String uid
in final String additionalInfo
in final Object stateValue
GoogleInApp(미지원), GooglePlay : "User canceled"
Tstore : Tstore에서 제공하는 Error Code (ex> 2002-10)
ollehMarket(미지원) : ollehMarket에서 제공하는 Error Message (ex> "사용자 요청에 의한 취소 입니다.")
OZstore(미지원) : OZstore에서 제공하는 Error Code (ex> 1-10)
ThirdParty : "BUY_CANCELED"
qiip(미지원) : "Item buy canceled."
Lebi : "User Cancel."
Plasma(미지원) : "User Cancel."
Amazon : 사용자가 취소한것과 결제 실패가 같은부분으로 들어오기때문에 (BUY_FAILED) 불리지 않습니다.
KDDI(미지원) : "User Cancel."
MM(미지원) :
  • Remark
    not comment


<작성법 참고>
void RESTORE_SUCCESS(final String pid, final int quantity, final String uid, final String additionalInfo, final Object stateValue)
  • Description
    GooglePlay 혹은 GoogleCheckout의 경우 RestoreItem 호출시 복구에 성공하면 이 콜백이 호출됩니다. Tstore나 ollehMarket(미지원)의 경우 영구성아이템 재구매시 호출됩니다.
    autoVerify false로 주어서 게임서버에서 검증시, 영수증 데이터를 모듈에서 구분하지 않습니다. 여기서 RESTORE_SUCCESS 영수증을 정상적으로 받았다는 의미로, 받은 데이터를 게임서버로 전송하여, 게임서버에서 처리하거나 게임서버에서의 응답으로 처리하여야 합니다. Buy Item 시 BUY_SUCCESS 로 응답이 옵니다.
    GoogleInApp(미지원) 과 Lebi, Amazon 의 경우, RestoreItem 을 호출하면, Restore 할 아이템이 없어도 pid : "", quantity : 0, uid : "", additionalInfo : "", stateValue : Orders Nothing 으로 콜백이 불립니다.
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in final String pid
in final int quantity
in final String uid
in final String additionalInfo
in final Object stateValue
String[] (char**) 형태로 넘겨주게 됩니다,
배열의 인덱스 값은 InAppCallback.class (C2SInApp.h) 에 정의 되어있으며, 해당 마켓인덱스에 해당하는 값을 가져다가 쓰면 됩니다,
ex) StateValue[InAppCallback.GOOGLEINAPP_RECEIPT] / StateValue[TSTORE_TID]
RESTORE_SUCCESS 의 경우, 복구할 게 없을때 주는 콜백이나 검증이 없는 마켓의 경우 해당 필드가 비어 있을 수 있습니다.
  • Remark
    not comment


<작성법 참고>
void RESTORE_FAILED(final String pid, final int quantity, final String uid, final String additionalInfo, final Object stateValue)
  • Description
    리스토어 실패 시에 호출됩니다. 실패한 이유는 stateValue에 나타납니다.
    Android InApp v2.15.0, iOS InApp v2.13.2 미만에서는 리스토어 실패 시 BUY_FAILED 콜백을 내려주고 있습니다.
    Android InApp v2.15.0, iOS InApp v2.13.2 이상에서 구매 실패 상황과 리스토어 실패 상황을 구분하기 위해 RESTORE_FAILED 콜백이 추가되었습니다.
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in final String pid
in final int quantity
in final String uid
in final String additionalInfo
in final Object stateValue
ErrorStateValue (struct CS_IapErrorStateValue) 형태로 넘겨주게 됩니다.
errorCode 와 errorValue 는 기존처럼 마켓에서 주는 코드가 들어가며, errorMsg 에는 무조건 문구만 포함됩니다.
특히, ollehMarket, KDDI, MM 같은 마켓은 마켓에서 주는 에러문구가 그대로 포함되며, KDDI, MM 의 경우는 일본어, 중국어 로 표현됩니다.
오류 팝업을 띄우실때 오류코드와 함께 띄워주셔도 되며 (CS 편의), UI 상 문구만 띄워주어도 됩니다.
(ollehMarket, KDDI, MM 마켓은 더이상 지원하지 않습니다. 기 구현된 코드가 있는 경우만 참고바랍니다.)
errorCode 는 무조건 존재하지만, errorValue 와 errorMsg 는 초기값인 "" 인 상태가 있을 수 있습니다.
  • Remark
    not comment


<작성법 참고>
void PURCHASE_UPDATED(final String pid, final int quantity, final String uid, final String additionalInfo, final Object stateValue)
  • Description
    GooglePlay 에서 PromoCode (redeem code) 를 마켓 앱에서 입력하였을 때 불리게 됩니다. 앱이 실행된 이후에만 신호를 받을 수 있고, 앱이 resume 상태이면 입력 직후 바로 PURCHASE_UPDATED 가 호출되며 pause 상태였을 경우 resume 때 호출 됩니다.
    게임에서는 이 콜백을 받았을 경우 아이템 지급을 처리할 수 있는 시점에서 RestoreItem() 을 호출하여 콜백을 받아 처리하면 됩니다.
    앱이 실행되지 않은체 (혹은 종료 후) PromoCode 를 입력받으면 해당 콜백은 불리지 않습니다. 게임 로직에서 RestoreItem() 을 특정시점에 호출해서 처리가 필요합니다. (앱 처음 실행시 한번 혹은 상점 진입시 등)
    콜백 자체에 특정 값이 포함되어있지는 않습니다.
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in final String pid
in final int quantity
in final String uid
in final String additionalInfo
in final Object stateValue
  • Remark
    not comment


<작성법 참고>
void PROMOTE_PURCHASE(final String pid, final int quantity, final String uid, final String additionalInfo, final Object stateValue)
  • Description
    Appstore 에서 아이템 구매를 요청 시 불려지게 됩니다. Appstore에서 pid가 포함된 scheme 값을 전달 받았을 때 stateValue 로 "state enable" 이라는 값을 콜백하며, 이후 CheckPromotePurchase 함수를 호출했을 때 전달받은 pid 값을 콜백해주며 저장되어있던 데이터는 삭제합니다.
    게임에서는 최초로 이 콜백을 받았을 경우 (pid가 null이고 stateValue가 "state enable" 일 때) 아이템 지급을 처리할 수 있는 시점에서 CheckPromotePurchase() 함수를 호출하여 앱스토어로부터 요청이 들어온 pid를 전달받을 수 있습니다.
    콜백으로 돌아온 pid 값은 1회성으로, 아이템 구매가 가능한 시점에서 해당 pid를 사용하여 아이템 구매 처리를 따로 진행하셔야 합니다.
    stateValue = "state enable" 콜백을 받은 이후 CheckPromotePurchase() 함수 호출 시점까지 전달되지 못한 가장 최근의 pid 값을 클라이언트에서 저장 하고 있습니다. 앱이 재시작된 이후에 CheckPromotePurchase() 함수를 호출해도 기존에 저장된 pid 값이 존재한다면 정상적으로 pid를 전달받을 수 있습니다.
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in final String pid

사용자가 Appstore 구매 기능을 사용하여 구매 요청한 pid 값을 전달해줍니다. (이후 저장되어 있던 pid 값은 삭제합니다.)

in final int quantity
in final String uid
in final String additionalInfo
in final Object stateValue

"state enable" 이라는 값이 돌아온다면 Appstore로부터 pid가 포함된 scheme 값을 전달받아 클라이언트에 저장한 상태로 볼 수 있습니다. 해당 콜백 이후로 CheckPromotePurchase() 함수가 호출된다면 같은 PROMOTE_PURCHASE 콜백으로 pid 값을 전달받게 됩니다.

  • Remark
    not comment


<작성법 참고>
void NOT_OWNED(final String pid, final int quantity, final String uid, final String additionalInfo, final Object stateValue)
  • Description
    CheckPromotePurchase() 를 호출 했을 때 현재 저장되어 있는 Appstore pid 값이 없다면 해당 콜백을 전달합니다.
    게임에서는 이 콜백을 받았을 경우 pid 저장 없이 스킵처리하시면 됩니다.
    콜백 자체에 특정 값이 포함되어있지는 않습니다.
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in final String pid
in final int quantity
in final String uid
in final String additionalInfo
in final Object stateValue
  • Remark
    not comment



C Library

<작성법 참고>
typedef void (*IapCB)(INAPP_RESULT iapState, void* iapItem, void* stateValue)
  • Description
    Parameters 내용은 위의 interface InAppCallback 과 동일합니다.
    stateValue는 각 콜백에 대한 상세내용을 담은 String 값으로, 각 콜백내용에 맞게 사용하시면 됩니다.
    아래의 내용은 예시 이며, BUY_SUCCESS 신호를 받아 아이템을 열어 준 후에, CS_IapBuyFinish() 를 호출하여 확인을 보내주면 됩니다.
    GET_ITEM_LIST에서 해킹단말(되는경우도 있음) 혹은 잘못된 pid일 경우 아이템 정보를 가져오지 못합니다.
    자세한 콜백의 사용법은 샘플을 참고 합니다.
    GET_ITEM_LIST의 count가 0이거나 콜백을 받지 못하면 상점 진입을 실패 시켜야 합니다.(팝업 노출)
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in INAPP_RESULT iapState

INAPP_RESULT에 해당하는 값.

in void* iapItem

아이템 구매후 해당하는 아이템의 정보를 가져온다. GET_ITEM_LIST의 경우 아이템의 갯수 , 그 외의 경우에는 CS_IapItemInfo의 구조체를 받는다.

AppStore 에서는 CS_IapItemList의 formattedString의 경우 currency|price 의 형식으로 넘어온다. 통화 코드는 ISO-4217 입니다. ex) USD | 0.99

공통 인앱 과금 모듈에서 애플에서 전달받는 과금 정보를 통화코드(ISO 4217) | 가격 (USD | 0.99)포멧으로 게임에 전달합니다.
게임의 UI에서 미국, 영국, 일본, 프랑스등의 주요국가코드는 통화코드를 $(USD), ¥(JPY), £(GBP) 등으로 변환해주시고 나머지 국가는 통화코드 그대로 노출하시면 될 듯 합니다.

PlayStore (Google) 의 경우 구매 유저에 따라 마켓에서 화폐단위를 변환하여 $0.99, \1,000 등으로 전달 됩니다.
in void* stateValue

GET_ITEM_LIST일 경우 CS_IapItemList의 구조체를 받고, useAutoLogging이 FALSE 인 경우 BUY_SUCCESS에 영수증 정보, 그 외의 경우는 null값을 갖는다.

Android 의 경우 아래 Sample Code 를 따른다.
  • Remark
    not comment
  • Sample Code
void resultPostInApp(INAPP_RESULT iapState, void* iapItem, void* stateValue) {

    int i=0;
    CS_IapItemInfo *iapItemInfo;
    int* count;
    if(iapState != GET_ITEM_LIST) iapItemInfo = (CS_IapItemInfo*)iapItem;
    else count = (int*)iapItem;
    CS_IapItemList *iapList;

    char** SuccessStateValue;


    switch(iapState) {
    case GET_ITEM_LIST:
        iapList = (CS_IapItemList*)stateValue;
        CS_knlPrintk("Callback item count %d", *count);
        for(i=0; i < *count; i++) {
            CS_knlPrintk("%s\n",iapList[i].productID);
            CS_knlPrintk("%s\n",iapList[i].formattedString);
            CS_knlPrintk("%s\n",iapList[i].localizedTitle);
            CS_knlPrintk("%s\n",iapList[i].localizedDescription);
            CS_knlPrintk("%s\n",iapList[i].currencyCode);
            CS_knlPrintk("%d\n",iapList[i].amountMicros);
        }
        break;

    case BUY_SUCCESS:
    case RESTORE_SUCCESS:
        if(iapState == BUY_SUCCESS) CS_knlPrintk(" --- > BUY_SUCCESS");
        else CS_knlPrintk(" --- > RESTORE_SUCCESS");
        CS_knlPrintk("pid : %s", iapItemInfo->pid);
        CS_knlPrintk("quantity : %d", iapItemInfo->quantity);
        CS_knlPrintk("uid : %s", iapItemInfo->uid);
        CS_knlPrintk("additionalInfo : %s", iapItemInfo->additionalInfo);

        SuccessStateValue = (char**)stateValue;

        CS_knlPrintk("MARKET_NUMBER : %s", SuccessStateValue[MARKET_NUMBER]);
        CS_knlPrintk("MARKET_NAME : %s", SuccessStateValue[MARKET_NAME]);

        switch( atoi((char*)SuccessStateValue[MARKET_NUMBER]) ) {
//      case GoogleInAppBilling:
//          CS_knlPrintk("GOOGLEINAPP_RECEIPT : %s", SuccessStateValue[GOOGLEINAPP_RECEIPT]);
//          CS_knlPrintk("GOOGLEINAPP_SIGNATURE : %s", SuccessStateValue[GOOGLEINAPP_SIGNATURE]);
//          break;
        case TstoreBilling:
            CS_knlPrintk("TSTORE_TRANSACTION : %s", SuccessStateValue[TSTORE_TRANSACTION]);
//          CS_knlPrintk("TSTORE_TID : %s", SuccessStateValue[TSTORE_TID]);
//          CS_knlPrintk("TSTORE_DATELOCAL : %s", SuccessStateValue[TSTORE_DATELOCAL]);
            break;
        case ollehMarketBilling:
            CS_knlPrintk("OLLEHMARKET_TRANSACTIONID : %s", SuccessStateValue[OLLEHMARKET_TRANSACTIONID]);
            CS_knlPrintk("OLLEHMARKET_DATELOCAL : %s", SuccessStateValue[OLLEHMARKET_DATELOCAL]);
            break;
        case OZstoreBilling:
            CS_knlPrintk("OZSTORE_DATELOCAL : %s", SuccessStateValue[OZSTORE_DATELOCAL]);
            CS_knlPrintk("OZSTORE_UKEY : %s", SuccessStateValue[OZSTORE_UKEY]);
            CS_knlPrintk("OZSTORE_TXID : %s", SuccessStateValue[OZSTORE_TXID]);
            break;
        case ThirdPartyBilling:
            CS_knlPrintk("THIRDPARTY_ADDITIONALINFO : %s", SuccessStateValue[THIRDPARTY_ADDITIONALINFO]);
            break;
        case qiipBilling:
            CS_knlPrintk("QIIP_DATELOCAL : %s", SuccessStateValue[QIIP_DATELOCAL]);
            break;
        case HamiBilling:
            CS_knlPrintk("HAMI_DATELOCAL : %s", SuccessStateValue[HAMI_DATELOCAL]);
            break;
        case LebiBilling:
            CS_knlPrintk("LEBI_BILLINGNUM : %s", SuccessStateValue[LEBI_BILLINGNUM]);
            break;
        case PlasmaBilling:
            CS_knlPrintk("PLASMA_PAYMENTID : %s", SuccessStateValue[PLASMA_PAYMENTID]);
            CS_knlPrintk("PLASMA_PURCHASEID : %s", SuccessStateValue[PLASMA_PURCHASEID]);
            CS_knlPrintk("PLASMA_ITEMID : %s", SuccessStateValue[PLASMA_ITEMID]);
            CS_knlPrintk("PLASMA_VERIFYURL : %s", SuccessStateValue[PLASMA_VERIFYURL]);
            CS_knlPrintk("PLASMA_PARAM1 : %s", SuccessStateValue[PLASMA_PARAM1]);
            CS_knlPrintk("PLASMA_PARAM2 : %s", SuccessStateValue[PLASMA_PARAM2]);
            CS_knlPrintk("PLASMA_PARAM3 : %s", SuccessStateValue[PLASMA_PARAM3]);
            CS_knlPrintk("PLASMA_PURCHASEDATE : %s", SuccessStateValue[PLASMA_PURCHASEDATE]);
            break;
        case AmazonBilling:
            CS_knlPrintk("AMAZON_PRODUCTID : %s", SuccessStateValue[AMAZON_PRODUCTID]);
            CS_knlPrintk("AMAZON_USERID : %s", SuccessStateValue[AMAZON_USERID]);
            CS_knlPrintk("AMAZON_RECEIPTID : %s", SuccessStateValue[AMAZON_RECEIPTID]);
            CS_knlPrintk("AMAZON_REQUESTID : %s", SuccessStateValue[AMAZON_REQUESTID]);
            CS_knlPrintk("AMAZON_MARKETPLACE : %s", SuccessStateValue[AMAZON_MARKETPLACE]);
            break;
        case KDDIBilling:
            CS_knlPrintk("KDDI_TRANSACTION : %s", SuccessStateValue[KDDI_TRANSACTION]);
            CS_knlPrintk("KDDI_SIGNATURE : %s", SuccessStateValue[KDDI_SIGNATURE]);
            break;
        case MMBilling:
            CS_knlPrintk("MM_ORDERID : %s", SuccessStateValue[MM_ORDERID]);
            CS_knlPrintk("MM_PURCHASEDATE : %s", SuccessStateValue[MM_PURCHASEDATE]);
            break;
        case MBizBilling:
            CS_knlPrintk("MBIZ_EMONEY : %s", SuccessStateValue[MBIZ_EMONEY]);
            CS_knlPrintk("MBIZ_PURCHASEDATE : %s", SuccessStateValue[MBIZ_PURCHASEDATE]);
            float eMoney = strtof(SuccessStateValue[MBIZ_EMONEY], NULL);
            CS_knlPrintk("MBIZ_EMONEY float : %f", eMoney);
            break;
        case GooglePlayBilling:
            CS_knlPrintk("GOOGLEPLAY_RECEIPT : %s", SuccessStateValue[GOOGLEPLAY_RECEIPT]);
            CS_knlPrintk("GOOGLEPLAY_SIGNATURE : %s", SuccessStateValue[GOOGLEPLAY_SIGNATURE]);
            break;
        default:
            CS_knlPrintk("default");
            break;
        }

        if(iapState == BUY_SUCCESS) CS_IapBuyFinish();
        break;

    case BUY_FAILED:
        CS_knlPrintk(" --- > BUY_FAILED");
        CS_IapErrorStateValue* errorStateValue;
        errorStateValue = (CS_IapErrorStateValue*)stateValue;
        CS_knlPrintk("pid : %s", iapItemInfo->pid);
        CS_knlPrintk("quantity : %d", iapItemInfo->quantity);
        CS_knlPrintk("uid : %s", iapItemInfo->uid);
        CS_knlPrintk("additionalInfo : %s", iapItemInfo->additionalInfo);
        CS_knlPrintk("stateValue errorCode : %s", errorStateValue->errorCode);
        CS_knlPrintk("stateValue errorValue : %s", errorStateValue->errorValue);
        CS_knlPrintk("stateValue errorMsg : %s", errorStateValue->errorMsg);
        break;

    case BUY_CANCELED:
        CS_knlPrintk(" --- > BUY_CANCELED");
        CS_knlPrintk("pid : %s", iapItemInfo->pid);
        CS_knlPrintk("quantity : %d", iapItemInfo->quantity);
        CS_knlPrintk("uid : %s", iapItemInfo-> uid);
        CS_knlPrintk("additionalInfo : %s", iapItemInfo-> additionalInfo);
        CS_knlPrintk("stateValue : %s", stateValue);
        break;

    default:
        break;
    }
}


interface LicenseCallback

<작성법 참고>
void AUTHORIZE_LICENSE_SUCCESS(Object value)
  • Description
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in Object value

KDDI : (String) license 인증 정보 + "|" + license 생성 시간

  • Remark
    not comment
<작성법 참고>
void AUTHORIZE_LICENSE_FAILED(Object value)
  • Description
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in Object value

KDDI : (String) ResultErrorCode

  • Remark
    not comment



interface SelectTarget

<작성법 참고>
void TARGETING_SUCCESS(int target)
  • Description
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in int target

static int BillingTarget 에 해당하는 코드입니다.

ex) 1 은 InApp.GoogleInAppBilling
NDK 의 경우, enum CS_IapBillingTarget 에 해당하는 값입니다.
  • Remark
    not comment


<작성법 참고>
void TARGETING_FAILED(int error)
  • Description
  • Return Value

no return value

  • Parameter
in/out Type Name Description
in int error
0 일 경우는 한번도 IP Check 에 성공한 적이 없는 경우 입니다.
-99 일 경우는 server error
나머지 음수의 경우는 not exist library 로, 해당 Library 의 int 값 * -1 값을 주게 됩니다.
ex) LebiLibrary 가 없을 경우 InApp.LebiBilling * -1 = 8 * -1 = -8
기타 모든 음수는 에러
  • Remark
    not comment



Deprecated Function


Com2uS 공통모듈 >> InApp Purchase >> InApp Purchase 모듈 적용 가이드 (iOS)

InApp Purchase 모듈 적용 가이드 (Android)

InApp Purchase 모듈 적용 가이드 (Unity3d)

>> InApp Purchase 모듈 레퍼런스 가이드 >> InApp Purchase 샘플 가이드 (Android) >> InApp Purchase FAQ
원본 주소 "http://wiki.com2us.com/index.php?title=InApp_Purchase_%EB%AA%A8%EB%93%88_%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4_%EA%B0%80%EC%9D%B4%EB%93%9C&oldid=96528"
개인 도구
이름공간

변수
행위
둘러보기
도구모음
인쇄/내보내기