コンテンツにスキップ

商品リストの表示と購入

商品リストを検索

ユーザーがアプリ内ストアに入るときに、製品リスト検索APIを呼び出します。ユーザーが製品リストを要求した場合、製品情報を含むIAPV4Productクラスを返します。

商品リストと詳細

フィールド名 説明
marketPid アプリ内ストアに登録された固有の製品ID
currency 通貨の種類(例:KRW/USD)
price 製品の価格
title 製品のタイトル
displayPrice 製品価格の文字列形式(例:$100.00) 詳細
productDescription 製品の詳細
originalMarketJson 市場から受け取った製品情報
GoogleサブスクリプションV2を使用する場合、Google Play Consoleで定義された製品情報はoriginalMarketJsonで確認できます
displayOriginalPrice 割引前の価格文字列
originalPrice 割引なしの元の価格
iconURL 製品アイコン(512*512)
Hive SDK v4.12.0以降で利用可能、Google専用

displayPrice

  • 通貨記号と価格の組み合わせでdisplayPriceを送信します(例:$0.99)。AndroidやiOSには独自の表示形式があるため、通貨記号と価格の順序は、OSに応じていくつかの国で異なる場合があります。
  • 各国の通貨記号をその表と同じように出力することを確認してください。通貨記号の表を確認するには、識別子ポリシーを参照してください。
  • 追加の国を追加したり、VATを変更する場合、サーバーはすべての通貨のVATを計算し、displayPrice、price、displayOriginalPrice、originalPriceに追加します。したがって、VATに関連する作業はもうありません。
Note

Googleは、priceの値とoriginalPriceの値が異なる場合に元の価格を表示することをサポートしています。2つの値が同じ場合、そのアイテムはセール中ではありません。
AppleはiconURLの値を提供していません。
originalPriceとdisplayOriginalPriceは、Google(v4 12.0.0 +)およびApple(v4 24.0.0 +)専用です。priceの値とoriginalPriceの値が同じ場合、それは割引状態ではないことを意味します。逆に、2つの値が異なる場合、割引中であるため、割引価格と元の価格を別々に表示するために使用できます。

製品リストを検索するには、IAPV4クラスのgetProductInfo()メソッドを呼び出して、リストの製品情報とLebi残高を受け取ります。
以下は、製品リストの検索をリクエストするためのサンプルコードです。

APIリファレンス: hive .IAPV4.getProductInfo

using hive;    
    IAPV4.getProductInfo((ResultAPI result, List<IAPV4Product> productInfoList, int balance) => {    
         if (result.isSuccess()) {    
            // call successful    
        }    
});
#include "HiveIAPV4.h"

FHiveIAPV4::GetProductInfo(FHiveIAPV4OnProductInfoDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TArray<FHiveIAPV4Product>& ProductInfoList, uint32 Balance) {
        if (Result.IsSuccess()) {
                // call successful
        }
}));

APIリファレンス: IAPV4 ::getProductInfo

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
    using namespace std;    
    using namespace hive;    
    IAPV4::getProductInfo([=](ResultAPI const & result, vector<IAPV4Product> const & productInfoList, unsigned int balance) {    
         if (result.isSuccess()) {    
         // call successful    
         }    
});

APIリファレンス: IAPV4.getProductInfo

import com.hive.IAPV4    
    import com.hive.ResultAPI    
    IAPV4.getProductInfo(object : IAPV4.IAPV4ProductInfoListener {    
         override fun onIAPV4ProductInfo(result: ResultAPI, iapV4ProductList: ArrayList<IAPV4.IAPV4Product>?, balance: Int) {    
             if (result.isSuccess) {    
                 // call successful    
             }    
         }    
})

APIリファレンス: com .hive.IAPV4.getProductInfo

import com.hive.IAPV4    
    import com.hive.ResultAPI    
    IAPV4.INSTANCE.getProductInfo((result, iapV4ProductList, balance) -> {    
         if (result.isSuccess()) {    
             // call successful    
         }    
});

