f7d86011c1
- 新增 GET /admin/api/ad-revenue-report:展示条数/收益 + 复用金币审计逐条复算做发奖对账 - ad_ecpm/ad_reward/ad_feed_reward 各加 app_env + our_code_id 两列(alembic 迁移) - ecpm-report / feed-reward 接收并落库 app_env/our_code_id;激励发奖按 ad_session_id 回填 - ad_audit 抽出 audit_rows,报表与逐条审计复用同一复算口径 - 组级 matched 改「组内逐条全一致」,避免应发和==实发和的互相抵消掩盖错误 - list_feedbacks 改 offset 分页并返回 total(配合 admin 页码分页) - 反馈正文上限 _CONTENT_MAX 2000→200 - 文档:新增 admin-ad-revenue-report,更新 ecpm/feed-reward/feedback 及对应 db docs Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: OuYingJun1024 <1034284404@qq.com> Reviewed-on: #54 Co-authored-by: ouzhou <ouzhou@wonderable.ai> Co-committed-by: ouzhou <ouzhou@wonderable.ai>
2.2 KiB
2.2 KiB
POST /api/v1/ad/reward-noshow — 激励视频提前关闭/未发奖留痕
激励视频展示了但用户提前关闭/跳过、未触发 S2S 发奖时,客户端 best-effort 上报一条留痕记录, 让运营后台「广告数据」能呈现「有展示、没发金币」的原因。不发金币。
鉴权
需要 Bearer token。user_id 由 JWT 取,不在 body。
请求体
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
ad_session_id |
string | 是 | 本次展示会话 id(与 eCPM 上报、S2S extra.ad_session_id 一致),8-64 字符 |
watched_seconds |
int | 否 | 关闭前已观看秒数(仅留痕参考,不入库)。默认 0 |
ecpm |
string|null | 否 | 本次展示 eCPM(穿山甲 getEcpm 原值,分/千次展示) |
adn |
string|null | 否 | 实际投放 ADN(聚合后实际填充子渠道) |
slot_id |
string|null | 否 | 实际展示代码位(底层 mediation rit) |
app_env |
string|null | 否 | 我们的应用环境:prod(傻瓜比价正式) / test(测试应用) |
our_code_id |
string|null | 否 | 我们后台配置的代码位 ID(104xxx,非底层 rit) |
响应
| 字段 | 类型 | 说明 |
|---|---|---|
ok |
bool | 是否处理成功(落库或幂等命中) |
status |
string | closed_early(已留痕) / granted(该次其实已发奖,跳过未写) |
说明
- 在
onAdClose时若本次未触发发奖(无onRewardVerify/onRewardArrived)调用。 - 幂等:写入
ad_reward_record,trans_id = noreward:{ad_session_id}(每次展示唯一),重试不重复。 - 防与正常发奖重复:若同一
ad_session_id已有status='granted'记录(S2S 已发,说明用户其实看完了), 则跳过不写,返回status='granted'。 - best-effort:客户端 fire-and-forget,失败只 log,不影响主流程。
- 信息流的「用户中途关闭」走 ad-feed-reward 的
aborted=true(记closed_early),不走本接口。
数据写入
ad_reward_record新增一行(coin=0、status='closed_early'、reward_scene='reward_video')。- 不写
coin_account/coin_transaction(不发币)。