diff --git a/app/admin/schemas/ad_config.py b/app/admin/schemas/ad_config.py index 3f5c033..629eb59 100644 --- a/app/admin/schemas/ad_config.py +++ b/app/admin/schemas/ad_config.py @@ -15,6 +15,7 @@ class AdConfigOut(BaseModel): reward_enabled: bool compare_ad_enabled: bool coupon_ad_enabled: bool + withdrawal_ad_enabled: bool class AdConfigUpdate(BaseModel): @@ -28,3 +29,4 @@ class AdConfigUpdate(BaseModel): reward_enabled: bool | None = None compare_ad_enabled: bool | None = None coupon_ad_enabled: bool | None = None + withdrawal_ad_enabled: bool | None = None diff --git a/app/api/v1/ad.py b/app/api/v1/ad.py index 7f203a8..6f8ab9b 100644 --- a/app/api/v1/ad.py +++ b/app/api/v1/ad.py @@ -53,6 +53,9 @@ REASON_UNKNOWN_USER = 2 # user_id 不存在(可能伪造) REWARD_SCENE_REWARD_VIDEO = "reward_video" REWARD_SCENE_SIGNIN_BOOST = "signin_boost" +# 提现看视频:看完才能提现的「硬门槛」广告,**不发金币**,只记一条幂等记录(收益由 eCPM 上报口径 +# ad_type="withdrawal_video" 单独统计)。故意不放进 SUPPORTED_REWARD_SCENES——它不走发币分支。 +REWARD_SCENE_WITHDRAWAL_AD = "withdrawal_ad" SUPPORTED_REWARD_SCENES = {REWARD_SCENE_REWARD_VIDEO, REWARD_SCENE_SIGNIN_BOOST} @@ -126,6 +129,19 @@ def pangle_callback(request: Request, db: DbSession) -> PangleCallbackOut: return PangleCallbackOut(is_verify=True, reason=REASON_OK) try: + if reward_scene == REWARD_SCENE_WITHDRAWAL_AD: + # 提现看视频:已知合法场景,只记一条幂等记录、**不动钱包**(发不发币由 reward_scene 决定)。 + # is_verify=true 让穿山甲不重试(区别于 unknown_scene 的 false)。 + crud_ad.record_external_reward( + db, user_id, trans_id, coin=0, reward_scene=REWARD_SCENE_WITHDRAWAL_AD, + ad_session_id=ad_session_id, ecpm=ecpm, + reward_name=params.get("reward_name"), raw=raw[:1024], + status="withdrawal_ad", + ) + logger.info( + "pangle callback withdrawal_ad user_id=%d trans_id=%s", user_id, trans_id, + ) + return PangleCallbackOut(is_verify=True, reason=REASON_OK) if reward_scene not in SUPPORTED_REWARD_SCENES: rec = crud_ad.record_external_reward( db, user_id, trans_id, coin=0, reward_scene=reward_scene[:32], diff --git a/app/api/v1/platform.py b/app/api/v1/platform.py index 31908bd..87b1ff4 100644 --- a/app/api/v1/platform.py +++ b/app/api/v1/platform.py @@ -68,6 +68,7 @@ def ad_config(db: DbSession) -> AdConfigPublicOut: reward_enabled=c["reward_enabled"], compare_ad_enabled=c["compare_ad_enabled"], coupon_ad_enabled=c["coupon_ad_enabled"], + withdrawal_ad_enabled=c["withdrawal_ad_enabled"], ) diff --git a/app/repositories/app_config.py b/app/repositories/app_config.py index 79125ef..e1a3b42 100644 --- a/app/repositories/app_config.py +++ b/app/repositories/app_config.py @@ -109,6 +109,7 @@ _AD_CONFIG_DEFAULTS: dict[str, Any] = { "reward_enabled": True, # 福利激励视频开关 "compare_ad_enabled": True, # 比价广告开关 "coupon_ad_enabled": True, # 领券广告开关 + "withdrawal_ad_enabled": True, # 提现激励视频开关(关=直接放行提现,不挡用户的钱) } diff --git a/app/schemas/platform.py b/app/schemas/platform.py index 4c97bd6..a9c5c48 100644 --- a/app/schemas/platform.py +++ b/app/schemas/platform.py @@ -43,6 +43,7 @@ class AdConfigPublicOut(BaseModel): reward_enabled: bool # 福利激励视频开关 compare_ad_enabled: bool # 比价广告开关 coupon_ad_enabled: bool # 领券广告开关 + withdrawal_ad_enabled: bool # 提现激励视频开关(关=客户端直接放行提现) class AppVersionOut(BaseModel):