商品リストの表示と購入
商品リストを検索¶
ユーザーがアプリ内ストアに入るときに、製品リスト検索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
APIリファレンス: IAPV4 ::getProductInfo
APIリファレンス: IAPV4.getProductInfo
APIリファレンス: com .hive.IAPV4.getProductInfo
APIリファレンス: IAPV4Interface .getProductInfo
APIリファレンス: HIVEIAPV4::getProductInfo
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
#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) {
// 成功した場合の呼び出し
}
}
})
APIリファレンス: com .hive.IAPV4.purchase
API リファレンス: HIVEIAPV4::purchase:additionalInfo:handler:
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つ以上1回の取引で購入できるようになっています。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 イベントの end コールバックを介してパラメータが返された場合、
type
が "subscription" の場合はrestoreSubscription()
を呼び出し、type
が空の場合はrestore()
を呼び出します。これらのメソッドを呼び出すことで、完了したレシートを確認できます。 - 利用できない購入を通知する NOT_SUPPORTED エラーのトラブルシューティングを行うには、アプリ内購入を制限するためのフレーズガイドを参照してください。
- デスクトップ環境で HIVESTORE を通じて購入する際、支払いリクエスト画面が新しいウィンドウに表示されます。
hive.IAPV4.purchase(marketPid, null, onIAPV4PurchaseCB);
を呼び出すと、ErrorCode:IAPSUCCESS=90 と Code: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のアプリ審査プロセス中に購入撤回に関する通知が表示されていた場合、それがゲームの審査拒否の理由となる可能性があります。