APIリファレンス: IAPV4Interface .getProductInfo

import HIVEService    
    IAPV4Interface.getProductInfo() { result, productInfoList, balance in    
        if result.isSuccess() {    
            // call successful    
        }    
}

APIリファレンス: HIVEIAPV4::getProductInfo

#import <HIVEService/HIVEService-Swift.h>    
    [HIVEIAPV4 getProductInfo: ^(HIVEResultAPI *result, NSArray<HIVEIAPV4Product *> *productInfoList, NSUInteger balance) {    
         if ([result isSuccess]) {    
            // call successful    
         }    
}];
Warning

getProductInfo()メソッドを呼び出さないと、製品リストを実装する際に消費可能な製品情報を活用できなくなります。

ゲームクライアントが、Result APIの失敗を返すためのレスポンスを直接実装する必要があります。例えば、成功のコールバックを得るまで再試行するまたはユーザーにエラーポップアップを表示する(例:市場が利用できない)などです。

結果APIコードの詳細については、結果APIコード - IAP v4を参照してください。

Note

WindowsアプリでGoogle PlayのGOOGLE_PLAYSTOREマーケットを使用する場合(Hive SDK v4 Unity Windows 23.0.0以上)、IAPV4.getProductInfoが初めて呼び出されると、製品の支払いに使用するアカウントを選択するためのGoogleアカウントログイン画面がアプリユーザーに表示されます。このログインプロセスはアプリ開発者が実装する機能ではなく、Hive SDKによって自動的に実行されます。
支払いに使用するGoogleアカウントの認証情報が期限切れになると、Hive SDKは自動的に再認証プロセスを実行します。

商品購入

purchase()メソッドをIAPV4クラスで呼び出し、Apple App StoreおよびGoogle Play Storeに登録されたパラメータであるMarket PIDを使用して、IAP v4での製品購入をリクエストします。

以下は製品購入をリクエストするためのサンプルコードです。

APIリファレンス: hive .IAPV4.purchase

using hive;    
    String marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
    String iapPayload = "{YOUR_CUSTOM_PAYLOAD}";    

    IAPV4.purchase(marketPid, iapPayload, (ResultAPI result, IAPV4Receipt receipt) => {    
    if (result.isSuccess()) {    
             // TODO: 受け取ったレシートでレシートの検証をリクエストする    
         }    
});
#include "HiveIAPV4.h"

FString MarketPid = TEXT("YOUR_PRODUCT_MARKET_PID");
FString IapPayload = TEXT("YOUR_CUSTOM_PAYLOAD");

FHiveIAPV4::Purchase(MarketPid, IapPayload, FHiveIAPV4OnPurchaseDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHiveIAPV4Receipt& Receipt) {
        if (Result.IsSuccess()) {
                //TODO: 受領書の検証を要求する
        }
}));

APIリファレンス: IAPV4 ::purchase

#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
    using namespace std;    
    using namespace hive;    
    string marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
    string iapPayload = "{YOUR_CUSTOM_PAYLOAD}";    
    IAPV4::purchase(marketPid, iapPayload, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {    
         if (result.isSuccess()) {    
             // TODO: 受領書の検証を要求する    
         }    
});

APIリファレンス: com.hive.IAPV4.purchase

import com.hive.IAPV4    
    import com.hive.ResultAPI    
    val marketPid = "{YOUR_PRODUCT_MARKET_PID}"    
    val iapPayload = "{YOUR_CUSTOM_PAYLOAD}"    
    IAPV4.purchase(marketPid, iapPayload, object : IAPV4.IAPV4PurchaseListener {    
         override fun onIAPV4Purchase(result: ResultAPI, iapV4Receipt: IAPV4.IAPV4Receipt?) {    
             if (result.isSuccess) {    
                 // call successful    
             }    
         }    
})

APIリファレンス: com .hive.IAPV4.purchase

