FRVRSDK.instance 在 Cocos 里暴露完整的内购接口。底层商店(Facebook IAP、Apple IAP、Google Play Billing 等)由当前宿主渠道决定 —— 你不用自己挑。
if (!FRVRSDK.instance.isIAPReady()) {
// 先别显示购买按钮 —— 目录还没加载好
return;
}
填充商店 UI 之前调用一次。会话刚开始时,目录解析需要一点点时间。
const catalog = FRVRSDK.instance.getIAPCatalog();
// { product_id_1: { label, price, priceValue, currencyCode, storeId, ... }, ... }
const product = FRVRSDK.instance.getIAPProduct('coins_100');
// { label, price, priceValue, currencyCode, storeId, ... } | undefined
按钮文案直接用 product.price —— 它已经是按玩家币种本地化好的。
const purchase = await FRVRSDK.instance.purchase('coins_100', { meta: 'shop_click' });
if (purchase) {
grantItem(purchase.productId);
// 仅消耗型商品需要消耗(金币、一次性加成等)
await FRVRSDK.instance.consumePurchase(purchase);
}
如果用户取消或购买失败,purchase 为 null / undefined。这种情况下不要再弹错误 —— 商店 UI 已经处理过了。
{
purchaseId: string, // 本次交易的唯一 id
productId: string, // 你目录里的 key
channelId: string, // 例如 "facebook-instant"
purchaseTime: number, // 自 epoch 起的毫秒数
transactionId: string,
transactionReceipt: string, // 已签名 blob —— 请在服务器端校验
}
- 消耗型(金币、生命、活动货币) —— 发放后调用
consumePurchase(),商店才会允许再次购买。
- 持久型(去广告、付费皮肤、赛季通行证) —— 不要消耗。如果玩家重装或换设备,通过下面的未消耗回执检查来恢复。
如果游戏在购买成功与发放道具之间崩溃,商店会把回执保留为待处理状态。在启动时跑一遍:
const unconsumed = await FRVRSDK.instance.getUnconsumedPurchases();
for (const purchase of unconsumed) {
grantItem(purchase.productId);
await FRVRSDK.instance.consumePurchase(purchase);
}
新设备上恢复持久型商品也是走同一条路径 —— 你自己代码里发放持久型应当幂等,所以重跑也安全。