- CpsActivityUpdate schema + repo update_activity(部分更新,非 None 覆盖) - router 按「合并后最终值」校验平台必填项(同新建口径),写审计 cps.activity.update - 可改名/平台/对应字段/落地页图/备注/状态 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.0 KiB
美团联盟 CPS 开放接口(meituan)
文件:
app/integrations/meituan.py| 关联接口:meituan-coupons · meituan-feed · meituan-referral-link | ← 集成索引
作用
调美团联盟 CPS 开放接口:查券(列表/搜索)+ 换推广链。
函数 / 异常
| 函数 | 说明 |
|---|---|
query_coupon(...) |
券查询/搜索 → /cps_open/common/api/v1/query_coupon |
get_referral_link(...) |
换推广链 → /cps_open/common/api/v1/get_referral_link |
异常 MeituanCpsError |
HTTP 错误 / 业务 code != 0,api 层翻成 502 |
签名机制(关键)
类阿里云网关 S-Ca 头,但 stringToSign 只有 4 段:
METHOD\n + Content-MD5\n + Headers(按 key 升序 "k:v\n") + Url
没有 Accept / Content-Type / Date 行(加了就签名失败)。签名 = HMAC-SHA256(stringToSign, AppSecret) 的 base64。参与签名的头:S-Ca-Timestamp,S-Ca-App(在 S-Ca-Signature-Headers 里声明)。
入参换算 / 坑
- 经纬度 × 1_000_000 取整传给美团。
- 榜单字段是
listTopiId(美团接口的拼写,少个c,别"纠正"成listTopicId)。 - 有
searchText时走搜索、sort_field默认 6(离我最近);否则按listTopiId出榜单。 - 换链
sid不传则用MT_CPS_DEFAULT_SID;linkTypeList默认[1,3]。
配置
| 配置项 | 说明 |
|---|---|
MT_CPS_APP_KEY / MT_CPS_APP_SECRET |
CPS 网关 AppKey / AppSecret |
MT_CPS_HOST |
网关 host |
MT_CPS_DEFAULT_SID |
默认推广位 sid(渠道) |
MT_CPS_TIMEOUT_SEC |
请求超时 |
未配凭证时降级(2026-05-28 引入)
api 层 3 个端点都在入口处 if not settings.mt_cps_configured: 早返空(coupons 返空数组、feed 返空 items、referral-link 返 link="" + link_map={}),不报 502。
为什么这么设计:新开发机没填 MT_CPS_APP_KEY 时,首页一进就拉 /feed → 502 → 整屏错误,首屏体验差。降级后端业务可以先跑起来,等真要测美团 CPS 再补 key。
坏副作用:feed 本来就有"已配凭证但美团调用失败时 _fetch_topic 静默吞错"的可观测性盲区,加上"未配凭证时也返空",两种空结果路径在响应上无法区分。排障路径:
/health接口暴露mt_cps_configured: bool——先看配置- 改调
/coupons让"已配凭证但调用失败"以 502 + 错误文案暴露细节
feed 调用静默吞错
api/v1/meituan.py 的 _fetch_topic 对 MeituanCpsError except 返回 [] 且不打日志。导致美团接口失败时 feed 返 200 + 空 items 无声失败。建议补一条 logger.error 至少留痕,真实排障还得改调 coupons(它在配置就绪时以 502 暴露)。
备注
- 美团接口当前无鉴权,且换链的
sid允许客户端传值覆盖默认渠道——见对应 api 文档「备注」 - 未配凭证降级、feed 静默吞错都在 待办与技术债.md 已记账