import com.hive.IAPV4;    
    import com.hive.ResultAPI;    
    String marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
    String iapPayload = "{YOUR_CUSTOM_PAYLOAD}";    
    IAPV4.INSTANCE.purchase(marketPid, iapPayload, (result, iapV4Receipt) -> {    
         if (result.isSuccess()) {    
             // call successful    
         }    
});

APIリファレンス: HIVEIAPV4::purchase:additionalInfo:handler:

import HIVEService    
    let marketPid = "{YOUR_PRODUCT_MARKET_PID}"    
    let iapPayload = "{YOUR_CUSTOM_PAYLOAD}"    

    HIVEIAPV4.purchase(marketPid, iapPayload: iapPayload) { result, receipt in    
         if result.isSuccess() {    
             // TODO: 受領書の検証を受け取った受領書でリクエストする    
         }    
}

APIリファレンス: HIVEIAPV4::purchase:additionalInfo:handler:

#import <HIVEService/HIVEService-Swift.h> 

NSString *marketPid = @"{YOUR_PRODUCT_MARKET_PID}";
NSString *iapPayload = @"{YOUR_CUSTOM_PAYLOAD}";

[HIVEIAPV4購入: marketPid iapPayload: iapPayload handler: ^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {
    if ([result isSuccess]) {
        // TODO: 受け取ったレシートでレシートの検証をリクエストする
    }
}];
Note

サポートされている機能は、オペレーティングシステム/市場によって異なる場合があります。詳細については、サポートされている機能のステータスを参照してください。

iapPayload を使用する

購入(purchase())またはサブスクリプション(purchaseSubscription)メソッドを実行する際に、ゲーム会社は引数として iapPayload を渡すことができます。 iapPayload はゲーム会社によって定義された購入メタデータです。たとえば、ユーザーが製品を購入する際には、購入時間、購入ユーザー情報、購入したゲームキャラクター情報、購入数量(消耗品)、購入トークンなどが含まれる場合があります。

iapPayloadが引数として渡されると、IAPサーバーは購入レシートを検証します、このiapPayloadの値を購入レシートに対応するものと照合し、ゲームサーバーに通知します。具体的には、iapPayloadの値と一意のレシートキーに対応するhiveiap_transaction_idの値が照合され、ゲームサーバーに送信されます。

購入レシートとiapPayloadのペアを利用することで、多くの問題を解決できます。たとえば、ユーザーがアイテムを購入した際にエラーが発生し、支払いは完了したがアイテムが配信されなかったという状況が考えられます。この時、restore()メソッドを実行すれば、そのアイテムの購入レシートを取得できます。しかし、このレシートにはアイテムの種類、購入した時間、どのキャラクターがこのアイテムを購入したかの情報が含まれていないため、ゲーム会社がユーザーのためにどのアイテムを復元すべきか正確に把握することは難しいです。しかし、この情報は購入レシートとペアになったiapPayloadを通じて知ることができるため、ユーザーにアイテムを提供することができます。

Note

iapPayloadを利用することで、支払いシステムを悪用するユーザー情報を分析できます。

iapPayload は最大20KB(UTF-8)です。

サポートされている機能は、オペレーティングシステム/市場によって異なる場合があります。詳細については、サポートされている機能の状況を参照してください。

Warning

iapPayloadを渡す際は、それを暗号化することをお勧めします。領収書とは異なり、iapPayloadは偽造や改ざんに対して脆弱です。

消耗品の購入数量を設定する

Google Playストアでは、ユーザーがショッピングカートで数量を指定することによって、同じアプリ内製品を2つ以上一度の取引で購入することができます。Google Play Consoleの製品設定で複数数量の購入が許可されている場合、アプリは複数数量の購入を処理し、指定された購入数量に基づいてアイテムを配信する必要があります。ただし、複数数量の購入は消費可能なアプリ内製品に限られます。これらは消費後に再度購入できる製品です。繰り返し購入できない製品に対しては、この機能を有効にしないでください。

Note

アイテムに対して複数数量の購入を適用すると、レシート検証レスポンスのhiveiap_quantityで購入数量を確認できます。

