Files
shaguabijia-app-server/docs/api/ad-pangle-callback.md
T
OuYingJun1024 3d1e8969e6 docs: 新建 docs/integrations 集成层文档 + api 文档变薄
- 新增 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>
2026-05-27 20:45:12 +08:00

2.8 KiB
Raw Blame History

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 代码位 IDGroMore 带,目前仅入 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