订阅支付系统
自动续订订阅¶
Hive SDK v4.11.6 支持一种新功能,称为自动续订订阅,它会定期重复付款。订阅类型包括每月订阅、每年订阅和一般的免费试用。如果您想了解更多关于 Google 和 Apple 提供的订阅格式,请参考以下表格。如果用户按操作系统类型选择定期付款的周期,则可以使用自动续订订阅。
操作系统 | Apple | |
---|---|---|
续订条款 | 每周 每月 每3个月 每6个月 每年 | 每周 每月 每2个月 每3个月 每6个月 每年 |
确保让您的游戏用户在任何设备类型下随时访问自动续订订阅,如果用户定期被收取特定订阅费用。订阅恢复是根据用户需求的重要功能。
价格变更 自动续订订阅可以免费升级或降级订阅级别。订阅不是一次性使用的,并在用户尝试恢复时提供收据。
在谷歌上,订阅可以免费升级或降级订阅级别,并更改为新的订阅,而不考虑之前的订阅。如果用户更改价格,则之前订阅的价值将按日计算,并在新订阅到期后提供。
在苹果平台上,订阅组是在iTunes控制台上定义的,因此可以更改为同一组中的其他订阅类型。如果用户升级了他的订阅,之前订阅的价值将按日计算,并在新订阅到期后提供。在降级的情况下,它将在现有订阅到期后续订为新订阅。
Warning
- 建议提供与 Google 相同的 Apple 订阅周期,每周、每月、每 3 个月、每 6 个月和每年类型。
- 订阅不会自动恢复。
- 建议每个游戏使用一种类型的自动续订订阅。
- 所有订阅提供作为单一订阅组的功能。
- 订阅周期、免费试用期和新订阅者的折扣等详细信息不可用。
- 销售数据不会转移到客户端的营销归因工具(例如,Singular、Adjust),但 IAP 服务器会根据订阅周期发送数据。
- Android 订阅:仅支持 Google Play 商店、亚马逊、One Store、Samsung-GalaxyStore 和华为。不支持 Facebook Cloud 和 Lebi。
- iOS 订阅:仅支持 Apple iTunes Store。
Note
支持的功能可能因操作系统/市场而异。有关更多详细信息,请参见支持功能的状态。
购买、恢复和宽限期¶
购买¶
- 免费试用 如果订阅有免费试用期,则不计算为销售。免费试用期结束后,订阅将自动收费。
- 新订阅者折扣 这是针对新订阅者的促销活动。此促销在特定时间段内以折扣价格提供。
取消¶
订阅者可以在续订期之前取消订阅。如何取消在每个市场的管理订阅菜单中进行了描述。取消订阅后,自动续订将失效。
退款¶
如果订阅者在取消后请求退款,退款金额将根据剩余的时间段和订阅的价值(Google 控制台)进行计算。
恢复¶
如果订阅在付款后不可用,订阅者可以恢复订阅。恢复的价值计算基于所有权政策,如果订阅者拥有该订阅的所有权。
宽限期¶
当订阅续费未能成功收费时,请使用宽限期。确保在宽限期内的状态与订阅的状态相同。
账户暂停 (Google)¶
账户暂停是由于支付时发生问题而未能续订订阅的状态,并以未解决的问题结束。在这种情况下,请确保处理订阅不可用的时间最长为30天。
暂停 (Google)¶
暂停订阅最多可达三个月。当期限结束时,订阅会自动恢复。
显示 Google 通知弹出窗口¶
如果 Google 订阅状态处于 宽限期 或 账户暂停,则显示通知弹出窗口。弹出窗口应包含当前订阅状态、解决问题的方法以及一个链接到市场设置的按钮。在宽限期内,此按钮并不是必需的,但为了用户方便,建议使用。 如果用户在 宽限期 或 暂停 状态下更改支付信息,则在用户处于 宽限期 状态时,订阅会自动支付。在 账户暂停 状态下,用户应重新启动订阅。当用户的订阅状态在重新启动后续订时,提供一个订阅购买页面和一个恢复按钮,以便用户享受他们的订阅福利。
通知弹窗示例如下。使用这些短语或为每个游戏自定义它们。 * 宽限期通知短语
韩语 | 订阅服务已到期,因为自动订阅付款失败。 请前往Google Play的订阅设置,检查您的付款方式并重试。 付款后,请务必点击恢复按钮以检查您的订阅状态。 |
---|---|
英语 | 订阅服务已到期,因为自动订阅付款失败。 请前往Google Play的订阅设置,检查您的付款方式并重试。 付款后,请务必点击恢复按钮以检查您的订阅状态。 |
日语 | 订阅自动付款未能完成,因此订阅服务已结束。 请前往Google Play的订阅设置,检查付款方式并重试。 付款后,请务必点击恢复按钮以检查您的订阅状态。 |
简体中文 | 由于自动付款失败,订阅服务已到期。 前往谷歌商店的订阅设置,查看付款方式后重新进行付款吧。 付款后请务必点击复原(restore)按键查看订阅状态。 |
繁体中文 | 自動續訂扣款失敗,已取消訂閱服務。 請至Google Play的[訂閱]設定中,確認付款方式後,再次付款。 付款完畢後,請務必點選[回復]按鈕,並確認訂閱狀態。 |
法语 | 订阅服务已中断,因为自动付款未正常进行。 请前往Google Play的订阅设置重新进行付款。 付款后,请务必点击“恢复”按钮以确认您的订阅状态。 |
德语 | 订阅已过期,因为自动付款失败。 请前往Google Play的订阅设置,检查您的付款方式并重试。 请确保在购买后点击恢复以检查您的订阅状态。 |
俄语 | 订阅已过期,因为未能进行自动付款。 请前往Google Play的订阅设置,检查付款方式并重试。 付款后,请点击“恢复”按钮以确认您的订阅状态。 |
西班牙语 | 订阅服务已到期,因为自动付款失败。 请前往Google Play的订阅设置,检查您的付款方式并重试。 请确保在购买后点击恢复以检查您的订阅状态。 |
葡萄牙语 | 订阅服务已到期,因为自动付款失败。 请前往Google Play的订阅设置,检查您的付款方式并重试。 请确保在购买后点击恢复以检查您的订阅状态。 |
印尼语 | 订阅服务已停止,因为自动付款失败。 请前往Google Play的订阅设置,检查您的付款方式并重试。 请确保在购买后点击恢复以查看您的订阅状态。 |
越南语 | 订阅服务已到期,因为自动付款失败。 请前往Google Play的订阅设置,检查您的付款方式并重试。 请务必在付款后点击恢复按钮以检查您的订阅状态。 |
泰语 | 订阅服务已到期,因为自动付款失败。 请前往Google Play的订阅设置,检查您的付款方式并重试。 请务必在购买后点击恢复按钮以检查您的订阅状态。 |
意大利语 | 订阅服务已到期,因为自动付款失败。 请前往Google Play的订阅设置,检查您的付款方式并重试。 请确保在购买后点击恢复以检查您的订阅状态。 |
土耳其语 | 订阅服务已到期,因为自动付款未能成功。 请前往Google Play的订阅设置,检查您的付款方式并重试。 请确保在购买后点击恢复按钮以检查您的订阅状态。 |
阿拉伯语 | 订阅服务已到期,因为自动付款失败。 请前往Google Play的设置,检查付款方式并重试。 请确保在购买后点击恢复按钮以检查您的订阅状态。 |
- 当处于待处理状态时的通知短语
韩语 | 구독 자동 결제가 정상적으로 이뤄지지 않아 구독 서비스가 만료되었습니다. Google Play의 구독 설정으로 이동하여 결제 방법을 확인하고 다시 결제를 해주세요. 결제 후엔 반드시 복원(restore)버튼을 클릭하여 구독 상태를 확인해주세요. |
---|---|
英语 | The subscription service has expired because the auto subscription payment has failed. Go to the your Google Play subscription settings, check your payment method and try again. Be sure to click Restore after purchase to check your subscription status. |
日语 | 購読自動決済が行われなかったため、購読サービスが終了しました。 Google Playの購読設定に移動して決済方法を確認し、もう一度お試しください。 決済した後、必ず【復元】ボタンをタップして購読状態を確認してください。 |
简体中文 | 由于自动付款失败,订阅服务已到期。 前往谷歌商店的订阅设置,查看付款方式后重新进行付款吧。 付款后请务必点击复原(restore)按键查看订阅状态。 |
繁体中文 | 自動續訂扣款失敗,已取消訂閱服務。 請至Google Play的[訂閱]設定中,確認付款方式後,再次付款。 付款完畢後,請務必點選[回復]按鈕,並確認訂閱狀態。 |
法语 | Le service d'abonnement est interrompu : le paiement automatique ne s'est pas déroulé normalement. Veuillez procéder de nouveau au paiement en vous rendant dans les paramètres d'abonnement de Google Play. Après le paiement, confirmez bien le statut de l'abonnement en appuyant sur le bouton "Reprendre". |
德语 | Der Abonnement ist abgelaufen, weil die automatische Zahlung für das Abonnement fehlgeschlagen ist. Gehe zu den Einstellungen deiner Google Play-Abonnements, überprüfe deine Zahlungsmethode und versuche es erneut. Bitte stelle sicher, dass du nach dem Kauf auf Wiederherstellen klickst, um den Status deines Abonnements zu überprüfen. |
俄语 | Срок действия подписки истек, поскольку не удалось произвести автоматическую оплату за подписку. Перейдите в настройки подписки Google Play, проверьте метод оплаты и повторите вновь. После оплаты подтвердите статус подписки, нажав на кнопку «Возобновить». |
西班牙语 | La subscripción del servicio ha expirado porque ha fallado el método de pago automático de la subscripción. Ve a los ajustes de subscripción de tu Google Play, comprueba tu método de pago e inténtalo de nuevo. Asegúrate de pulsar Restaurar después de comprar para comprobar el estado de tu subscripción. |
葡萄牙语 | O serviço de assinatura expirou porque houve uma falha no pagamento automático da assinatura. Acesse as suas configurações de assinatura da Google Play, verifique o seu método de pagamento e tente novamente. Certifique-se de clicar em Recuperar após a compra, para conferir o status da sua assinatura. |
印尼语 | Layanan berlangganan dihentikan karena pembayaran otomatis telah gagal. Silakan buka pengaturan langganan Google Play, periksa metode pembayaranmu dan coba lagi. Pastikan kamu klik Pulihkan setelah membeli untuk melihat status berlangganan. |
越南语 | Dịch vụ đăng ký đã hết hạn do thanh toán đăng ký tự động không thành công. Vui lòng vào thiết lập đăng ký của Google Play để kiểm tra phương thức thanh toán của bạn và thanh toán lại. Đừng quên nhấn vào nút Khôi Phục (Restore) sau khi thanh toán để kiểm tra tình trạng đăng ký của bạn. |
泰语 | บริการจากการสมัครบริการหมดอายุแล้ว เนื่องจากชำระเงินอัตโนมัติไม่สำเร็จ กรุณาไปที่หน้าตั้งค่า Subscription ใน Google Play แล้วตรวจสอบวิธีการชำระเงินอีกครั้ง อย่าลืมกด Restore หลังซื้อ เพื่อตรวจสอบสถานะการสมัครของคุณ |
意大利语 | Il servizio di abbonamento è scaduto perché il pagamento dell'abbonamento automatico è fallito. Vai alle impostazioni degli abbonamenti di Google Play, controlla il metodo di pagamento e riprova. Assicurati di fare clic su Ripristina dopo l'acquisto per controllare lo stato dell'abbonamento. |
土耳其语 | Abone otomatik ödeme düzgün gerçekleşmediği için abonelik hizmeti sona erdi. Google Play Abonelik ayarına gidip ödeme yöntemini kontrol edip tekrar ödeme yapınız. Ödemeyi yaptıktan sonra geri yükle (restore) butonuna tıklayıp abonelik durumunuzu kontrol ediniz. |
阿拉伯语 | انتهت صلاحية خدمة الاشتراك بسبب فشل دفع الاشتراك الآلي. انتقل إلى إعداداتك في غوغل بلاي وتحقق من طريقة الدفع و حاول مرة أخرى. تأكد من النقر فوق زر استعادة الأشتراك بعد الشراء للتحقق من حالة اشتراكك. |
Note
支持的功能可能因操作系统/市场而异。有关更多详细信息,请参见支持功能的状态。
订阅购买流程¶
图表¶
流程图¶
Google 订阅 V2 支持¶
Google 订阅 API V2 允许您使用一种新的订阅方法创建和管理多个福利。福利的示例包括您首次订阅的福利,以及在您已经有订阅时通过订阅额外产品获得的折扣。有关 Google 订阅的更多信息,请参见 这里。
如果您使用 Google 订阅 V2,您可以根据订阅状态(例如订阅期限和过去的订阅次数)为支付价格提供差异化的优惠。要使用 Google 订阅 V2,请按照以下步骤操作。
Note
有关 Google 计费库更改的更多信息,请参见 这里。
在 Google Play 控制台注册产品¶
在 Google Play 控制台上注册使用 Google 订阅 V2 销售的产品。有关更多详细信息,请参阅 Play Console 指南。
使用getSubscriptionProductInfo检查注册的产品信息¶
您可以在IAPV4.getSubscriptionProductInfo方法的响应值中检查注册在Google Play控制台中的产品信息,即IAPV4Product
对象的originalMarketJson
。 * productId
: 产品 * basePlanId
: 订阅计划 * offerIdToken
: 福利
以下展示了一个名为“sub003”的示例产品,其信息可以在originalMarketJson
中找到,在注册每周和每月各一次付款并为每月付款定义两个福利之后。
{
"productId": "sub003",
"type": "subs",
"title": "sub003-name (HIVE SDK)",
"name": "sub003-name",
"localizedIn": [
"ko-KR"
],
"skuDetailsToken": "AEuhp4KfxD0MTrwzJV_jl0exSz9NuCZzipMe8mo45lR7pi3y_bWsvXdeKNM04CMxxNY=",
"subscriptionOfferDetails": [
{
"offerIdToken": "AUj\/Yhj7Zx5lt7B0G4qWDtmPFDioPkobZB7zw0xi1A8+B4iD0AbZbwQJKitQLCjR9CMLssbH+g43p4wf3tLREE8H41NgdDpOaCsla0xoTQKPkCsH6+U4XszzPUtOGNwuskbzNjEDfTJoF50j1fSd+IXCkQ==",
"basePlanId": "baseprice-p1m",
"offerId": "offer-freetrial",
"pricingPhases": [
{
"priceAmountMicros": 0,
"priceCurrencyCode": "KRW",
"formattedPrice": "free",
"billingPeriod": "P1M",
"recurrenceMode": 2,
"billingCycleCount": 1
},
{
"priceAmountMicros": 1650000000,
"priceCurrencyCode": "KRW",
"formattedPrice": "₩1,650",
"billingPeriod": "P1M",
"recurrenceMode": 2,
"billingCycleCount": 2
},
{
"priceAmountMicros": 3300000000,
"priceCurrencyCode": "KRW",
"formattedPrice": "₩3,300",
"billingPeriod": "P1M",
"recurrenceMode": 1
}
],
"offerTags": [
"offer-free",
"offer-freetrial"
]
},
{
"offerIdToken": "AUj\/YhjUXnT6K8XbdZd5lUtCSef0HA+qikjGfNPEAXvLeLKWTZ0RqwcFIvR5GhECXTRD1SdUrn0LcaB6oquBo5QeUTEZJGTstWGzfmrwL3oSsvBs1EERERSdJ6NDq54=",
"basePlanId": "baseprice-p1m",
"pricingPhases": [
{
"priceAmountMicros": 3300000000,
"priceCurrencyCode": "KRW",
"formattedPrice": "₩3,300",
"billingPeriod": "P1M",
"recurrenceMode": 1
}
],
"offerTags": []
},
{
"offerIdToken": "AUj\/YhhlJDIsjfnvcc5TfxlBjSA+o3QcNsCAjU+DfXBJn2JF\/zLgew468AvchceNBynmB3CvnPLhqlr8be8dJlIvAEkKgdas1DGoiu3p52jSvwsxh8jQLN7QReXUdrY=",
"basePlanId": "baseprice-p1w",
"pricingPhases": [
{
"priceAmountMicros": 500000000,
"priceCurrencyCode": "KRW",
"formattedPrice": "₩500",
"billingPeriod": "P1W",
"recurrenceMode": 1
}
],
"offerTags": []
}
]
}
在上面的 offerIdToken
示例中,总共有 3 个福利关键值,2 种月付款福利类型和 1 种周付款基础福利。当用户进行月付款时,第一种或第二种福利将实际应用于用户。
请求订阅¶
如下面所示,请使用上述获得的 IAPV4Product
对象 originalMarketJson
请求订阅。您可以请求订阅并将相应的福利应用于用户。
字段名称 | 描述 | 必填 |
---|---|---|
YOUR_PRODUCT_MARKET_PID | 这是originalMarketJson 中的productId 。 | Y |
YOUR_PRODUCT_OLD_MARKET_PID | 用户已经订阅的productId 。在将现有订阅升级到用户当前请求的订阅时需要此字段。 | N |
YOUR_PAYLOAD | 这是游戏工作室预定义的购买元数据。 | N |
YOUR_OFFER_ID_TOKEN | 这是originalMarketJson 中的offerIdToken 。如果您在此字段中未输入值,Hive SDK将使用originalMarketJson 的subscriptionOfferDetails 中的第一个offerIdToken 。 | N |
API 参考: IAPV4 .purchaseSubscription
using hive;
IAPV4PurchaseParam.Builder builder = new IAPV4.IAPV4PurchaseParam.Builder();
IAPV4PurchaseParam param = builder.setMarketPid("YOUR_PRODUCT_MARKET_PID")
.setOldMarketPid("YOUR_PRODUCT_OLD_MARKET_PID")
.setIapPayload("YOUR_PAYLOAD")
.setOfferToken("YOUR_OFFER_ID_TOKEN")
.build();
IAPV4.purchaseSubscription (param, (ResultAPI result, IAPV4Receipt receipt) => {
if (result.isSuccess()) {
// TODO: 使用收到的收据请求验证
}
});
#include "HiveIAPV4.h"
FHiveIAPV4PurchaseParam Param;
Param.MarketPid = TEXT("YOUR_PRODUCT_MARKET_PID");
Param.OldMarketPid = TEXT("YOUR_PRODUCT_OLD_MARKET_PID");
Param.IapPayload = TEXT("YOUR_PAYLOAD");
Param.OfferToken = TEXT("YOUR_OFFER_ID_TOKEN");
FHiveIAPV4::PurchaseSubscription(Param, FHiveIAPV4OnPurchaseDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHiveIAPV4Receipt& Receipt) {
if (Result.IsSuccess()) {
// TODO: Request verification of receipt with received receipt
}
}));
API 参考: IAPV4 ::purchaseSubscription
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
auto* param = new IAPV4PurchaseParam();
param->marketPid = "YOUR_PRODUCT_MARKET_PID";
param->oldMarketPid = "YOUR_PRODUCT_OLD_MARKET_PID";
param->iapPayload = "YOUR_PAYLOAD";
param->offerToken = "YOUT_OFFER_ID_TOKEN";
IAPV4::purchaseSubscription(*param, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {
if (result.isSuccess()) {
// TODO: Request verification of receipt with received receipt
}
});
API 参考: IAPV4.purchaseSubscription
import com.hive.IAPV4
import com.hive.ResultAPI
val param = IAPV4.IAPV4PurchaseParam.Builder()
.setMarketPid("YOUR_PRODUCT_MARKET_PID")
.setOldMarketPid("YOUR_PRODUCT_OLD_MARKET_PID")
.setIapPayload("YOUR_PAYLOAD")
.setOfferToken("YOUR_OFFER_ID_TOKEN")
.build()
IAPV4.purchaseSubscription(param, object : IAPV4.IAPV4PurchaseListener {
override fun onIAPV4Purchase(result: ResultAPI, receipt: IAPV4.IAPV4Receipt?) {
if (result.isSuccess) {
// TODO: Request verification of receipt with received receipt
}
}
})
API 参考: IAPV4.INSTANCE .purchaseSubscription
import com.hive.IAPV4;
import com.hive.ResultAPI;
IAPV4.IAPV4PurchaseParam param = new IAPV4.IAPV4PurchaseParam.Builder()
.setMarketPid("YOUR_PRODUCT_MARKET_PID")
.setOldMarketPid("YOUR_PRODUCT_OLD_MARKET_PID")
.setIapPayload("YOUR_PAYLOAD")
.setOfferToken("YOUR_OFFER_ID_TOKEN")
.build();
IAPV4.INSTANCE.purchaseSubscription(param, (result, iapV4Receipt) -> {
if (result.isSuccess()) {
// TODO: Request verification of receipt with received receipt
}
});
API 参考: IAPV4Interface.purchaseSubscription
import HIVEService
let param = IAPV4PurchaseParam.Builder()
.setMarketPid("YOUR_PRODUCT_MARKET_PID")
.setOldMarketPid("YOUR_PRODUCT_OLD_MARKET_PID")
.setIapPayload("YOUR_PAYLOAD")
.setOfferToken("YOUR_OFFER_ID_TOKEN")
.build()
IAPV4Interface.purchaseSubscription(param) { result, receipt in
if result.isSuccess() {
// TODO: Request verification of receipt with received receipt
}
}
API 参考: HIVEIAPV4 购买订阅
#import <HIVEService/HIVEService-Swift.h>
HIVEIAPV4PurchaseParamBuilder *builder = [[HIVEIAPV4PurchaseParamBuilder alloc] init];
HIVEIAPV4PurchaseParam *param = [[[[[builder setMarketPid: @"YOUR_PRODUCT_MARKET_PID"]
setIapPayload: @"YOUR_PRODUCT_OLD_MARKET_PID"]
setOldMarketPid: @"YOUR_PAYLOAD"]
setOfferToken: @"YOUR_OFFER_ID_TOKEN"]
build];
[HIVEIAPV4 购买订阅: param handler: ^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {
if ([result isSuccess]) {
// TODO: 使用收到的收据请求验证
}
}];
Note
在授予第一个订阅福利时,该福利只能基于 Google Play 商店账户授予第一个订阅。
订阅 API¶
Warning
请确保联系解决方案架构师团队,Com2US平台以实施自动续订订阅系统。
获取订阅产品列表¶
当用户进入游戏中的订阅产品商店时,必须调用查询订阅产品列表的IAPV4.getSubscriptionProductInfo()
方法。当调用此API时,将返回包含产品列表和产品信息的IAPV4Product
对象作为结果。IAPV4Product
对象与搜索产品列表中返回的对象类似。
IAPV4Product
对象¶
字段名称 | 描述 |
---|---|
marketPid | 在应用内商店注册的唯一产品ID |
currency | 货币类型(例如 KRW/USD) |
price | 产品价格 |
title | 产品标题 |
displayPrice | 产品价格的字符串(例如 $100.00) 更多 |
productDescription | 产品详情 |
originalMarketJson | 使用 Google 订阅 V2 时从市场接收到的原始产品信息,可以通过此信息检查在 Google Play 控制台中定义的产品信息。 |
displayOriginalPrice | 折扣前的价格字符串,仅适用于 Hive SDK v4.12.0 及更高版本,仅限 Google |
originalPrice | 未折扣的原始价格 |
iconURL | 产品图标 (512*512),仅适用于 Hive SDK v4.12.0 及更高版本,仅限 Google |
displayPrice¶
- 在订单中发送带有货币符号和价格的displayPrice(例如 $0.99)。由于Android或iOS有其自己的显示类型,货币符号和价格的顺序在不同国家可能会因操作系统而有所不同。
- 确保输出每个国家的货币符号与其表格相同。请参考Hive标识符政策以确认货币符号的表格。
- 如果需要添加或更改增值税,服务器会计算所有货币的增值税并添加到displayPrice、price、displayOriginalPrice和originalPrice中。因此,您不再需要处理与增值税相关的工作。
Note
谷歌支持在价格和原价不同的情况下显示原价。如果两个值相同,则该商品不在促销中。 苹果不提供iconURL值。 originalPrice和displayOriginalPrice仅适用于谷歌(v4 12.0.0 +)和苹果(v4 24.0.0 +)。如果价格值和原价值相同,则表示不处于折扣状态。相反,如果两个值不同,由于正在打折,您可以使用它分别显示折扣价格和原价。
以下是实现getSubscriptionProductInfo()
方法的示例代码。
API 参考: IAPV4::getSubscriptionProductInfo
```None linenums="1"
// 请求搜索订阅列表
IAPV4::getSubscriptionProductInfo([=](ResultAPI const & result, std::vector const & productInfoList, unsigned int balance) {
if (result.isSuccess()) {
for( auto productInfo : productInfoList) {
// 游戏工作室实现所需功能,例如商店 UI。
}
}
else {
// 错误处理
}
});
```
#include "HiveIAPV4.h"
FHiveIAPV4::GetSubscriptionProductInfo(FHiveIAPV4OnProductInfoDelegate::CreateLambda([this](const FHiveResultAPI& Result, const TArray<FHiveIAPV4Product>& ProductInfoList, uint32 Balance) {
if (Result.IsSuccess()) {
for (const auto& ProductInfo : ProductInfoList) {
// 游戏工作室实现所需功能,例如商店 UI。
}
} else {
// 错误处理
}
}));
API 参考: com.hive.IAPV4.getSubscriptionProductInfo
// 请求搜索订阅列表
IAPV4.getSubscriptionProductInfo(new IAPV4.IAPV4ProductInfoListener() {
@Override
public void onIAPV4ProductInfo(ResultAPI result, final List iapV4ProductList, final int balance) {
if (result.isSuccess()) {
for (IAPV4Product productInfo : iapV4ProductList) {
// 游戏工作室所需功能的实现,例如商店 UI。
}
} else {
// 错误处理
}
}
});
API 参考: HIVEIAPV4::getSubscriptionProductInfo:
// 请求搜索订阅列表
IAPV4.getSubscriptionProductInfo(new IAPV4.IAPV4ProductInfoListener() {
@Override
public void onIAPV4ProductInfo(ResultAPI result, final List iapV4ProductList, final int balance) {
if (result.isSuccess()) {
for (IAPV4Product productInfo : iapV4ProductList) {
// 游戏工作室实现所需功能,例如商店 UI。
}
} else {
// 错误处理
}
}
});
Warning
未调用 getSubscriptionProductInfo()
方法将无法在实现产品列表时利用订阅信息。
它要求游戏客户端直接实现返回结果 API 失败的响应,例如 重试直到获得成功回调 或 向用户显示错误弹窗(例如,市场不可用)。有关结果 API 代码的详细信息,请参见 结果 API 代码 - IAP v4。
购买订阅产品¶
调用 IAPV4 类的 purchaseSubscriptionUpdate()
方法,使用在 Apple App Store 和 Google Play Store 注册的 MarketPid 作为参数请求订阅购买。
Note
如果用户需要更改订阅产品,并且已有订阅,请在 oldMarketPid 中输入现有订阅产品的 marketPid。此功能仅在 Android 上有效。
以下是purchaseSubscriptionUpdate()
的示例实现。
API 参考: IAPV4::purchaseSubscriptionUpdate
```unity linenums="1"
std::string marketPid = "{YOUR_PRODUCT_MARKET_PID}";
std::string oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}";
std::string iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}";
// 请求购买订阅产品
IAPV4::purchaseSubscriptionUpdate(marketPid, oldMarketPid, iapPayload, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {
if (result.isSuccess()) {
// 请求验证收到的收据
}
else {
// 错误处理
}
});
```
API 参考: IAPV4::purchaseSubscriptionUpdate
```c++ linenums="1"
std::string marketPid = "{YOUR_PRODUCT_MARKET_PID}";
std::string oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}";
std::string iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}";
// 请求购买订阅产品
IAPV4::purchaseSubscriptionUpdate(marketPid, oldMarketPid, iapPayload, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {
if (result.isSuccess()) {
// 请求验证收到的收据
}
else {
// 错误处理
}
});
```
API 参考: com.hive.IAPV4.purchaseSubscriptionUpdate
val marketPid = "{YOUR_PRODUCT_MARKET_PID}"
val oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}"
val iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}"
// 请求购买订阅产品
IAPV4.purchaseSubscriptionUpdate(pid, oldMarketPid, iapPayload, object : IAPV4.IAPV4PurchaseListener {
override fun onIAPV4Purchase(result: ResultAPI, iapV4Receipt: IAPV4.IAPV4Receipt?) {
if (result.isSuccess()) {
// 请求使用收到的收据验证
} else {
// 错误处理
}
}
})
API 参考: com.hive.IAPV4.purchaseSubscriptionUpdate
String marketPid = "{YOUR_PRODUCT_MARKET_PID}";
String oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}";
String iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}";
// 请求购买订阅产品
IAPV4.purchaseSubscriptionUpdate(pid, oldMarketPid, iapPayload, new IAPV4.IAPV4PurchaseListener() {
@Override
public void onIAPV4Purchase(ResultAPI result, IAPV4.IAPV4Receipt iapV4Receipt) {
if (result.isSuccess()) {
// 请求验证收到的收据
} else {
// 错误处理
}
}
});
API 参考: HIVEIAPV4::purchaseSubscriptionUpdate:oldMarketPid:additionalInfo:handler:
let marketPid = "{YOUR_PRODUCT_MARKET_PID}"
let oldMarketPid = "{YOUR_PRODUCT_OLD_MARKET_PID}"
let iapPayload = "{YOUR_PRODUCT_IAP_PAYLOAD}"
// 请求购买订阅产品
HIVEIAPV4.purchaseSubscriptionUpdate(marketPid, oldMarketPid: oldMarketPid, iapPayload: iapPayload) { result, receipt in
if result.isSuccess() {
// 请求验证收到的收据
} else {
// 错误处理
}
}
API Reference: HIVEIAPV4::purchaseSubscriptionUpdate:oldMarketPid:additionalInfo:handler:
NSString* marketPid = @"{YOUR_PRODUCT_MARKET_PID}";
NSString* oldMarketPid = @"{YOUR_PRODUCT_OLD_MARKET_PID}";
NSString* iapPayload = @"{YOUR_PRODUCT_IAP_PAYLOAD}";
// 请求购买订阅产品
[HIVEIAPV4 purchaseSubscriptionUpdate:marketPid oldMarketPid:oldMarketPid iapPayload:iapPayload handler:^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {
if ([result isSuccess]) {
// 请求验证收到的收据
} else {
// 错误处理
}
}];
恢复订阅状态¶
如果当前订阅在订阅者的设备上不可用,请在 IAPV4 类中实现 restoreSubscription()
方法,以恢复订阅并请求已收费订阅的收据。
以下是实现restoreSubscription()
方法的示例代码。
API 参考: hive .IAPV4.restoreSubscription
API 参考: IAPV4 ::restoreSubscription
API 参考: IAPV4.restoreSubscription
import com.hive.IAPV4
import com.hive.ResultAPI
IAPV4.restoreSubscription(object : IAPV4.IAPV4RestoreListener {
override fun onIAPV4Restore(result: ResultAPI, iapv4ReceiptList: ArrayList<IAPV4.IAPV4Receipt>?) {
if (result.isSuccess) {
// TODO: Request receipt verification using the received iapv4ReceiptList
}
}
})
API 参考: HIVEIAPV4 ::restoreSubscription: