跳转到内容

内购(IAP)

FRVR.iap 在 Google Play、Facebook Instant、Apple iAP 等渠道计费后端之上做抽象。你描述一份目录,各渠道会把你的产品 ID 映射到自家商店。

FRVR.config.iap = {
  catalog: {
    COINS_100:  { label: '100 金币',   storeId: 'com.mygame.coins_100' },
    COINS_500:  { label: '500 金币',   storeId: 'com.mygame.coins_500' },
    REMOVE_ADS: { label: '去广告',     storeId: 'com.mygame.remove_ads' },
  },
};
  • (COINS_100)是你自己代码里用的。
  • storeId 是当前渠道商店里这个商品的名字。
  • label 是 UI 上展示用的人类可读名(没有现成的就用它)。

FRVR.init() 之后、第一次引导 tick 之后,目录就绪:

const catalog = FRVR.iap.getCatalog();
// { COINS_100: { label, storeId, price, currency, … }, … }

const item = FRVR.iap.getProductById('COINS_100');
// { label, storeId, price, currency, description, … }

价格/币种来自底层商店。请用它们 —— 不要硬编码价格。

FRVR.iap.purchase('COINS_100', { meta: 'optional_game_context' })
  .then(purchase => grantCoins(100, purchase))
  .catch(err => {
    if (err instanceof FRVR.iap.errors.IAPPurchaseErrorCancelledByUser) return;
    if (err instanceof FRVR.iap.errors.IAPPurchaseErrorAlreadyOwned)    return ownedFlow();
    console.error('purchase failed', err);
  });

错误类型:

错误含义
IAPPurchaseErrorCancelledByUser用户关掉了支付窗口。这不是要弹给用户看的错误。
IAPPurchaseErrorAlreadyOwned该账号已拥有该耐用品。
IAPPurchaseErrorUnknownProduct产品 ID 错误。
IAPError兜底通用错误。看 .code

消耗品(金币、宝石)可以反复购买。发完物品后,要消耗这笔购买,商店才会放开让用户再次购买:

FRVR.iap.purchase('COINS_100')
  .then(purchase => {
    grantCoins(100);
    return FRVR.iap.consumePurchase(purchase);   // 返回 purchaseId
  });

耐用品(去广告、角色皮肤)永远不消耗。在新设备上重新发放:

FRVR.iap.restorePurchases().then(purchases => {
  for (const p of purchases) applyDurable(p.productId);
});

如果你的 App 在购买与发货之间崩了,商店会把收据保留为待处理状态。每次启动时:

FRVR.iap.getUnconsumedPurchases().then(purchases => {
  purchases.forEach(p => {
    grantCoins(lookupAmount(p.productId));
    FRVR.iap.consumePurchase(p);
  });
});

哪怕用户在购买中途强杀了 App,这一步也能把闭环兜回来。

dev 渠道自带一份模拟目录和一条假的购买流程。可以试一下买 → 消耗 → 恢复。

IAP:目录、购买、消耗、恢复

loading SDK…
 
方法作用
isReady() / onReady(cb)provider 是否就绪。
getCatalog()按你定义的 ID 列出所有商品。
getProductById(id)单个商品,含商店价格。
purchase(id, meta?)发起结账。resolve 出收据。
consumePurchase(purchase)把消耗品标记为已发放。
restorePurchases()重新派发用户拥有的耐用品。
getUnconsumedPurchases()未完成的消耗品 —— 启动时调用以恢复。
errors.*instanceof 判定的错误类。