每日奖励 Webhook
daily_reward.get Webhook 用于确定玩家从每日奖励方案中获得哪些商品。当方案配置为由 Webhook 驱动时,Aghanim 会调用您的服务器,询问每天(以及额外奖励)应发放哪些商品,并根据您的响应实时生成玩家看到的奖励。
该 Webhook 适用于两类方案:
- 选择了 Webhook 的基础、排期和季节性方案。您的响应决定商品,周期由 Aghanim 运行。
- 自定义方案。您的响应还决定每个奖励何时开放、新周期何时开始。有关它们在 Game Hub 上的呈现方式,请参阅每日奖励。
此 Webhook 在以下情况下触发:
- 玩家在 Game Hub 中打开每日奖励组件时。
- 玩家领取每日奖励时。
如果您的服务器未响应、返回非 2xx 状态、超时或返回无效的响应体,Aghanim 会回退到方案的静态奖励。但为方案选择 Webhook 会清除这些奖励,因此实际上方案不会显示任何奖励,领取也会失败。自定义方案则完全没有静态奖励。请参阅自定义方案中的错误。
要求
如需接入 Aghanim 的 daily_reward.get Webhook,请按照以下要求配置您的 Webhook 服务器:
- HTTPS 端点,可接收 POST Webhook 请求。
- 监听由 Aghanim 生成并 签名 的事件。
- 使用
2xx状态码响应,并在 JSON 响应体中描述奖励商品。 - 尽快响应。响应过慢会降低 Hub 的体验,超时则会导致方案没有奖励。
配置步骤
- 为
daily_reward.getWebhook 处理开发一个函数。 - 部署您的端点使其可访问。
- 进入您的 Aghanim 账户后,依次导航至 游戏 → Webhooks → Add webhook,然后选择
daily_reward.get事件类型来注册您的端点。 - 在每日奖励方案设置中选择该 Webhook,方案即通过它获取商品。自定义方案必须设置 Webhook。
- 在您的 Game Hub 页面上放置每日奖励组件,以便玩家打开它并触发 Webhook。
或者,您也可以使用 Create Webhook API 方法在 Aghanim 中注册您的端点。
触发器值
| 值 | 描述 |
|---|---|
hub.interact | 当玩家在 Game Hub 中打开每日奖励组件时。 |
hub.daily_reward_claim | 当玩家领取每日奖励时,用于确定要发放的商品。对于自定义方案,这是领取前的预检查。请参阅自定义方案中的领取。 |
test | 在 Dashboard 中使用 "Send test event" 时。 |
有关 daily_reward.get 与其他事件类型的关系,请参阅完整的事件与触发器对照表。
Request Schema
下面是一个 daily_reward.get Webhook 请求示例:
- HTTP
- cURL
POST /your/webhook/uri HTTP/1.1
Content-Type: application/json
Host: your-webhook-endpoint.com
User-Agent: Aghanim/0.1.0
X-Aghanim-Signature: 2e45ed4dede5e09506717490655d2f78e96d4261040ef48cc623a780bda38812
X-Aghanim-Signature-Timestamp: 1725548450
{
"event_type": "daily_reward.get",
"event_data": {
"player_id": "2D2R-OP3C",
"id": "dlrwd_eAeXgQGcaie",
"key": "season-1",
"is_anonymous": false
},
"event_time": 1725548450,
"event_id": "whevt_eCacGbJVbvToOgzjXUgOCitkQE",
"idempotency_key": null,
"request_id": "d1593e9c-c291-4004-8846-6679c2e5810b",
"sandbox": false,
"trigger": "hub.interact",
"transaction_id": "whtx_eCacGbJVbvT",
"context": null,
"game_id": "gm_exTAyxPsVwh"
}
curl "https://your-webhook-endpoint.com/your/webhook/uri" \
-X POST \
-H "Content-Type: application/json" \
-H "User-Agent: Aghanim/0.1.0" \
-H "X-Aghanim-Signature: 2e45ed4dede5e09506717490655d2f78e96d4261040ef48cc623a780bda38812" \
-H "X-Aghanim-Signature-Timestamp: 1725548450" \
-d '{
"event_type": "daily_reward.get",
"event_data": {
"player_id": "2D2R-OP3C",
"id": "dlrwd_eAeXgQGcaie",
"key": "season-1",
"is_anonymous": false
},
"event_time": 1725548450,
"event_id": "whevt_eCacGbJVbvToOgzjXUgOCitkQE",
"idempotency_key": null,
"request_id": "d1593e9c-c291-4004-8846-6679c2e5810b",
"sandbox": false,
"trigger": "hub.interact",
"transaction_id": "whtx_eCacGbJVbvT",
"context": null,
"game_id": "gm_exTAyxPsVwh"
}'
事件 Schema
| 键名 | 类型 | 描述 |
|---|---|---|
event_id | string | 阿哈利姆生成的唯一事件标识符。 |
game_id | string | 您的游戏在阿哈利姆中的唯一标识符。 |
event_type | string | 事件的类型, daily_reward.get 在此情境下。 |
event_time | number | The time the event was sent, in Unix epoch time. May differ across duplicate deliveries of the same event. |
event_data | EventData | 包含事件特定数据的字段,其中可能包含用于继承对象的各种键值。 |
idempotency_key | string|null | 即使 出现重试情况,也能确保 Webhook 操作只执行一次。 可以是 null 具体取决于事件类型。 |
request_id | string|null | 如果事件是通过 API 请求触发的,此字段将包含对应的请求 ID。 |
sandbox | boolean | 标识事件是否来自沙盒测试环境的指示器。 |
trigger | string|null | 触发该事件发送的触发器。 |
transaction_id | string | 阿哈利姆生成的交易标识符。在同一交易过程中触发的多个事件可能共享相同的交易 ID。 |
context | EventContext|null | 事件的相关上下文信息。 |
EventContext Schema
| 键名 | 类型 | 描述 |
|---|---|---|
order | OrderContext|null | 与事件相关的 订单信息(如果适用)。 |
player | PlayerContext|null | (可选)玩家信息。如需启用,请在webhook设置中选择“添加玩家上下文”。 |
EventData Schema
| 键名 | 类型 | 描述 |
|---|---|---|
player_id | string | 用于玩家身份验证的唯一 玩家 ID。 |
id | string | 由 Aghanim 生成的唯一每日奖励方案 ID。 |
key | string|null | 游戏为每日奖励方案定义的键。 |
is_anonymous | boolean | 指示当前用户是否未通过身份验证(匿名)。 |
progress | DailyRewardProgress | 玩家在当前周期中的进度。仅针对自定义方案和已通过身份验证的玩家发送。 |
DailyRewardProgress Schema
| 键名 | 类型 | 描述 |
|---|---|---|
cycle_number | number | 当前周期的编号,由 Aghanim 分配。从 1 开始。 |
claims | DailyRewardClaim[] | 玩家在当前周期中已领取的奖励日。在该周期首次领取之前为空。 |
DailyRewardClaim Schema
| 键名 | 类型 | 描述 |
|---|---|---|
day_number | number | 已领取的奖励日。 |
claimed_at | number | 领取该奖励日的时间,以 Unix 时间戳(秒)表示。 |
以下是自定义方案的 event_data 示例,其中玩家已领取第三个周期的第 1 天和第 2 天:
{
"id": "dlrwd_eAeXgQGcaie",
"key": "daily",
"player_id": "2D2R-OP3C",
"is_anonymous": false,
"progress": {
"cycle_number": 3,
"claims": [
{ "day_number": 1, "claimed_at": 1791100000 },
{ "day_number": 2, "claimed_at": 1791200000 }
]
}
}
对于尚未领取任何奖励的玩家,progress 为 { "cycle_number": 1, "claims": [] }。
匿名玩家没有进度:请求携带 is_anonymous: true,且不包含 progress 块。对于自定义方案,请像对待新玩家一样响应:将 cycle_number 设为 1,并返回带有 available_at 的当前奖励日(通常是第 1 天)以及最终奖励日。匿名玩家无法领取奖励。Hub 会向他们显示最终奖励,其他奖励位保持未开放;如果当前奖励日尚未开放,则显示它的倒计时。
Response Schema
返回 200 OK 并附带 JSON 数据。其结构取决于方案类型:
基础、排期和季节性方案的响应
响应会完全替换方案的奖励:请列出周期中的每一天,如有额外奖励也一并列出。例如,如果您为一个 7 天方案返回第 1–3 天,该方案就只有 3 天。如果省略 extra_reward_items,该方案就没有额外奖励。
| 键名 | 类型 | 描述 | 是否必需 |
|---|---|---|---|
days | DailyRewardDay[] | 每个奖励日发放的商品。至少包含一天,按升序排列,并从 1 开始连续编号,中间不能有空缺。 | 是 |
extra_reward_items | DailyRewardItem[] | 额外奖励发放的商品。 | 否 |
如果某一天的所有 SKU 都与您的商品目录不匹配,该天会从方案中移除。如果这类方案收到了带有 cycle_number 的响应(该字段用于自定义方案),Aghanim 会忽略该响应并将本次调用视为失败,因此方案不会显示任何奖励。
DailyRewardDay Schema
| 键名 | 类型 | 描述 | 是否必需 |
|---|---|---|---|
day_number | number | 商品所属的奖励日(≥ 1)。 | 是 |
items | DailyRewardItem[] | 该天发放的商品(1–10 个)。 | 是 |
响应示例
{
"days": [
{
"day_number": 1,
"items": [
{ "sku": "sword-001", "quantity": 1 },
{ "sku": "coins-pack", "quantity": 500 }
]
},
{
"day_number": 2,
"items": [
{ "sku": "shield-001" }
]
}
],
"extra_reward_items": [
{ "sku": "gem-pack", "quantity": 10 }
]
}
自定义方案的响应
返回玩家所在周期的当前状态:周期编号、当前奖励日和最终奖励日。Aghanim 通过 cycle_number 识别自定义响应,因此不含该字段的自定义响应无效。
| 键名 | 类型 | 描述 | 是否必需 |
|---|---|---|---|
cycle_number | number | 返回 progress.cycle_number 以继续当前周期,或返回 progress.cycle_number + 1 以开始新周期。请参阅自定义方案中的周期。 | 是 |
days | CustomDailyRewardDay[] | 一个或两个奖励日,按 day_number 升序排列且不得重复:先是当前奖励日,然后是最终奖励日。如果当前奖励日就是最终奖励日,只需发送这一天。 | 是 |
不允许使用 extra_reward_items:自定义方案没有额外奖励。
CustomDailyRewardDay Schema
| 键名 | 类型 | 描述 | 是否必需 |
|---|---|---|---|
day_number | number | 奖励在周期中的位置(≥ 1)。它与日历无关:由您的服务器决定每个奖励何时开放。最终奖励日的编号即周期长度,最大为 365 天。 | 是 |
available_at | number | 该天的开放时间,以 Unix 时间戳(秒)表示。过了这个时间点,该天即开放,玩家可以领取。可以是过去的时间。对于最终奖励日,它只用于驱动最终奖励位上的倒计时。 | 当前奖励日必需 |
items | DailyRewardItem[] | 该天发放的商品(1–10 个)。 | 是 |
违反上述任一规则的响应都无法通过校验,并按错误处理。请参阅自定义方案中的错误。
响应示例
此示例中的请求于 1791300000 到达,此时第 1 天和第 2 天已领取。第 3 天在一小时后开放,最终奖励日第 7 天在其后四天开放。
{
"cycle_number": 3,
"days": [
{
"day_number": 3,
"available_at": 1791303600,
"items": [{ "sku": "coins", "quantity": 500 }]
},
{
"day_number": 7,
"available_at": 1791649200,
"items": [
{ "sku": "coins", "quantity": 5000 },
{ "sku": "boost" }
]
}
]
}
DailyRewardItem Schema
| 键名 | 类型 | 描述 | 是否必需 |
|---|---|---|---|
sku | string | 作为奖励发放的商品 SKU。必须与您商品目录中的 SKU 匹配。 | 是 |
quantity | number|null | 商品数量。省略时使用该商品的默认数量。 | 否 |
metadata | object|null | 商品的自定义键值对,用于支持您这边的额外逻辑。 | 否 |
与游戏在 Aghanim 中的商品目录不匹配的 SKU 会被静默忽略。
自定义方案中的周期
自定义方案的每个请求都携带 progress.cycle_number。返回相同的编号即继续当前周期,返回该编号加一即开始新周期。
玩家领取最终奖励日后,请立即返回下一个周期:cycle_number + 1,以及带有 available_at 的第 1 天。在该时间点之前,玩家会看到已完成的周期和倒计时。第 1 天开放后,Aghanim 开始新周期,后续请求会携带新的 cycle_number 和空的 claims。如需中途重置周期,也以同样的方式响应。
只有同时满足以下所有条件时,新周期才会开始:
- 响应中的
cycle_number比progress.cycle_number大 1。 - 玩家在当前周期中至少领取过一天。
- 新周期第 1 天的
available_at已过。
切换之后,请求会携带新的编号,因此再次返回该编号会继续当前周期。
7 天周期示例结合请求和响应完整演示了一个周期。
自定义方案中的领取
玩家领取某一天的奖励时,Aghanim 会以 hub.daily_reward_claim 触发器调用 Webhook。这是一次预检查:照常返回当前状态,不要在您这边记录这次领取。请求中不会说明玩家领取的是哪一天。
只有根据这次新的响应,该天是当前奖励日且其 available_at 已过,玩家才会获得奖励。随后 Aghanim 记录这次领取,并通过 item.add Webhook 发放商品,其中 context.daily_reward.day_number 为所领取的奖励日。这次领取 也会出现在后续请求的 progress.claims 中。
如需拒绝领取,请返回一个未来的 available_at,或返回另一个当前奖励日。
自定义方案中的错误
如果您的服务器返回错误、返回无效的响应体,或未在 10 秒内响应,领取就会失败,玩家什么也得不到。自定义方案不会回退到静态奖励。如果这种情况发生在玩家打开组件时,Hub 将无法显示奖励日。
需要帮助吗?请通过 integration@aghanim.com 联系我们的集成团队。
需要技术支持?
联系我们的集成技术团队: integration@aghanim.com