purchase() メソッドを呼び出す前の注意事項

  • purchase() メソッドを呼び出す際に RESPONSE_FAIL または CANCELED エラーが市場の問題により送信された場合、購入プロセスにエラーが発生したことをユーザーに通知します。
  • 市場の問題により購入の問題がユーザーに通知された場合、restore() メソッドを呼び出して購入を復元します。
  • purchase() メソッドを呼び出す際に NEED_RESTORE エラーが送信された場合、購入はキャンセルされます。購入を復元するには、restore() メソッドを呼び出します。
  • 請求システムがオフラインで支払おうとしたり、子供が親に代わって支払うように頼んだ場合、purchase() メソッドを呼び出すと ITEM_PENDING エラーが送信され、アイテムは保留状態になります。親の代理購入はGoogle Playストア、Amazon、Apple App Store市場でサポートされています。
  • オフライン支払いが成功した場合や、親が子供の代わりに支払いを行った場合、IAP_UPDATED イベントが UserEngagement を通じて送信されます。 UserEngagementのeventEndコールバックを介してパラメータが返されると、type が "subscription" の場合は restoreSubscription() を呼び出し、type が空の場合は restore() を呼び出します。これらのメソッドを呼び出すことで、完了した領収書を確認できます。
  • 利用できない購入を通知する NOT_SUPPORTED エラーのトラブルシューティングについては、アプリ内購入を制限するためのフレーズガイドを参照してください。
  • デスクトップ環境で HIVESTORE を通じて購入する際、支払いリクエスト画面が新しいウィンドウに表示されます。

hive.IAPV4.purchase(marketPid, null, onIAPV4PurchaseCB); を呼び出すと、ErrorCode:IAPSUCCESS=90Code:IAPV4HiveStoreSuccess=-6110000 のレスポンスが即座に返され、領収書情報は含まれません。これは onIAPV4PurchaseCB を通じて行われます。ErrorCode(またはCode)に基づいて、アイテム配布の資格状態に関するガイダンスメッセージを表示することが可能です。

  • Google PlayのWindowsアプリ(Hive SDK v4 Unity Windows 23.0.0以上)でGOOGLE\_PLAYSTOREマーケットを使用している場合、支払いに使用されるGoogleアカウントの認証情報が期限切れになると、Hive SDKは自動的に再認証プロセスを実行します。
  • Google PlayのWindowsアプリ(Hive SDK v4 Unity Windows 23.0.0以上)でGOOGLE\_PLAYSTOREマーケットを使用している場合、アプリ内に表示される支払い待機ポップアップでユーザーが確認ボタンを押し、支払いの完了が未確認の場合、onIAPV4PurchaseCBを介してErrorCode:IAPSUCCESS=90およびCode:IAPV4PendingPurchase=-6100013のレスポンスが返されます。このレスポンスは支払いが失敗したことを示すものではなく、内部エラーのために支払いの完了が確認できなかったか、ユーザーが単に支払いを行わなかったことを示しています。この場合、領収書は返されず、ユーザーが支払いブラウザウィンドウで支払いを完了している場合、IAPV4.restoreを通じて領収書を取得できます。

購入エラーコード

エラーコード 説明
NEED_INITIALIZE 初期化できません
NETWORK ネットワークエラー
NOT_SUPPORTED 購入できません(デバイスでのアプリ内購入が拒否されているなど)。ユーザーが利用できないストアを設定
INVALID_SESSION 購入のための無効なセッション
INVALID_PARAM 無効なパラメータ
IN_PROGRESS 購入APIが進行中
ITEM_PENDING オフラインでの支払いを促すか、子供が親に代わりに支払うように頼んだ
CANCELED ユーザーがキャンセルしました
NEED_RESTORE 復元APIが必要
RESPONSE_FAIL IAPサーバーエラー

アプリ内購入を制限するフレーズ

