Hive SDK v1.19.1부터 IAP v2의 지원을 종료합니다. Hive SDK v1.19.1 이상의 환경에서는 Hive IAP v4를 적용하시기 바랍니다.
본 가이드는 Hive IAP v2에 대해 안내하며, Hive SDK v1.19.0 이하 v1.9.0 이상에서 적용하실 수 있습니다.
C2SModuleHiveIAP_Purchase
Hive IAP v2 상품에 대한 구매를 호출한다.
purchase()
메서드를 호출하는 도중 마켓 오류로 RESPONSE_FAIL, CANCELED 에러가 발생하면 사용자에게 구매 과정에 문제가 있음을 알린다.
- 구매 과정에 문제가 있다는 알림을 사용자가 확인했다면
restore()
메서드를 호출하여 구매 복구를 진행한다. purchase()
메서드를 호출하는 도중 NEED_RESTORE 에러가 발생하면 구매가 취소되며, 이 경우restore()
메서드를 호출하여 구매 복구를 진행한다.- 구매 복구 시 RESPONSE_FAIL 에러가 발생하면 구매를 진행할 수 없으므로 사용자에게 복구 과정에 문제가 있음을 알려야 한다.
- 인앱 구입 차단 문구 가이드를 참고하면 필요에 따라 NOT_SUPPORTED 에러 처리로 사용자가 구매 할 수 없는 상태임을 알릴 수 있다.
Request
argument name | type | description | platform | 비고 |
---|---|---|---|---|
pid | string | market pid가 아닌 HiveIAP에서 shopInfo를 호출하여 내려받은 pid | all | |
additionalInfo | string | (JSON string 형태) 구매시 필요한 추가 정보를 기입한다. ex) “{“server_id”:”0″,”character”:”0″}” |
all | 1.12.1+ |
Response
Purchase API 호출시 error 리턴 여부로 구매 성공/실패 판단
구매가 성공하여 성공 콜백을 전달 받았을 경우 C2SModuleHiveIAP_Info (type = “shopInfo”)를 호출하여 상점의 상품정보를 갱신해 주어야한다.
argument name | type | description | platform | 비고 |
---|---|---|---|---|
gameProduct | dictionary | 게임 상품 정보 | all | 1.11.2+ |
gameTransactionId | string | 게임 상품에 대한 Hive IAP의 transactionId | all | 1.11.2+ |
dictionary type for gameProduct
(locationCode = “DEFAULT” 를 사용한다면 비고에 * 표시가 된 값은 사용하지 않는다.)
argument name | type | description | platform | 비고 |
---|---|---|---|---|
pid | string | 게임에서 사용하는 상품 pid | all | |
marketPid | string | 마켓에 등록된 상품 pid | all | |
price | double | 상품 가격 | all | |
displayPrice | string | 상품 가격 문자열(ex. ₩1,000) | all | |
currency | string | 통화 코드 | all | |
additionalInfo | string | (JSON string 형태) 구매시 입력한 추가 정보 |
all | 1.12.1+ |
title | string | 상품 타이틀 | all | * |
description | string | 상품 설명 | all | * |
currency | string | 통화 코드 | all | * |
badgeImageUrl | string | 뱃지 이미지 url | all | * |
productImageUrl | string | 상품 이미지 url | all | * |
titleLandscapeImageUrl | string | 상품 타이틀 이미지 (가로) | all | * |
titlePortraitImageUrl | string | 상품 타이틀 이미지 (세로) | all | * |
descLandscapeImageUrl | string | 상품 설명 이미지 (가로) | all | * |
descPortraitImageUrl | string | 상품 설명 이미지 (세로) | all | * |
productType | string | 상품 타입 일반 상품 : general / 시리즈 상품 : series |
all | 1.11.2+ * |
salesStartUTC | long | 상품 판매 시작 시간 -1일 경우 무제한 |
all | 1.11.2+ * |
salesExpireUTC | long | 상품 판매 만료 시간 -1일 경우 무제한 |
all | 1.11.2+ * |
seriesInfo | dictionary | 시리즈 상품 정보 (productType = general일 땐 필드 없음) |
all | 1.11.2+ * |
샘플 코드
Unity®
API Reference: C2SModule.HiveIAP.Purchase
- public static bool C2SModule.HiveIAP.Purchase(C2SModule.Parameter arg, out C2SModule.Error error);
- public static bool C2SModule.HiveIAP.Purchase(C2SModule.Parameter arg, out C2SModule.Error error,
C2SModule.CompletionHandler completionHandler);
1 2 3 4 5 6 7 8 9 |
public void hiveIAPPurchase(string pid,Action completionHandler) { C2SError error; C2SParameter arg = new C2SParameter (); arg ["pid"] = pid; // shopInfo를 호출하여 전달받은 gamePid 값을 입력 C2SModule.HiveIAP.Purchase(arg,out error,(C2SParameter resultArg,C2SError resultError) => { completionHandler(resultError); }); } |
Unreal
API Reference: HiveSDKUEHiveIAP_Purchase
- void HiveSDKUEHiveIAP_Purchase(FString fstrJson);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
if(productID.IsEmpty()) { return; } TSharedPtr arg = MakeShareable(new FJsonObject); arg->SetStringField(TEXT("pid"), productID); // shopInfo를 호출하여 전달받은 gamePid 값을 입력 FString OutputString; TSharedRef< TJsonWriter<> > Writer = TJsonWriterFactory<>::Create(&OutputString); FJsonSerializer::Serialize(arg.ToSharedRef(), Writer); FHiveSDKModule::Get().HiveSDKUEHiveIAP_Purchase(OutputString); #if PLATFORM_IOS || PLATFORM_ANDROID void MYGAMECLASS::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { //... switch(api) { case C2SModuleApi_HiveIAPPurchase: { if(code == 0) { // success. } else if(code == -300) //C2SModuleErrorCode_NeedRestore { // fail purchase. restore case. } break; } } //... } #endif |
Cocos2d-x
API Reference: C2SModuleHiveIAP_Purchase
- bool C2SModuleHiveIAP_Purchase(const char* pstrJson, C2SModule_Cocos2dx::C2SModuleError* pkError,
C2SModule_Cocos2dx::C2SModuleCompletionHandler* completionHandler = NULL);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
void SampleProject::menuInappPurchaseCallback(cocos2d::Ref* pSender) { Json::Value arg; arg ["pid"] = "123"; // shopInfo를 호출하여 전달받은 gamePid 값을 입력 Json::StyledWriter writer; std::string strJSON = writer.write(arg); C2SModule_Cocos2dx::C2SModuleError error; if( C2SModuleHiveIAP_Purchase( strJSON.c_str(), &error ) == false ) { CCLog( "====>>>> C2SModuleHiveIAP_Purchase error (%s)", error.get()->GetMessage() ); } } void SampleProject::ResultDelegate(C2SModuleApi api, const char* json, C2SModuleErrorCode code, const char* message) { case C2SModuleApi_HiveIAPPurchase: { // 콜백 데이터 없음 } break; } |
iOS
API Reference: C2SModuleHiveIAP Purchase
- +(BOOL)Purchase:(id)arg error:(NSError**)error;
- +(BOOL)Purchase:(id)arg error:(NSError**)error completionHandler:(void(^)(NSDictionary *, NSError*))
completionHandler;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-(void)purchaseIAP:(NSString*)pid completionHandler:(void(^)(NSString *pid,NSError* error))completionHandler { NSError* error; // HiveIAP에서 shopInfo를 호출하여 내려받은 gamePid 값을 입력 NSString* purchasePid = pid; [C2SModuleHiveIAP Purchase: @{@"pid":purchasePid} error:&error completionHandler:^(NSDictionary* resultArg, NSError* resultError) { if(resultError ==nil){ //succeed } completionHandler(pid,resultError); }]; } |
인앱 구입 차단 문구 가이드
한글 | 앱 내 구입 기능이 차단이 되어 구매가 불가합니다. 해제 후 다시 시도해 주세요. (설정 > 일반 > 차단) |
영문 | You can’t make a purchase because the in-app purchase feature has been blocked. Please unblock the feature and try again. (Settings> General> Restrictions) |
프랑스어 | u ne peux pas effectuer l’achat car la fonction d’achat in-app a été bloquée. Débloque d’abord la fonction et essaie de nouveau. (Paramètres > Général > Restrictions) |
독일어 | Kauf nicht möglich, weil das In-App-Kauf-Feature gesperrt ist. Bitte entsperre es und versuche es erneut. (Einstellungen>Allgemein>Einschränkungen) |
일어 | App内の購入機能が制限されており、購入できません。 解除した後、再度お試しください。 (設定 > 一般 > 機能制限) |
중국어(간체) | 因App内购功能已关闭,无法进行购买。 请开启后再试。 (设置>通用>访问限制>App内购买项目) |
중국어(번체) | 因App內購功能已關閉, 無法進行購買. 請開啟後重新再試 (設置>一般>限制>App內購買項目) |
러시아어 | Покупка недоступна, т.к. на устройстве отключены встроенные покупки. Активируйте данную функцию и повторите попытку. («Настройки» > «Основные» > «Ограничения») |
스페인어 | No se puede realizar la compra porque la función de Compras en la app ha sido bloqueada. Favor de desbloquear la función y volver a intentar. (Configuración> General> Restricciones) |
포르투갈어 | Você não pode efetuar uma compra porque a função de compra do app foi bloqueada. Por favor, desbloqueie a função e tente novamente. (Configurações> Geral> Restrições) |
인도네시아어 | Pembelian tidak bisa dilakukan karena fitur pembelian In-App telah dibatasi. Silakan matikan pembatasan dan coba lagi. (Pengaturan > Umum > Pembatasan) |
터키어 | Uygulama içi satın alma özelliği bloke edildiği için satın almayı yapamazsınız. Lütfen özelliğin blokajını kaldırıp tekrar deneyiniz. (Ayarlar> Genel>Kısıtlamalar) |
베트남어 | Bạn không thể thực hiện giao dịch do tính năng Mua In-App đang bị tắt. Vui lòng bật tính năng và thử lại. (Cài đặt > Cài đặt chung > Giới hạn) |
태국어 | คุณไม่สามารถซื้อได้เนื่องจากเมนูการซื้อของในแอพพลิเคชั่นถูกบล็อคอยู่ กรุณาปลดล็อคแล้วลองอีกครั้ง (ตั้งค่า> ทั่วไป > การจำกัด) |
이탈리아어 | Non puoi effettuare l’acquisto perché la funzione di acquisti in-app è bloccata. Preghiamo di sbloccare la funzione e riprovare. (Settings> General> Restrictions) |