跳转到内容

内购(Unity)

FRVRSDK.IAP 让 Unity WebGL 构建可以通过宿主渠道使用的商店进行交易(Facebook IAP、Apple IAP、Google Play Billing 等)。你不挑选 provider —— 由该次发版注入的渠道决定。

封装方法返回/接收的是 JSON 字符串(不是强类型对象)。你自己解析它。

if (FRVRSDK.IAP.IsReady())
{
    // 可以安全地查目录和调用 Purchase。
}

在你尝试填充商店 UI 或显示购买按钮之前先调一下 —— 目录在会话开始时需要一点时间才能就绪。

string catalogJson = FRVRSDK.IAP.GetCatalog();
// 商品对象的 JSON 数组:
// [
//   {
//     "label": "Small Bundle",
//     "price": "$2.99",
//     "priceValue": "2.99",
//     "currencyCode": "USD",
//     "storeId": "bundlesmall",
//     "trackingName": "Small Bundle"
//   },
//   ...
// ]

具体商品信息 + 价格查询(在按钮上很好用):

string productJson    = FRVRSDK.IAP.GetProduct("bundlesmall");
string localisedPrice = FRVRSDK.IAP.GetProductPrice("bundlesmall"); // 例如 "Din 110" 或 "$2.99"

直接把 GetProductPrice 用在按钮文案里 —— 它已经是商店给的玩家本地货币。

FRVRSDK.IAP.Purchase("bundlesmall", resultJson =>
{
    // 失败/取消时 resultJson 为 "{}",成功时是一个 purchase 对象:
    // {
    //   "purchaseId":          "11111111116739804",
    //   "productId":           "bundlesmall",
    //   "channelId":           "facebook-instant",
    //   "purchaseTime":        1761220217239,
    //   "transactionId":       "11111111116739804",
    //   "transactionReceipt":  "9OlnbR6KcvqiDZox....AFVn0"
    // }

    if (resultJson == "{}") return;    // 用户取消或购买失败

    GrantProduct(resultJson);
    FRVRSDK.IAP.ConsumePurchase(resultJson, _ => { });   // 仅消耗品
});

消耗消耗品(金币、生命、单次使用的助力)。永久解锁(去广告、皮肤)不要消耗 —— 否则会变成可以再次购买。

如果游戏在购买成功和发放内容之间崩溃了,凭据会保留为 pending。开机时检查一下:

string unconsumedJson = FRVRSDK.IAP.GetUnconsumedPurchases();
// [
//   { "purchaseId": "...", "productId": "bundlesmall", "purchaseTime": ..., ... },
//   ...
// ]

// 对每一项:发放内容,然后 ConsumePurchase 闭环。