3d1e8969e6
- 新增 docs/integrations/(README + jiguang/sms/meituan/pangle/wxpay 各一篇): 记录各 SDK 集成的签名/验签/加解密/协议细节与踩坑(对齐 app/integrations 分层) - docs/api 接口文档变薄: 受影响接口头部加「集成实现」链接,把验签/RSA/CPS 签名 等重逻辑描述移到集成文档;ad-pangle-callback 验签段精简为指针 - docs/api/README 补架构说明(api 薄 / 重逻辑在 integrations) - 后端技术实现.md 目录树补全(福利/钱包/签到/省钱/发奖端点 + crud/integrations 现状), pangle/wxpay 标注移入 integrations - ad_reward_golive_checklist 路径同步 core→integrations Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2.8 KiB
2.8 KiB
GET /api/v1/ad/pangle-callback — 穿山甲 GroMore 激励视频发奖回调(S2S)
所属:Ad 组(前缀
/api/v1/ad) | 鉴权:无 JWT,靠验签(穿山甲 GroMore 服务器调用) | 限流:同 IP ≤300 次/分 | ← 返回 API 索引⚠️ 我们客户端用
useMediation(true)(GroMore 融合),回调走 GroMore 广告位层级(规范见 supportcenter/26240),不是联盟代码位层级(5416)。两者密钥、响应格式都不同,别混。后台配置入口:GroMore 聚合管理 → 搜广告位ID → 编辑 → 勾选「服务端激励回调」(广告位层级配了就别再在代码位层级重复配,会冲突)。集成实现:见 integrations/pangle(验签算法、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。
出参
响应 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。