结论先拍:京东开放体系里联盟Key(jd.union.open.*)和商家JOS Key(jingdong.* / jd.order.*)是两套完全独立的账。联盟Key备案后调用本身免费、赚钱靠CPS抽佣5%~20%;商家JOS Key有日免额(企业应用通常30万~100万次/天),超量云内≈¥0.02~0.10/百次、云外×3~×10。 惨案的根因不是"联盟收费",而是把本该用商家Key走免额的商品/订单同步,错配成联盟Key轮询,发现联盟不限频就狂拉,结果——联盟虽然API费¥0,但团队误以为"京东API都免费"顺手把云外商家Key也开着,或者更常见的是:用联盟Key拿不到真实库存,为了补数据又开商家Key云外轮询,两套Key一起爆。我们复盘的那家店实际账单:联盟Key本身¥0,但同进程里商家JOS Key云外跑订单列表翻页 110万次/天 × 30天 × ¥0.15/百次 ≈ ¥4950,加上云内超免额 60万次/天 × ¥0.05/百次 ≈ ¥2700,电子面单按单另算,合计月烧¥8000+。
一、两套Key的边界(2026现行口径)
|
维度 |
京东联盟 Key( |
京东商家 JOS Key( |
|---|---|---|
|
授权对象 |
联盟实名(无店铺也可) |
企业认证 + 卖家OAuth token |
|
代表接口 |
|
|
|
库存字段 |
只返"有货/无货/预售",无真实stockNum |
返真实可售库存、区域仓存、锁定库存 |
|
订单权限 |
无(看不到自己店铺订单) |
查自己店铺订单/发货回写 |
|
接口费 |
¥0(备案后),成交后CPS抽佣5%~20% |
免额内¥0,超量云内¥0.02~0.10/百次,云外×3~×10 |
|
电子面单 |
无 |
按单计费(几分/单),取消未揽收不扣 |
|
适用场景 |
选品/CPS导购/比价/跨平台铺货 |
ERP进销存/防超卖/WMS/店铺一体化 |
致命误判:"京东API免费"=只看联盟;"京东API贵"=把商家按量接口和联盟混算。两套Key共用一个
sign函数、同一个api.jd.com/routerjson入口,代码里只换app_key不换method前缀,CI跑通了就上线,三个月后财务甩来¥8000账单。
二、惨案还原:110万次/天的错误链路
根因三条:
Key类型不隔离——配置中心
jd_app_key一个字段,联盟/商家混着填,没有key_type强制校验。method前缀不守卫——
union.open.*出现却用商家token、或jingdong.*出现却走联盟Key,网关不拦。云外×10无告警——前篇
CloudResidencyGuard只拦敏感禁外,没拦"商家基础接口云外×10烧钱"。
三、Python:JdKeyTypeGuard(联盟/商家Key错配拦截器)
跑出来关键三行:
(云外110万/天按全量算¥4950,按超免额算¥2700,正是惨案账单区间)
四、避免月烧¥8000的四条铁律
配置中心Key必须带
key_type字段,不允许只填app_key——JdKeyTypeGuard.validate在ApiGateway.call()入口强校验,CI单测里放一条"联盟Key+jos method"必崩。联盟Key只许调
jd.union.open.*,且禁止用于ERP库存/订单——代码层把unionKey绑死到UnionClient,JosClient永远拿不到union Key。商家Key强制云内:京东虽不像淘宝/抖店明文"禁外",但云外×3~×10是隐式烧钱锁,把
in_cloud=False的商家JOS调用在ObservabilityMiddleware里标红,日预估>¥30即告警。库存别用联盟补:联盟只返有货/无货,防超卖必须
jingdong.stock.get(商家Key云内),接受"QPS 2~50"的限制,用推送替轮询,别为补数据开云外狂拉。
五、和前几篇的衔接
把
JdKeyTypeGuard嵌进前篇UnifiedApiClient.call()的京东分支:先validate(JdCall(...))再发请求;estimate_jos_monthly()喂给ApiCostAttributor的京东行,把"联盟Key调用"单独列一行(API费¥0、CPS佣金额外列);Double11CommandCenter里京东配额守卫的check()增加key_type=="union"直接放行不占商家免额。一套Key守卫 + 云内着色 + 免额水位,把"京东API免费"的错觉在网关层掐死——联盟归联盟、商家归商家、云内归云内。
要不要我把 jd_key_type_guard.py 和前篇 unified_mock_server.py + api_cost_attributor.py 合成 commerce-mesh/jd/ 子模块,增加"联盟Key Mock返回有货/无货、商家Key Mock返回真实stockNum"的双轨Fixture,直接进你CI?