Skip to content

IAP 通用透传事件 (asset.iap.notification) 说明文档

asset.iap.notification 是一个通用的 IAP (In-App Purchase) Webhook 事件,由 BytePower Server 接收到第三方支付平台(Paddle, Stripe, PayPal, FunnelFox)的 Webhook 通知后即时触发。

该事件旨在无损透传第三方平台的原始数据,供下游服务(如数据分析、BI 系统、自定义业务逻辑)使用,而无需关心具体的支付逻辑处理结果。

1. 事件结构 (Event Structure)

所有 asset.iap.notification 事件均遵循统一的 JSON 结构:

字段名类型说明
idString事件唯一 ID (Snowflake ID)
timeInteger事件发生时间 (毫秒时间戳)
nameString固定为 asset.iap.notification
user_idStringBytePower 用户 ID (如果能关联到)
app_idStringBytePower 应用 ID
platformString支付平台 (paddle, stripe, paypal, funnelfox)
app_platformString应用平台 (ios, android, web 等) - 取自 AppConfig
bundle_idStringBundle ID - 取自 AppConfig
bytepower_product_idStringBytePower 产品 ID (关联到的内部产品)
platform_product_idString平台产品 ID (如 Stripe Price ID)
client_ipString客户端 IP (如果可用)
environmentString环境 (develop, debugproduct)
api_envStringAPI 环境 (production, sandbox)
device_infoObject设备信息对象 (包含 device_id, idfa, idfv 等)
dataObject核心负载数据 (包含平台原始信息)
json
{
  "id": "snowflake_id",        // 事件唯一 ID
  "time": 1678886400000,       // 事件发生时间 (毫秒时间戳)
  "name": "asset.iap.notification",
  "user_id": "user_123",       // 用户 ID (如果能关联到)
  "app_id": "app_abc",         // 应用 ID
  "platform": "paddle",        // 支付平台 (paddle, stripe, paypal, funnelfox)
  "app_platform": "ios",       // 应用平台 (ios, android, web, etc.) - 取自 AppConfig
  "bundle_id": "com.example.app", // Bundle ID - 取自 AppConfig
  "bytepower_product_id": "bp_prod_1", // BytePower 产品 ID (关联到的内部产品)
  "platform_product_id": "p_123",      // 平台产品 ID (如 Stripe Price ID)
  "client_ip": "1.2.3.4",      // 客户端 IP (如果可用)
  "environment": "production", // 环境 (develop, debug 或 product)
  "api_env": "production",     // API 环境 (production, sandbox)
  "device_info": {             // 设备信息 (如果关联到了购买时的设备信息)
    "device_id": "...",
    "idfa": "...",
    "idfv": "..."
  },
  "data": {                    // **核心负载数据** (包含平台原始信息)
    // 各平台特定的数据字段,详见下文
  }
}

2. Platform Specific Data Payload

data 字段中的内容根据 platform 的不同而有所差异。以下是各平台的数据结构说明。

2.1 Common Data Fields

所有平台的 data 对象中都包含以下通用字段:

字段名类型说明
platform_event_typeString平台特定的事件类型字符串 (e.g., transaction.completed, PAYMENT.SALE.COMPLETED).

2.2 Paddle

platformpaddle 时,data 包含以下字段:

字段名类型说明
paddle_eventObject[核心] Paddle 原始事件对象 (完整结构)
paddle_subscriptionObject(可选) Paddle 订阅详情对象。当事件涉及订阅时存在。
paddle_transactionObject(可选) Paddle 交易详情对象。当事件涉及交易时存在。
paddle_adjustmentObject(可选) Paddle 调整(Refund/Chargeback)对象。

示例 Data:

json
"data": {
  "paddle_event": {
    "event_id": "evt_...",
    "event_type": "transaction.completed",
    "data": { ... } // 原始 payload
  },
  "paddle_transaction": {
    "id": "txn_...",
    "status": "completed",
    ...
  },
  "paddle_subscription": {
    "id": "sub_...",
    "status": "active",
    ...
  }
}

2.3 Stripe

platformstripe 时,data 包含以下字段:

字段名类型说明
stripe_eventObject[核心] Stripe 原始 Event 对象 (完整结构)
stripe_subscriptionObject(可选) Stripe Subscription 对象。
stripe_invoiceObject(可选) Stripe Invoice 对象。当事件为 Invoice 相关时存在。
stripe_payment_intentObject(可选) Stripe PaymentIntent 对象。
stripe_refundObject(可选) Stripe Refund 对象。

示例 Data:

json
"data": {
  "stripe_event": {
    "id": "evt_...",
    "type": "invoice.payment_succeeded",
    "data": {
      "object": { ... } // Invoice object
    }
  },
  "stripe_invoice": { ... },
  "stripe_subscription": { ... }
}

2.4 PayPal

platformpaypal 时,data 包含以下字段:

字段名类型说明
paypal_eventObject[核心] PayPal 原始 Webhook 事件对象
paypal_subscriptionObject(可选) PayPal 订阅详情对象。
paypal_orderObject(可选) PayPal 订单/交易对象 (Sale 或 Capture)。
paypal_refundObject(可选) PayPal 退款对象。

示例 Data:

json
"data": {
  "paypal_event": {
    "id": "WH-...",
    "event_type": "PAYMENT.SALE.COMPLETED",
    "resource_type": "sale",
    "resource": { ... }
  },
  "paypal_order": { ... }, // Sale object
  "paypal_subscription": { ... }
}

2.5 FunnelFox

platformfunnelfox 时,data 包含以下字段:

字段名类型说明
funnelfox_eventObject[核心] FunnelFox 原始事件对象 (完整结构)

注意: FunnelFox 的事件对象内部已经包含了 Subscription, Order, User 等详细信息,因此通常直接读取 funnelfox_event 即可。

示例 Data:

json
"data": {
  "funnelfox_event": {
    "event_id": "...",
    "event_type": "subscription",
    "subtype": "renewing",
    "subscription": { ... },
    "order": { ... },
    "user": { ... }
  }
}

3. 开发指南

3.1 消费 data 字段

由于 data 是一个 map[string]any,建议开发者首先根据外层的 platform 字段判断来源,然后直接读取对应的 *_event 核心字段(如 paddle_event, stripe_event 等)。这些字段包含了最完整、最原始的 Webhook 数据。

其他辅助字段(如 paddle_subscription)是为了方便快速访问而提取的,可能需要进行空值检查。

3.2 字段关联

BytePower Server 会尝试根据 Webhook 数据关联内部用户和产品:

  • user_id: 如果 Webhook 数据中包含透传的 BytePower 用户 ID,或者能通过 Subscription ID 在内部数据库找到对应记录,则会自动填充。
  • bytepower_product_id: 关联到的 BytePower 内部产品 ID。

如果这些字段为空,说明该 Webhook 事件可能来自未知用户或无法关联的交易(例如未在 BytePower 系统中初始化的外部购买)。

京ICP备19011570号-2