# GET /api/v1/ad/pangle-callback — 穿山甲 GroMore 激励视频发奖回调(S2S) > 所属:Ad 组(前缀 `/api/v1/ad`) | 鉴权:**无 JWT,靠验签**(穿山甲 GroMore 服务器调用) | 限流:同 IP ≤300 次/分 | [← 返回 API 索引](./README.md) > > ⚠️ 我们客户端用 `useMediation(true)`(GroMore 融合),回调走 **GroMore 广告位层级**(规范见 supportcenter/26240),**不是**联盟代码位层级(5416)。两者密钥、响应格式都不同,别混。后台配置入口:**GroMore 聚合管理 → 搜广告位ID → 编辑 → 勾选「服务端激励回调」**(广告位层级配了就别再在代码位层级重复配,会冲突)。 > > 集成实现:见 [integrations/pangle](../integrations/pangle.md)(验签算法、m-key 来源、设计动机)。 ## 入参(query,由 GroMore 拼装) GroMore 以 GET 回调,关键参数: | 字段 | 类型 | 说明 | |---|---|---| | `user_id` | string | 客户端 `setUserID` 传入的用户标识(须为数字 = 本系统 user.id) | | `trans_id` | string | 交易号(**幂等键** + **唯一参与签名的字段**) | | `reward_name` | string | 奖励名(广告位配置,入库备注) | | `reward_amount` | int | 奖励数量(广告位配置)→ **本次发放金币**。缺/坏/≤0 回退 `AD_REWARD_COIN`,超 `MAX_AD_REWARD_COIN` 夹紧 | | `extra` | string | 客户端透传的 customData(可空,入库备注) | | `mediation_rit` | string | 代码位 ID(GroMore 带,目前仅入 raw 备查) | | `prime_rit` | string | 广告位 ID(同上) | | `adn_name` | string | 实际出广告的 ADN 名(同上,可用于收益分析) | | `ecpm` | string | 本次广告 eCPM(同上,可用于收益分析) | | `sign` | string | 签名,见下 | **验签**:`sign = SHA256("{m-key}:{trans_id}")` 十六进制(只签 `trans_id`,其余参数不参与)。算法细节、m-key 来源、为什么这样设计 → 见集成文档 [integrations/pangle](../integrations/pangle.md)。 ## 出参 响应 `200`,**响应体必须是 `{"is_verify": bool, "reason": int}`**(GroMore 规范)。 | 字段 | 类型 | 说明 | |---|---|---| | `is_verify` | bool | `true`=校验通过、发放奖励(发奖成功 或 当日达上限,均算已处理、不重试) | | `reason` | int | `is_verify=false` 时的错误码,透传客户端 SDK:`1`=参数缺/坏,`2`=user 不存在;成功为 `0` | ## 错误码 - `403` 验签失败(`bad sign`,留给真请求重试) - `503` 回调未配置(`pangle_callback_configured=false`) ## 说明 **发奖唯一可信入口**:验签 → 取 `user_id` → 按 `reward_amount` 解析金币 → 幂等发金币(按 `trans_id` 去重 + 每日上限)。客户端不参与发奖,被破解也刷不到钱。验签过但参数缺/坏或 user 不存在 → 不发(`is_verify=false` + `reason`);granted / capped → `is_verify=true` + `reason=0`。