跳转至

查看产品列表并购买

搜索产品列表

当用户进入应用内商店时调用产品列表搜索API。如果用户请求产品列表,返回包含产品信息的IAPV4Product类。

产品列表和详情

字段名称 描述
marketPid 在应用内商店注册的固有产品ID
currency 货币类型(例如:KRW/USD)
price 产品价格
title 产品标题
displayPrice 产品价格的字符串类型(例如:$100.00) 更多
productDescription 产品详情
originalMarketJson 从市场接收到的产品信息
使用Google订阅V2时,可以通过originalMarketJson检查在Google Play控制台中定义的产品信息
displayOriginalPrice 折扣前的价格字符串
originalPrice 未折扣的原价
iconURL 产品图标(512*512)
仅适用于Hive SDK v4.12.0及更高版本,适用于Google

displayPrice

  • 在订单中发送带有货币符号和价格的displayPrice(例如 $0.99)。由于Android或iOS有其自己的显示类型,因此货币符号和价格的顺序在不同国家可能会有所不同,具体取决于操作系统。
  • 确保输出每个国家的货币符号与其表格相同。请参考标识符政策以确认货币符号的表格。
  • 如果需要添加或更改增值税,服务器会计算所有货币的增值税并将其添加到displayPrice、price、displayOriginalPrice和originalPrice中。因此,您无需再处理与增值税相关的工作。
Note

Google 支持在价格和原始价格的值不同的情况下显示原始价格。如果两个值相同,则该商品不在促销中。
Apple 不提供 iconURL 值。
originalPrice 和 displayOriginalPrice 仅适用于 Google (v4 12.0.0 +) 和 Apple (v4 24.0.0 +)。如果价格值和 originalPrice 值相同,则表示该商品不处于折扣状态。相反,如果两个值不同,由于它处于折扣状态,您可以使用它分别显示折扣价格和原始价格。

要搜索产品列表,请在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()) {    
         // 调用成功    
         }    
});

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() 方法将无法在实现产品列表时利用可消耗产品的信息。

这要求游戏客户端直接实现返回结果 API 失败的响应,例如 重试直到获得成功回调向用户显示错误弹窗(例如,市场不可用)

有关结果 API 代码的详细信息,请参见 结果 API 代码 - IAP v4

Note

当在 Windows 应用程序中使用 GOOGLE\_PLAYSTORE 市场进行 Google Play(Hive SDK v4 Unity Windows 23.0.0 或更高版本)时,第一次调用 IAPV4.getProductInfo 时,会出现一个 Google 账户登录界面,让应用用户选择用于支付产品的账户。此登录过程并不是应用开发者实现的功能;它是由 Hive SDK 自动执行的。
如果用于支付的 Google 账户的身份验证信息过期,Hive SDK 会自动执行重新身份验证过程。

产品购买

IAPV4类中调用purchase()方法,使用市场PID,这是在Apple App Store和Google Play Store上注册的参数,以请求在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: Request verification of receipt with received receipt    
         }    
});
#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: Request verification of receipt with received receipt
        }
}));

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: Request verification of receipt with received receipt    
         }    
});

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 处理程序: ^(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 商店允许用户在单次交易中通过在购物车中指定数量来购买两个或更多相同的应用内产品。如果您的 Google Play 控制台产品设置允许多数量购买,则您的应用应处理多数量购买,并根据指定的购买数量交付商品。然而,多数量购买仅适用于可消耗的应用内产品,这些产品在消费后可以再次购买。请勿为无法重复购买的产品启用此功能。

Note

如果您对某个项目申请多数量购买,您可以在收据验证响应中的 hiveiap_quantity中检查购买数量。

调用 purchase() 方法前的注意事项

  • 如果在调用 purchase() 方法时由于市场问题发送了 RESPONSE_FAILCANCELED 错误,请通知用户购买过程发生错误。
  • 如果由于市场问题通知用户购买问题,请调用 restore() 方法以恢复购买。
  • 如果在调用 purchase() 方法时发送了 NEED_RESTORE 错误,则购买被取消。要恢复购买,请调用 restore() 方法。
  • 如果计费系统尝试离线支付或孩子请求父母代为支付时调用 purchase() 方法,发送 ITEM_PENDING 错误,项目进入待处理状态。父母的代理购买在 Google Play 商店、亚马逊和 Apple 应用商店市场中得到支持。
  • 如果成功进行离线支付或父母代替孩子支付,则通过 UserEngagement 发送 IAP_UPDATED 事件。 当通过 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=90Code: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 由于应用内购买功能已被阻止,您无法进行购买。
请解除该功能的阻止并重试。
(设置 > 屏幕时间 > 内容和隐私限制 > iTunes 和 App Store 购买 > 应用内购买)
French 无法进行购买,因为应用内购买功能已被阻止。
请先解除该功能的阻止,然后再试。
(设置 > 屏幕时间 > 内容和隐私限制 > iTunes 和 App Store 购买 > 应用内购买)
German 由于应用内购买功能被禁用,无法进行购买。
请解除限制并重试。
(设置 > 屏幕时间 > 限制 > iTunes 和 App Store 购买 > 应用内购买)
Japanese アプリ内の購入機能が制限されているため、購入できません。
制限を解除した後、再度お試しください。
(設定 > スクリーンタイム > コンテンツとプライバシーの制限 > iTunesおよびApp Storeでの購入 > アプリ内課金)
Chinese Simplified 因App内购功能已关闭,无法进行购买。
请开启后再试。
(设置 > 屏幕使用时间 > 内容和隐私访问限制 > iTunes Store 与 App Store 购买项目 > App 内购买项目)
Chinese Traditional 因App內購功能已關閉, 無法進行購買.
請開啟後重新再試
(設定 > 螢幕使用時間 > 內容與隱私權限制 > iTunes 與 App Store 購買 > App 內購買)
Russian Покупка недоступна, так как на устройстве отключены встроенные покупки.
Активируйте данную функцию и повторите попытку.
(Настройки > Экранное время > Контент и конфиденциальность > Покупки в iTunes Store и App Store > Встроенные покупки)
Spanish 无法进行购买,因为应用内购买功能已被阻止。
请解除该功能的阻止并重试。
(设置 > 屏幕时间 > 内容和隐私限制 > iTunes 和 App Store 购买 > 应用内购买)
Portuguese 由于应用内购买功能被禁用,您无法进行购买。
请解除限制并重试。
(设置 > 屏幕时间 > 内容和隐私限制 > iTunes 和 App Store 购买 > 应用内购买)
Indonesian Pembelian tidak dapat dilakukan karena fitur pembelian dalam aplikasi telah diblokir.
Silakan buka blokir fitur tersebut dan coba lagi.
(Pengaturan > Durasi Layar > Pembatasan Konten & Privasi > Pembelian iTunes & App Store > Pembelian Dalam Aplikasi)
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,如果在苹果对您的应用进行检查时公开了关于购买撤回的通知,这可能是拒绝审核您游戏的原因。