Korean アプリ内購入機能が制限されており、購入できません。
解除した後、再度お試しください。
(設定 > スクリーンタイム > コンテンツとプライバシーの制限 > iTunesおよびApp Storeでの購入 > アプリ内課金)
English You can't make a purchase because the in-app purchase feature has been blocked.
Please unblock the feature and try again.
(Settings > Screen Time > Content & Privacy Restrictions > iTunes & App Store Purchases > In-app Purchases)
French 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.
(Réglages > Temps d’écran > Restrictions relatives au contenu et à la confidentialité > Achats dans l’iTunes et l’App Store > Achats intégrés)
German Kauf nicht möglich, weil das In-App-Kauf-Feature gesperrt ist.
Bitte entsperre es und versuche es erneut.
(Einstellungen > Bildschirmzeit > Beschränkungen > Käufe im iTunes & App Store > In-App-Käufe)
Japanese App内の購入機能が制限されており、購入できません。
解除した後、再度お試しください。
(設定 > スクリーンタイム > コンテンツとプライバシーの制限 > iTunesおよびApp Storeでの購入 > App内課金)
Chinese Simplified 因App内购功能已关闭,无法进行购买。
请开启后再试。
(设置 > 屏幕使用时间 > 内容和隐私访问限制 > iTunes Store 与 App Store 购买项目 > App 内购买项目)
Chinese Traditional 因App內購功能已關閉, 無法進行購買.
請開啟後重新再試
(設定 > 螢幕使用時間 > 內容與隱私權限制 > iTunes 與 App Store 購買 > App 內購買)
Russian Покупка недоступна, т.к. на устройстве отключены встроенные покупки.
Активируйте данную функцию и повторите попытку.
(Настройки > Экранное время > Контент и конфиденциальность > Покупки в iTunes Store и App Store > Встроенные покупки)
Spanish 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.
(Ajustes > Tiempo de uso > Restricciones de contenido y privacidad > Compras en iTunes y App Store > Compras dentro de la app)
Portuguese 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.
(Definições > Tempo de ecrã > Conteúdo e privacidade > Compras na iTunes e App Store > Compras integradas)
Indonesian Pembelian tidak bisa dilakukan karena fitur pembelian In-App telah dibatasi.
Silakan matikan pembatasan dan coba lagi.
(Pengaturan > Durasi Layar > Pembatasan Konten & Privasi > Pembelian iTunes & App Store > Pembelian In-app)
Turkish 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 > Ekran Süresi > İçerik ve Gizlilik Sınırlamaları > iTunes ve App Store Satın Alımları > Uygulama İçi Satın Alım)
Vietnamese 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 > Thời gian sử dụng > Bật giới hạn > Mua hàng iTunes & App Store > Mua In-app)
Thai คุณไม่สามารถซื้อได้เนื่องจากเมนูการซื้อของในแอพพลิเคชั่นถูกบล็อคอยู่
กรุณาปลดล็อคแล้วลองอีกครั้ง
(การตั้งค่า > เวลาหน้าจอ > จำกัดเนื้อหาและความเป็นส่วนตัว > สินค้าที่ซื้อใน iTunes & App Store > การซื้อภายในแอพ)
Italian Non puoi effettuare l'acquisto perché la funzione di acquisti in-app è bloccata.
Preghiamo di sbloccare la funzione e riprovare. (Impostazioni > Tempo di utilizzo > Contenuti e privacy > Acquisti su iTunes e App Store > Acquisti in-app)
Arabic .لا يمكنك إجراء عملية شراء لأن ميزة الشراء داخل التطبيق قد تم حظرها .الرجاء إلغاء حظر الميزة والمحاولة مرة أخرى (الإعدادات > مدة استخدام الجهاز > قيود المحتوى والخصوصية > الشراء من iTunes Store و App Store > الشراء من داخل التطبيق)

購入キャンセルポリシーを通知するフレーズ

コンテンツ産業振興法に従い、ゲームストアでの購入の撤回に関する通知および購入撤回ポリシーへのリンクを公開してください。iOSの場合、Appleのアプリ審査プロセス中に購入撤回に関する通知が公開されていた場合、それがゲームの審査拒否の理由となる可能性があります。