<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>万邦api博客</title><link>https://alexob.com/</link><description>Good Luck To You!</description><item><title>《亚马逊 SP-API：落地方案、接口边界与业务踩坑 —— “年费 $1400 + 超量 $0.40/千次” 的真相与 2026 反转》（附 Python 源码）</title><link>https://alexob.com/?id=574</link><description>&lt;h1&gt;《亚马逊 SP-API：落地方案、接口边界与业务踩坑 —— “年费 &lt;span class=&quot;ybc-markdown-katex&quot; data-latex=&quot;1400 + 超量&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7278em;vertical-align:-0.0833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1400&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord cjk_fallback&quot;&gt;超量&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.40/千次” 的真相与 2026 反转》（附 Python 源码）&lt;/h1&gt;&lt;h2&gt;0. 先纠正一个时间线（很重要）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;你标题里的 &lt;strong&gt;“年费 &lt;span class=&quot;ybc-markdown-katex&quot; data-latex=&quot;1400 + GET 超量&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7278em;vertical-align:-0.0833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1400&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.13889em;&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;mord cjk_fallback&quot;&gt;超量&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.40/千次”&lt;/strong&gt; 是亚马逊 &lt;strong&gt;2025-11-03 公布、原定 2026-01-31 / 2026-04-30 生效&lt;/strong&gt; 的收费方案，但：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;2026-01：延期&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;2026-03：无限期推迟&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;2026-05-12：Amazon 正式邮件宣布 “will not move forward with the SP-API usage and annual fees at this time”&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;所以 2026-10-17 今天写这篇文章，正确姿态是：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;把 &lt;span class=&quot;ybc-markdown-katex&quot; data-latex=&quot;1400 /&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1400/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.40 当“成本模型教材”和“未来可能再来一次的防御设计”，但不要把生产架构建立在这个账单一定存在上。&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;Amazon 原话留了 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;at this time&lt;/code&gt;，以后换种形态收费完全可能。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;原方案回顾（仅作历史/压测口径）：&lt;/div&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;项目&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;数值&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;年费（第三方开发者）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;$1400 / 年&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;Basic 档包含 GET&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;250 万次 / 月&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;超量 GET&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;$0.40 / 1000 次&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;Pro / Plus&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;span class=&quot;ybc-markdown-katex&quot; data-latex=&quot;1000 /&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;span class=&quot;katex&quot; style=&quot;font-size: 19.36px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot; style=&quot;font-size: 19.36px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;span class=&quot;base&quot; style=&quot;font-size: 19.36px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height: 1em; vertical-align: -0.25em; font-size: 19.36px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot; style=&quot;font-size: 19.36px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;1000/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;10000 月费&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;PUT/POST/PATCH&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不按量计费，但受限流&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;自营私域 App（只给自己店铺用）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不收开发者费&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;一、SP-API 和前面几家根本不是一类东西&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;平台&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;模型&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;计费&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;1688 / 淘宝 / 京东 / 拼多多 / 抖店&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;国内开放平台，按调用/云内云外&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;预充值 / 塔内塔外 / 云外×10&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;亚马逊 SP-API&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;LWA OAuth + Role/App 授权 + REST + 通知/报告分离&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;原拟收费，现免费，但限流极狠&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;SP-API 核心组成：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auth&lt;/strong&gt;：Login with Amazon（LWA）→ access_token（约 1h）+ refresh_token（长期）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Selling Partner API&lt;/strong&gt;：orders / catalog / listings / inventory / feeds / reports / notifications / finances / shipments&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;EventBridge / SQS 通知&lt;/strong&gt;：ORDER_CHANGE、REPORT_PROCESSING_FINISHED 等&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reports API&lt;/strong&gt;：建报告 → 轮询状态 → 下载文档（大批量正道）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic Usage Plan（DUP）&lt;/strong&gt;：你看到的文档限流是最低档，Amazon 会根据历史自动调&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;二、订单接口边界（最容易被国内团队写错）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;角色&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;限流（默认）&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;getOrders&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;按 CreatedAfter / LastUpdatedAfter 拉订单列表&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;0.0167 rps = 1/min，burst 20&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;getOrder&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;单订单头信息&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;0.5 rps / burst 30&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;getOrderItems&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单行项目（价格/数量/ASIN/买家配送）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;0.5 rps / burst 30&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;Orders Report&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;批量订单 CSV&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;建报告 1/min，下载另算&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;ORDER_CHANGE 通知&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单变更事件&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不耗 getOrders 额度&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;⚠️ 国内团队最常犯的错：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;每&amp;nbsp;5&amp;nbsp;秒调一次&amp;nbsp;getOrders&amp;nbsp;查新单&amp;nbsp;→&amp;nbsp;10&amp;nbsp;秒内把&amp;nbsp;burst&amp;nbsp;打光&amp;nbsp;→&amp;nbsp;后面全&amp;nbsp;429&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;Amazon 官方结论：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;日单 &amp;lt; 2 万：getOrders + getOrderItems 可行&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;大单量：ORDER_CHANGE 通知 + Orders Report&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;还有一条隐藏规则：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;LastUpdatedAfter&lt;/code&gt; 查到的时间是 &lt;strong&gt;“当前时间 - 2 分钟”&lt;/strong&gt;，新单有 2 分钟延迟。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;三、生产架构：通知优先，Reports 批量，REST 兜底&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;EventBridge&amp;nbsp;/&amp;nbsp;SQS
&amp;nbsp;&amp;nbsp;└─&amp;nbsp;ORDER_CHANGE&amp;nbsp;(orderId,&amp;nbsp;changeType)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;入队&amp;nbsp;(amazonOrderId)

Worker:
&amp;nbsp;&amp;nbsp;getOrder(orderId)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;订单头
&amp;nbsp;&amp;nbsp;getOrderItems(orderId)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;订单行
&amp;nbsp;&amp;nbsp;→&amp;nbsp;写&amp;nbsp;order&amp;nbsp;快照

每&amp;nbsp;30~60&amp;nbsp;min：
&amp;nbsp;&amp;nbsp;Orders&amp;nbsp;Report&amp;nbsp;(GET_FLAT_FILE_ORDER_REPORT)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;→&amp;nbsp;批量对账，补漏

财务/库存：
&amp;nbsp;&amp;nbsp;GET_FBA_MYI_UNSUPPRESSED_INVENTORY_DATA
&amp;nbsp;&amp;nbsp;GET_LEDGER_SUMMARY
&amp;nbsp;&amp;nbsp;→&amp;nbsp;Reports&amp;nbsp;API，不逐&amp;nbsp;SKU&amp;nbsp;调&amp;nbsp;getInventorySummaries&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则（和淘宝 DSS / 京东 JMQ / 抖店推送同构）：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;em&gt;&lt;em&gt;通知做触发器，Report 做批量真相，getOrder&lt;/em&gt; 做单条补全，轮询 getOrders 只做兜底。&lt;/em&gt;*&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;四、Python：LWA 令牌管理（refresh 不互踢）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;spapi/auth.py
import&amp;nbsp;time
import&amp;nbsp;requests


class&amp;nbsp;LwaTokenProvider:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client_id,&amp;nbsp;client_secret,&amp;nbsp;refresh_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;redis=None,&amp;nbsp;ttl_margin=300):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client_id&amp;nbsp;=&amp;nbsp;client_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client_secret&amp;nbsp;=&amp;nbsp;client_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.refresh_token&amp;nbsp;=&amp;nbsp;refresh_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis&amp;nbsp;=&amp;nbsp;redis
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.margin&amp;nbsp;=&amp;nbsp;ttl_margin
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._cache&amp;nbsp;=&amp;nbsp;{}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_redis_key(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;f&amp;quot;spapi:lwa:access:{self.client_id}&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_access_token(self)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.redis:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tok&amp;nbsp;=&amp;nbsp;self.redis.get(self._redis_key())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;tok:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;tok

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(&amp;quot;https://api.amazon.com/auth/o2/token&amp;quot;,&amp;nbsp;data={
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;grant_type&amp;quot;:&amp;nbsp;&amp;quot;refresh_token&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;client_id&amp;quot;:&amp;nbsp;self.client_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;client_secret&amp;quot;:&amp;nbsp;self.client_secret,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;refresh_token&amp;quot;:&amp;nbsp;self.refresh_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;timeout=5)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token&amp;nbsp;=&amp;nbsp;data[&amp;quot;access_token&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;expires_in&amp;nbsp;=&amp;nbsp;int(data.get(&amp;quot;expires_in&amp;quot;,&amp;nbsp;3600))

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.redis:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.redis.set(self._redis_key(),&amp;nbsp;token,&amp;nbsp;ex=expires_in&amp;nbsp;-&amp;nbsp;self.margin)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;token&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;多实例用 Redis 锁防并发刷新：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;refresh_with_lock(provider,&amp;nbsp;r):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lock&amp;nbsp;=&amp;nbsp;r.lock(&amp;quot;spapi:lwa:refresh:lock&amp;quot;,&amp;nbsp;timeout=10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;lock.acquire(blocking=False):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.delete(provider._redis_key())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;provider.get_access_token()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finally:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lock.release()&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;五、Python：限流感知的 SP-API 客户端&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;spapi/client.py
import&amp;nbsp;time
import&amp;nbsp;requests


class&amp;nbsp;SpApiThrottleError(Exception):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;retry_after):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super().__init__(&amp;quot;throttled&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.retry_after&amp;nbsp;=&amp;nbsp;retry_after


class&amp;nbsp;SpApiClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;token_provider,&amp;nbsp;region_endpoint,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rate_per_sec=0.0167,&amp;nbsp;burst=20):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tp&amp;nbsp;=&amp;nbsp;token_provider
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.base&amp;nbsp;=&amp;nbsp;region_endpoint&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;NA/EU/FE&amp;nbsp;不同
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.rate&amp;nbsp;=&amp;nbsp;rate_per_sec
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.burst&amp;nbsp;=&amp;nbsp;burst
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._tokens&amp;nbsp;=&amp;nbsp;burst
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._last&amp;nbsp;=&amp;nbsp;time.monotonic()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_acquire(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now&amp;nbsp;=&amp;nbsp;time.monotonic()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._tokens&amp;nbsp;=&amp;nbsp;min(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.burst,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._tokens&amp;nbsp;+&amp;nbsp;(now&amp;nbsp;-&amp;nbsp;self._last)&amp;nbsp;*&amp;nbsp;self.rate
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._last&amp;nbsp;=&amp;nbsp;now
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self._tokens&amp;nbsp;&amp;gt;=&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._tokens&amp;nbsp;-=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.2)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_request(self,&amp;nbsp;method,&amp;nbsp;path,&amp;nbsp;params=None,&amp;nbsp;retries=5):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(retries):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._acquire()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token&amp;nbsp;=&amp;nbsp;self.tp.get_access_token()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;x-amz-access-token&amp;quot;:&amp;nbsp;token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Accept&amp;quot;:&amp;nbsp;&amp;quot;application/json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url&amp;nbsp;=&amp;nbsp;f&amp;quot;{self.base}{path}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.request(method,&amp;nbsp;url,&amp;nbsp;headers=headers,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params=params,&amp;nbsp;timeout=10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;resp.status_code&amp;nbsp;==&amp;nbsp;429:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ra&amp;nbsp;=&amp;nbsp;int(resp.headers.get(&amp;quot;Retry-After&amp;quot;,&amp;nbsp;60))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(ra&amp;nbsp;+&amp;nbsp;(i&amp;nbsp;*&amp;nbsp;2))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;resp.status_code&amp;nbsp;&amp;gt;=&amp;nbsp;500:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2&amp;nbsp;**&amp;nbsp;i)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;RuntimeError(&amp;quot;sp-api&amp;nbsp;retry&amp;nbsp;exhausted&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_orders(self,&amp;nbsp;last_updated_after,&amp;nbsp;next_token=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;{&amp;quot;MarketplaceIds&amp;quot;:&amp;nbsp;&amp;quot;...&amp;quot;,&amp;nbsp;&amp;quot;LastUpdatedAfter&amp;quot;:&amp;nbsp;last_updated_after}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;next_token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p[&amp;quot;NextToken&amp;quot;]&amp;nbsp;=&amp;nbsp;next_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self._request(&amp;quot;GET&amp;quot;,&amp;nbsp;&amp;quot;/orders/v0/orders&amp;quot;,&amp;nbsp;p)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_order_items(self,&amp;nbsp;amazon_order_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self._request(&amp;quot;GET&amp;quot;,&amp;nbsp;f&amp;quot;/orders/v0/orders/{amazon_order_id}/orderItems&amp;quot;)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;六、订单同步：通知 + Report + getOrders 兜底&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;spapi/order_sync.py
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime,&amp;nbsp;timedelta


class&amp;nbsp;SpOrderSync:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client,&amp;nbsp;repo,&amp;nbsp;dedup):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.repo&amp;nbsp;=&amp;nbsp;repo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.dedup&amp;nbsp;=&amp;nbsp;dedup

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;on_order_change(self,&amp;nbsp;amazon_order_id:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;通知只给&amp;nbsp;id，不信任通知体里的状态
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.dedup.mark(f&amp;quot;order_change:{amazon_order_id}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.fill_order(amazon_order_id)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;fill_order(self,&amp;nbsp;amazon_order_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;head&amp;nbsp;=&amp;nbsp;self.client._request(&amp;quot;GET&amp;quot;,&amp;nbsp;f&amp;quot;/orders/v0/orders/{amazon_order_id}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;items&amp;nbsp;=&amp;nbsp;self.client.get_order_items(amazon_order_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snap&amp;nbsp;=&amp;nbsp;self.normalize(head,&amp;nbsp;items)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.apply(snap)
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;poll_compensation(self,&amp;nbsp;marketplace_ids,&amp;nbsp;now:&amp;nbsp;datetime):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;结束时间留&amp;nbsp;2&amp;nbsp;分钟缓冲（Amazon&amp;nbsp;订单有&amp;nbsp;2&amp;nbsp;分钟延迟）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&amp;nbsp;=&amp;nbsp;now&amp;nbsp;-&amp;nbsp;timedelta(minutes=2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;end&amp;nbsp;-&amp;nbsp;timedelta(minutes=30)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next_token&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.get_orders(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_updated_after=start.isoformat(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next_token=next_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;o&amp;nbsp;in&amp;nbsp;resp[&amp;quot;payload&amp;quot;][&amp;quot;Orders&amp;quot;]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.on_order_change(o[&amp;quot;AmazonOrderId&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next_token&amp;nbsp;=&amp;nbsp;resp[&amp;quot;payload&amp;quot;].get(&amp;quot;NextToken&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;next_token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;getOrders&amp;nbsp;默认&amp;nbsp;1/min，别在循环里硬跑：
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(60)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;七、Reports 模式：大单量别用 getOrders&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;spapi/reports.py
class&amp;nbsp;SpReportClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;pull_orders_report(self,&amp;nbsp;marketplace_ids,&amp;nbsp;start,&amp;nbsp;end):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create&amp;nbsp;=&amp;nbsp;self.client._request(&amp;quot;POST&amp;quot;,&amp;nbsp;&amp;quot;/reports/2021-06-30/reports&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;reportType&amp;quot;:&amp;nbsp;&amp;quot;GET_FLAT_FILE_ORDER_REPORT&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;marketplaceIds&amp;quot;:&amp;nbsp;marketplace_ids,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;dataStartTime&amp;quot;:&amp;nbsp;start.isoformat(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;dataEndTime&amp;quot;:&amp;nbsp;end.isoformat(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;report_id&amp;nbsp;=&amp;nbsp;create[&amp;quot;reportId&amp;quot;]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;轮询状态：别狂轮，指数退避
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;_&amp;nbsp;in&amp;nbsp;range(30):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;status&amp;nbsp;=&amp;nbsp;self.client._request(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;GET&amp;quot;,&amp;nbsp;f&amp;quot;/reports/2021-06-30/reports/{report_id}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)[&amp;quot;payload&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;status[&amp;quot;processingStatus&amp;quot;]&amp;nbsp;==&amp;nbsp;&amp;quot;DONE&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.download(status[&amp;quot;reportDocumentId&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(min(60,&amp;nbsp;5&amp;nbsp;*&amp;nbsp;(2&amp;nbsp;**&amp;nbsp;_)))
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;download(self,&amp;nbsp;doc_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doc&amp;nbsp;=&amp;nbsp;self.client._request(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;GET&amp;quot;,&amp;nbsp;f&amp;quot;/reports/2021-06-30/documents/{doc_id}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)[&amp;quot;payload&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;doc[&amp;quot;url&amp;quot;]&amp;nbsp;是带签名的临时地址
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r&amp;nbsp;=&amp;nbsp;requests.get(doc[&amp;quot;url&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;r.text&amp;nbsp;&amp;nbsp;#&amp;nbsp;TSV/CSV&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;降本效果：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;1 万订单：getOrderItems 可能 1 万次 GET&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Orders Report：建 1 次 + 状态轮询 ~5 次 + 下载 1 次 = &lt;strong&gt;7 次调用&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;八、限流 / 错误分类（Amazon 特有）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;现象&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;类型&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;处理&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;429 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;QuotaExceeded&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;限流&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;读 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;Retry-After&lt;/code&gt;，指数退避&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;403 Access Denied&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;授权/Roles 错&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不重试，查 IAM/Data Rights&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;404&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;orderId 错 / 区域错&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不重试&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;500/503&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;平台抖动&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;退避重试&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;x-amzn-RateLimit-Limit&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;当前档位&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;监控用&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;DUP 提额&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;历史好&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;别依赖，仍要做退避&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;Amazon 限流算法 = &lt;strong&gt;token bucket&lt;/strong&gt;，但每个 operation 独立桶，且按 &lt;strong&gt;account × app&lt;/strong&gt; 双维度限流。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;九、“如果真收 $0.40/千次” 的防御代码&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;spapi/cost_meter.py
class&amp;nbsp;SpApiGetMeter:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;redis,&amp;nbsp;app_id,&amp;nbsp;budget_usd_per_month=50.0):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r&amp;nbsp;=&amp;nbsp;redis
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.key&amp;nbsp;=&amp;nbsp;f&amp;quot;spapi:get:cost:{app_id}:{month_now()}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.price_per_call&amp;nbsp;=&amp;nbsp;0.40&amp;nbsp;/&amp;nbsp;1000

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;count(self,&amp;nbsp;n=1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;=&amp;nbsp;self.r.incrby(self.key,&amp;nbsp;n)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cost&amp;nbsp;=&amp;nbsp;total&amp;nbsp;*&amp;nbsp;self.price_per_call
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;cost&amp;nbsp;&amp;gt;&amp;nbsp;50.0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;BudgetExceeded(f&amp;quot;SP-API&amp;nbsp;GET&amp;nbsp;预算将超:&amp;nbsp;${cost:.2f}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;estimated_cost(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;int(self.r.get(self.key)&amp;nbsp;or&amp;nbsp;0)&amp;nbsp;*&amp;nbsp;self.price_per_call&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;调用侧：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;meter.count(1)
resp&amp;nbsp;=&amp;nbsp;client.get_orders(...)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;GET 才计费，POST/PUT 不按量&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Reports 把 N 次 GET 压成几次 → 天然省钱&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;通知替代轮询 → 把“心跳轮询”成本降到 0&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;多卖家共享 App → 调用量聚合，更容易撞档 → 私域 App / 多 App 分租户要算清&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十、和前几篇收口&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;1688&lt;/strong&gt;：secret 头尾 MD5，QPS 卡脖&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;淘宝&lt;/strong&gt;：聚石塔内外 10 倍，DSS 推送免费&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;京东&lt;/strong&gt;：云鼎内稳，POP 时间窗&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;拼多多/抖店&lt;/strong&gt;：预充值，云外 ×10，增值禁外&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;亚马逊 SP-API&lt;/strong&gt;：&lt;strong&gt;不限国内云内云外概念，限流极狠 + 通知/报告分离 + 原拟 &lt;span class=&quot;ybc-markdown-katex&quot; data-latex=&quot;1400+&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7278em;vertical-align:-0.0833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1400&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0.40 但 2026-05 取消&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;一句话：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;国内平台是“钱换调用”，亚马逊是“限流换架构”。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;你用国内 ERP 的轮询本能写 SP-API，会先被 429 打服，再被（可能的）账单打醒。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;em&gt;&lt;em&gt;SP-API 的正解永远是：EventBridge 叫你、Reports 扛批量、getOrder&lt;/em&gt; 只补刀、NextToken 别硬翻、2 分钟延迟写进时间窗。&lt;/em&gt;*&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 17 Oct 2026 10:05:53 +0800</pubDate></item><item><title>《抖音订单API：/trade/order/detail 落地方案 —— 消息推送 + 补偿查询的架构设计》（附 Python 源码）</title><link>https://alexob.com/?id=573</link><description>&lt;h1&gt;《抖音订单API：/trade/order/detail 落地方案 —— 消息推送 + 补偿查询的架构设计》（附 Python 源码）&lt;/h1&gt;&lt;h2&gt;一、先拍结论&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店订单同步的成熟架构只有一句话：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;“消息/数据推送做触发器，/order/searchList 做时间窗兜底，/order/orderDetail 拉真相，本地状态机做仲裁。”&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;你写的 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/trade/order/detail&lt;/code&gt; 在抖店开放平台里更接近“抖音开放平台担保支付/交易订单”语义；&lt;strong&gt;抖店（抖店开放平台）真实订单详情是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/order/orderDetail&lt;/code&gt;，列表是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/order/searchList&lt;/code&gt;&lt;/strong&gt;。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;官方自己都明说：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;订单详情接口存在部分数据返回延时，&lt;strong&gt;订单生成后延时 10s 再查&lt;/strong&gt;；极端情况延迟 20 分钟，要用补偿机制再查一次&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据推送（抖店云 RDS）按 B 端事件触发，不是底层表每行变更都推&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;只靠消息推送 = 高峰丢包/重试失败/服务器慢响应 → 漏单&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;正确姿势：&lt;strong&gt;消息推送 + 接口轮询补偿&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;二、抖店订单接口边界（先纠名）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;角色&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;说明&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;消息推送 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;doudian_trade_TradeCreate/Paid/...&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;触发器&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;只给 order_id / 事件类型&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;数据推送（抖店云 RDS）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;准实时落库&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;推密文字段到绑定库，订单/售后/商品可配&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/order/searchList&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;补偿/初始化&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;按创建时间或更新时间拉列表&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/order/orderDetail&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;真相源&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;子单、优惠、收货密文、履约、售后态&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/afterSale/List&lt;/code&gt; + &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/afterSale/Detail&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;售后真相&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;退款/退货/换货独立轴&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;消息 ≠ 订单数据，列表 ≠ 订单详情，数据推送 ≠ 业务已处理。&lt;/strong&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;三、整体架构&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;┌──────────────────────────────┐
│&amp;nbsp;抖店平台&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
│&amp;nbsp;&amp;nbsp;-&amp;nbsp;消息推送（TradeCreate等）&amp;nbsp;&amp;nbsp;│
│&amp;nbsp;&amp;nbsp;-&amp;nbsp;数据推送（RDS&amp;nbsp;密文）&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
└────────────┬─────────────────┘
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼
┌──────────────────────────────┐
│&amp;nbsp;Push&amp;nbsp;Ingest（2~5s&amp;nbsp;返回&amp;nbsp;success）│
│&amp;nbsp;&amp;nbsp;-&amp;nbsp;msg_id&amp;nbsp;去重&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
│&amp;nbsp;&amp;nbsp;-&amp;nbsp;只入队&amp;nbsp;(shop_id,&amp;nbsp;order_id)&amp;nbsp;│
└────────────┬─────────────────┘
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;┌─────────────────┐
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;Order&amp;nbsp;Detail&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;Worker&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;/order/orderDetail│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;+10s&amp;nbsp;延迟&amp;nbsp;+&amp;nbsp;20min&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;补偿&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└────────┬──────────┘
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;┌─────────────────┐
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;状态机&amp;nbsp;+&amp;nbsp;幂等写&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;version&amp;nbsp;仲裁&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└────────┬──────────┘
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;┌─────────────────┐
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;补偿轮询&amp;nbsp;Cron&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;/order/searchList│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;更新时间窗&amp;nbsp;滚动&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─────────────────┘&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;双通道：&lt;/div&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;推模型&lt;/strong&gt;：快、省调用、但会丢/重/乱序&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;拉模型&lt;/strong&gt;：慢、烧调用、但能兜底&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;四、为什么不能直接“消息来了就发货”&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店订单详情有延迟：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;新单 10s 内可能拿不到完整数据&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;达人信息要等联盟结算，最长延迟 1 小时&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据推送的 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;version&lt;/code&gt; 不再是时间戳，不能拿来做时间排序&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;翻页时订单状态变化 → 正向翻页跳单 → 必须倒序/时间窗重叠&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;所以消息只干一件事：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;order_id&amp;nbsp;进队，标记&amp;nbsp;need_detail=true&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;五、Python：抖店订单 Client&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/order_client.py
import&amp;nbsp;time
import&amp;nbsp;hashlib
import&amp;nbsp;hmac
import&amp;nbsp;requests


class&amp;nbsp;DouyinOrderClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GATEWAY&amp;nbsp;=&amp;nbsp;&amp;quot;https://openapi-fxg.jinritemai.com/&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;access_token,&amp;nbsp;sign_method=&amp;quot;hmac-sha256&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.sign_method&amp;nbsp;=&amp;nbsp;sign_method

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_sign(self,&amp;nbsp;params:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join(f&amp;quot;{k}={params[k]}&amp;quot;&amp;nbsp;for&amp;nbsp;k&amp;nbsp;in&amp;nbsp;sorted(params))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.sign_method&amp;nbsp;==&amp;nbsp;&amp;quot;hmac-sha256&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hmac.new(self.app_secret.encode(),&amp;nbsp;qs.encode(),&amp;nbsp;hashlib.sha256).hexdigest()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5((self.app_secret&amp;nbsp;+&amp;nbsp;qs&amp;nbsp;+&amp;nbsp;self.app_secret).encode()).hexdigest().upper()
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_common(self,&amp;nbsp;method:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;method,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;access_token&amp;quot;:&amp;nbsp;self.access_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;time.strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;self.sign_method,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_post(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz:&amp;nbsp;dict):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;self._common(method)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;param_json&amp;quot;]&amp;nbsp;=&amp;nbsp;str(biz).replace(&amp;quot;&amp;#39;&amp;quot;,&amp;nbsp;&amp;#39;&amp;quot;&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.GATEWAY,&amp;nbsp;data=params,&amp;nbsp;timeout=5)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;search_list(self,&amp;nbsp;start_time,&amp;nbsp;end_time,&amp;nbsp;order_by=1,&amp;nbsp;page=1,&amp;nbsp;page_size=100,&amp;nbsp;order_status=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;start_time&amp;quot;:&amp;nbsp;start_time,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;end_time&amp;quot;:&amp;nbsp;end_time,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_by&amp;quot;:&amp;nbsp;order_by,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1=按更新时间倒序更稳
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;page_size,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;is_desc&amp;quot;:&amp;nbsp;1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;order_status&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz[&amp;quot;order_status&amp;quot;]&amp;nbsp;=&amp;nbsp;order_status
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self._post(&amp;quot;order.searchList&amp;quot;,&amp;nbsp;biz)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;order_detail(self,&amp;nbsp;order_id:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self._post(&amp;quot;order.orderDetail&amp;quot;,&amp;nbsp;{&amp;quot;order_id&amp;quot;:&amp;nbsp;order_id})&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;六、Detail Worker：10s 延迟 + 20min 补偿&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/order_detail_worker.py
import&amp;nbsp;time


class&amp;nbsp;OrderDetailWorker:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client,&amp;nbsp;repo,&amp;nbsp;dedup,&amp;nbsp;bucket,&amp;nbsp;queue):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.repo&amp;nbsp;=&amp;nbsp;repo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.dedup&amp;nbsp;=&amp;nbsp;dedup
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket&amp;nbsp;=&amp;nbsp;bucket
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.queue&amp;nbsp;=&amp;nbsp;queue

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;handle(self,&amp;nbsp;shop_id:&amp;nbsp;str,&amp;nbsp;order_id:&amp;nbsp;str,&amp;nbsp;delay=10):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;第一次：延&amp;nbsp;10s&amp;nbsp;再查
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(delay)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snap&amp;nbsp;=&amp;nbsp;self._fetch(order_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;self._data_complete(snap):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;极端延迟：20&amp;nbsp;分钟后补偿
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.queue.enqueue_delay(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;shop_id&amp;quot;:&amp;nbsp;shop_id,&amp;nbsp;&amp;quot;order_id&amp;quot;:&amp;nbsp;order_id,&amp;nbsp;&amp;quot;phase&amp;quot;:&amp;nbsp;&amp;quot;compensate&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delay=20&amp;nbsp;*&amp;nbsp;60,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._apply(shop_id,&amp;nbsp;snap)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_fetch(self,&amp;nbsp;order_id:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket.acquire()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.order_detail(order_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(resp.get(&amp;quot;data&amp;quot;)&amp;nbsp;or&amp;nbsp;{}).get(&amp;quot;order_info&amp;quot;)&amp;nbsp;or&amp;nbsp;resp
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_data_complete(self,&amp;nbsp;snap)&amp;nbsp;-&amp;gt;&amp;nbsp;bool:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;snap:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;刚支付时可能缺收件/子单/优惠拆分
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;snap.get(&amp;quot;pay_status&amp;quot;)&amp;nbsp;in&amp;nbsp;(1,&amp;nbsp;2)&amp;nbsp;and&amp;nbsp;not&amp;nbsp;snap.get(&amp;quot;sku_order_list&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;True

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_apply(self,&amp;nbsp;shop_id,&amp;nbsp;snap):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event_key&amp;nbsp;=&amp;nbsp;f&amp;quot;detail:{snap.get(&amp;#39;order_id&amp;#39;)}:{snap.get(&amp;#39;update_time&amp;#39;)}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;self.dedup.mark(shop_id,&amp;nbsp;snap.get(&amp;quot;order_id&amp;quot;),&amp;nbsp;event_key):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.repo.upsert_order(shop_id,&amp;nbsp;snap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.repo.emit_business_events(snap)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;七、补偿轮询：时间窗前移 + 倒序 + 重叠&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/order_compensator.py
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime,&amp;nbsp;timedelta


class&amp;nbsp;OrderCompensator:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client,&amp;nbsp;repo,&amp;nbsp;bucket):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.repo&amp;nbsp;=&amp;nbsp;repo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket&amp;nbsp;=&amp;nbsp;bucket

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;run(self,&amp;nbsp;shop_id,&amp;nbsp;now:&amp;nbsp;datetime):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;结束时间前移&amp;nbsp;2~5&amp;nbsp;分钟，避开平台入库延迟
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&amp;nbsp;=&amp;nbsp;now&amp;nbsp;-&amp;nbsp;timedelta(minutes=3)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;end&amp;nbsp;-&amp;nbsp;timedelta(minutes=30)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_update_seen&amp;nbsp;=&amp;nbsp;end

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket.acquire()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.search_list(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_time=int(start.timestamp()),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end_time=int(end.timestamp()),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_by=1,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;更新时间倒序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page=page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;orders&amp;nbsp;=&amp;nbsp;self._extract(resp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;orders:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;o&amp;nbsp;in&amp;nbsp;orders:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.repo.mark_need_detail(shop_id,&amp;nbsp;o[&amp;quot;order_id&amp;quot;],&amp;nbsp;o.get(&amp;quot;update_time&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u&amp;nbsp;=&amp;nbsp;int(o.get(&amp;quot;update_time&amp;quot;,&amp;nbsp;0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;u&amp;nbsp;&amp;lt;&amp;nbsp;min_update_seen.timestamp():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_update_seen&amp;nbsp;=&amp;nbsp;datetime.fromtimestamp(u)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(orders)&amp;nbsp;&amp;lt;&amp;nbsp;100&amp;nbsp;or&amp;nbsp;page&amp;nbsp;&amp;gt;=&amp;nbsp;50:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;+=&amp;nbsp;1

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;下一轮从最小&amp;nbsp;update_time&amp;nbsp;往前，并留&amp;nbsp;1&amp;nbsp;分钟重叠防跳单
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;min_update_seen&amp;nbsp;-&amp;nbsp;timedelta(minutes=1)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则（抖店专用）：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;结束时间 &lt;strong&gt;前移 2~5 分钟&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;按更新时间 &lt;strong&gt;倒序&lt;/strong&gt;，从后往前翻&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;下一轮起点 = 本批最小 update_time - 重叠窗口&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;不深翻页，不靠 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;page=9999&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;八、幂等键与状态机&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;order_version(snap)&amp;nbsp;-&amp;gt;&amp;nbsp;int:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;抖店&amp;nbsp;version&amp;nbsp;不是时间戳了，用&amp;nbsp;update_time&amp;nbsp;做业务版本
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;int(snap.get(&amp;quot;update_time&amp;quot;)&amp;nbsp;or&amp;nbsp;0)


def&amp;nbsp;apply_order(repo,&amp;nbsp;shop_id,&amp;nbsp;snap):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur&amp;nbsp;=&amp;nbsp;repo.get_order(shop_id,&amp;nbsp;snap[&amp;quot;order_id&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_ver&amp;nbsp;=&amp;nbsp;order_version(snap)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;cur&amp;nbsp;is&amp;nbsp;None:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;repo.insert_order(shop_id,&amp;nbsp;snap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fire_events(None,&amp;nbsp;snap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;new_ver&amp;nbsp;&amp;lt;&amp;nbsp;cur.version:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;nbsp;#&amp;nbsp;旧消息晚到
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;new_ver&amp;nbsp;==&amp;nbsp;cur.version&amp;nbsp;and&amp;nbsp;snap.get(&amp;quot;order_status&amp;quot;)&amp;nbsp;==&amp;nbsp;cur.order_status:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;nbsp;#&amp;nbsp;完全幂等

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;check_order_transition(cur.order_status,&amp;nbsp;snap[&amp;quot;order_status&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rows&amp;nbsp;=&amp;nbsp;repo.update_order_if_newer(shop_id,&amp;nbsp;snap,&amp;nbsp;cur.version)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;rows&amp;nbsp;==&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fire_events(cur,&amp;nbsp;snap)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;SQL 核心：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;UPDATE&amp;nbsp;douyin_order
SET&amp;nbsp;order_status=#,&amp;nbsp;pay_amount=#,&amp;nbsp;post_addr=#,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version=#,&amp;nbsp;update_time=#
WHERE&amp;nbsp;shop_id=#&amp;nbsp;AND&amp;nbsp;order_id=#
&amp;nbsp;&amp;nbsp;AND&amp;nbsp;version&amp;nbsp;&amp;lt;&amp;nbsp;#{new_version};&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;九、消息推送接入（只做触发器）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/push_webhook.py
def&amp;nbsp;on_push(body:&amp;nbsp;dict):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2~5&amp;nbsp;秒内必须返回&amp;nbsp;success
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg_id&amp;nbsp;=&amp;nbsp;body[&amp;quot;msg_id&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;dedup.msg_seen(msg_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;success&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tag&amp;nbsp;=&amp;nbsp;body[&amp;quot;tag&amp;quot;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;TradeCreate&amp;nbsp;/&amp;nbsp;TradePaid&amp;nbsp;...
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_id&amp;nbsp;=&amp;nbsp;body[&amp;quot;data&amp;quot;][&amp;quot;order_id&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id&amp;nbsp;=&amp;nbsp;body[&amp;quot;shop_id&amp;quot;]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queue.publish({&amp;quot;shop_id&amp;quot;:&amp;nbsp;shop_id,&amp;nbsp;&amp;quot;order_id&amp;quot;:&amp;nbsp;order_id,&amp;nbsp;&amp;quot;trigger&amp;quot;:&amp;nbsp;tag})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dedup.mark_msg(msg_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;success&amp;quot;&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;消息类型（节选）：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;doudian_trade_TradeCreate&lt;/code&gt;：下单&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;doudian_trade_TradePaid&lt;/code&gt;：支付成功&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;doudian_trade_TradePartlySellerShip&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;TradeSellerShip&lt;/code&gt;：发货&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;doudian_trade_TradeSuccess&lt;/code&gt;：完成&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;doudian_trade_TradeCanceled&lt;/code&gt;：取消&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;doudian_trade_AuthorInfo&lt;/code&gt;：达人信息补推&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;消息只告诉你要“去看哪个 order_id”，&lt;strong&gt;别把消息体当订单真相&lt;/strong&gt;。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;十、数据推送（抖店云 RDS）怎么摆&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店云数据推送：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;推到绑定 RDS，不是推到你的业务库&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;订单/售后/商品可配&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;历史 60 天、保留 60 天可配&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;version&lt;/code&gt; 不再当时间戳&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;生产摆法：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;抖店云&amp;nbsp;RDS（密文）
&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;CDC&amp;nbsp;/&amp;nbsp;定时读
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;业务库：order_raw（密文）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;解密服务（云内）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;order_biz（明文只在云内）&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;合规底线：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;明文收货信息/手机号解密服务&lt;strong&gt;必须抖店云内&lt;/strong&gt;；云外只持有 order_id / 状态 / 金额 / 商品，不持有明文。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;十一、售后轴独立（和拼多多同思路）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;sync_aftersale(shop_id,&amp;nbsp;start,&amp;nbsp;end):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;client._post(&amp;quot;afterSale.List&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;start_time&amp;quot;:&amp;nbsp;start,&amp;nbsp;&amp;quot;end_time&amp;quot;:&amp;nbsp;end,&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;100
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;a&amp;nbsp;in&amp;nbsp;extract(resp):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;detail&amp;nbsp;=&amp;nbsp;client._post(&amp;quot;afterSale.Detail&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_id&amp;quot;:&amp;nbsp;a[&amp;quot;order_id&amp;quot;],&amp;nbsp;&amp;quot;after_sale_id&amp;quot;:&amp;nbsp;a[&amp;quot;after_sale_id&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apply_aftersale(shop_id,&amp;nbsp;detail)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;订单表只存：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;after_sale_status&amp;nbsp;=&amp;nbsp;最新一条售后单的投影&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;真实仲裁看 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;douyin_after_sale&lt;/code&gt; 表。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;十二、调用配额与降本&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;消息推送：不按 API 次数烧钱&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据推送：走抖店云 RDS，不是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/order/orderDetail&lt;/code&gt; 轮询&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/order/searchList&lt;/code&gt;：补偿用，别当实时主源&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/order/orderDetail&lt;/code&gt;：按 order_id 触发，不批量盲拉&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;新单：消息 → 10s 后 detail&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;老单/漏单：30min 窗补偿&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;大促：searchList 窗缩到 5~10min，detail 桶单独限流&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十三、落地检查表&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;[ ] 消息 webhook 2~5s 返回 success，不写业务&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] msg_id 去重，order_id 进队&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] detail 延 10s 查，不完整就排 20min 补偿&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] searchList 结束时间前移 3min，倒序，重叠 1min&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] order_id 唯一键 + event_key 去重 + version(update_time) 仲裁&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 订单轴 / 售后轴 / 达人信息轴分开&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 达人信息用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;doudian_trade_AuthorInfo&lt;/code&gt; 覆盖，别信创建时刻&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 明文解密服务在抖店云内，云外只留密文/状态/金额&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 数据推送 RDS 是“准实时源”，不是“业务已处理”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 大促补偿窗缩短、detail QPS 单独桶、余额守卫在 Client 层&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十四、一句话收口&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;淘宝用 DSS 推、京东用 JMQ 推、拼多多靠增量轮询、抖店是&lt;strong&gt;“消息推送 + 抖店云数据推送 + searchList 补偿 + orderDetail 拉真相”四件套&lt;/strong&gt;。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店订单最阴的三件事是：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;新单详情延迟 10s~20min、version 不再是时间戳、达人信息要等联盟结算补推&lt;/strong&gt;。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;所以别把消息当数据、别把列表当详情、别把创建时刻的达人信息当最终口径。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;消息负责“叫你起床”，searchList 负责“查谁没醒”，orderDetail 负责“看清楚这张脸”。&lt;/strong&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 17 Oct 2026 09:15:55 +0800</pubDate></item><item><title>《抖音商品API：/product/detail 与 /product/list 的字段边界与图片合规踩坑》（附 Python 源码）</title><link>https://alexob.com/?id=572</link><description>&lt;h1&gt;《抖音商品API：/product/detail 与 /product/list 的字段边界与图片合规踩坑》（附 Python 源码）&lt;/h1&gt;&lt;h2&gt;一、先拍结论&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店商品域最容易出事的地方不是“调不通”，而是：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;把 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/product/list&lt;/code&gt; 当详情用、把 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pic&lt;/code&gt; 当 SKU 图用、把白底图当首图用、把平台返回图链当永久 CDN 用、把类目属性当可选填。&lt;/strong&gt;&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/product/list&lt;/code&gt;：列表视图，适合兜底/增量/比状态，&lt;strong&gt;字段是“缩略版”&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/product/detail&lt;/code&gt;：商品真相源，返回规格、SKU、图片、类目、属性、审核态&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pic&lt;/code&gt;：商品轮播主图&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_pics&lt;/code&gt;：SKU 规格图，&lt;strong&gt;要用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_detail_id&lt;/code&gt; 关联，不是用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_id&lt;/code&gt; 硬取&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;图片合规：首图实物无字、白底图单独传、3:4 或 1:1、无二维码/无极限词/无第三方水印&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;类目属性：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;product_format_new&lt;/code&gt; 等必填属性不填 → 发品直接被审核打回&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;二、两个接口的边界（别再混）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;维度&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/list&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/listV2&lt;/code&gt;&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/detail&lt;/code&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;定位&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商品列表/分页/状态扫描&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;单品真相&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;入参&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;page/page_size/status/update_time&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;product_id&lt;/code&gt; 或 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;out_product_id&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;返回&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础字段：标题、状态、价格、主图、类目&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;完整：spec、sku、spec_pics、desc、类目属性&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;成本&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;列表类调用，店群别乱翻页&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;详情类调用，按商品触发&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;用法&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;兜底漏单、状态机推进&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;写商品主数据、SKU 映射、图片合规校验&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;坑&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;以为列表里有完整 SKU 图&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;以为 detail 不收费/可以无限拉&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;生产铁律：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;list&amp;nbsp;&amp;nbsp;=&amp;nbsp;找哪些商品变了
detail&amp;nbsp;=&amp;nbsp;把变了的那个商品看清楚
sku/list&amp;nbsp;=&amp;nbsp;拿&amp;nbsp;SKU&amp;nbsp;级&amp;nbsp;spec_detail_id
spec_pics&amp;nbsp;=&amp;nbsp;按&amp;nbsp;spec_detail_id&amp;nbsp;关联&amp;nbsp;SKU&amp;nbsp;图&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;官方明确说过：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;product/detail&lt;/code&gt; 返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_pics&lt;/code&gt;，但 &lt;strong&gt;不能用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/sku/list&lt;/code&gt; 的 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_id&lt;/code&gt; 去取 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_pics&lt;/code&gt;&lt;/strong&gt;，要用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_detail_id1&lt;/code&gt; 和 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_pics.spec_detail_id&lt;/code&gt; 关联；图片链接往往还要拼固定域名。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;三、核心字段边界&lt;/h2&gt;&lt;h3&gt;1. 商品级&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;product_id&amp;quot;:&amp;nbsp;&amp;quot;3558192687276554544&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;out_product_id&amp;quot;:&amp;nbsp;&amp;quot;dy001&amp;quot;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;新推荐；out_product_id&amp;nbsp;是老字段，逐渐废弃
&amp;nbsp;&amp;nbsp;&amp;quot;name&amp;quot;:&amp;nbsp;&amp;quot;纯棉短袖T恤&amp;nbsp;男&amp;nbsp;夏季&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;pic&amp;quot;:&amp;nbsp;[&amp;quot;https://p3-.../a.jpg&amp;quot;],&amp;nbsp;&amp;nbsp;//&amp;nbsp;商品轮播主图，不是&amp;nbsp;SKU&amp;nbsp;图
&amp;nbsp;&amp;nbsp;&amp;quot;status&amp;quot;:&amp;nbsp;1,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;上下架
&amp;nbsp;&amp;nbsp;&amp;quot;check_status&amp;quot;:&amp;nbsp;2,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;审核状态
&amp;nbsp;&amp;nbsp;&amp;quot;cid&amp;quot;:&amp;nbsp;12345,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;类目
&amp;nbsp;&amp;nbsp;&amp;quot;product_format_new&amp;quot;:&amp;nbsp;{...},&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;类目必填属性
&amp;nbsp;&amp;nbsp;&amp;quot;description&amp;quot;:&amp;nbsp;&amp;quot;&amp;lt;p&amp;gt;详情页HTML&amp;lt;/p&amp;gt;&amp;quot;
}&lt;/pre&gt;&lt;h3&gt;2. SKU 级&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;sku_id&amp;quot;:&amp;nbsp;&amp;quot;123&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;out_sku_id&amp;quot;:&amp;nbsp;456,
&amp;nbsp;&amp;nbsp;&amp;quot;outer_sku_id&amp;quot;:&amp;nbsp;&amp;quot;A001&amp;quot;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;新推荐&amp;nbsp;string&amp;nbsp;版
&amp;nbsp;&amp;nbsp;&amp;quot;spec_detail_id1&amp;quot;:&amp;nbsp;&amp;quot;1001&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;spec_detail_id2&amp;quot;:&amp;nbsp;&amp;quot;1002&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;spec_detail_name1&amp;quot;:&amp;nbsp;&amp;quot;颜色&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;spec_detail_name2&amp;quot;:&amp;nbsp;&amp;quot;尺码&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;3900,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;分
&amp;nbsp;&amp;nbsp;&amp;quot;stock_num&amp;quot;:&amp;nbsp;10
}&lt;/pre&gt;&lt;h3&gt;3. 规格图级&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;spec_pics&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;spec_detail_id&amp;quot;:&amp;nbsp;&amp;quot;1001&amp;quot;,&amp;nbsp;&amp;quot;url&amp;quot;:&amp;nbsp;&amp;quot;https://p3-.../red.png&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;spec_detail_id&amp;quot;:&amp;nbsp;&amp;quot;1002&amp;quot;,&amp;nbsp;&amp;quot;url&amp;quot;:&amp;nbsp;&amp;quot;https://p3-.../blue.png&amp;quot;}
&amp;nbsp;&amp;nbsp;]
}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;正确关联：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;sku_spec_detail_id&amp;nbsp;=&amp;nbsp;sku[&amp;quot;spec_detail_id1&amp;quot;]
sku_img&amp;nbsp;=&amp;nbsp;next(p[&amp;quot;url&amp;quot;]&amp;nbsp;for&amp;nbsp;p&amp;nbsp;in&amp;nbsp;spec_pics&amp;nbsp;if&amp;nbsp;p[&amp;quot;spec_detail_id&amp;quot;]&amp;nbsp;==&amp;nbsp;sku_spec_detail_id)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;错误关联：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;sku_img&amp;nbsp;=&amp;nbsp;spec_pics[sku[&amp;quot;spec_id&amp;quot;]]&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;错！spec_id&amp;nbsp;≠&amp;nbsp;spec_detail_id&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;四、图片合规：抖店不是“能传上去就合规”&lt;/h2&gt;&lt;h3&gt;1. 主图规则（官方口径）&lt;/h3&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;第一张主图：&lt;strong&gt;商品主体正面实物图&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;所有主图：除品牌 logo 外，&lt;strong&gt;不得有文字/水印&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;辅图：侧面/背面/平铺/细节，不能全一个角度&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;主图商品数量/颜色/规格要和 SKU 一致&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;不得有二维码、微信号、第三方平台水印、非平台链接&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;2. 比例与尺寸&lt;/h3&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;1:1：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;800×800&lt;/code&gt;，建议 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;1200×1200&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;3:4：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;750×1000&lt;/code&gt;，信息流更吃这个&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;白底图：纯白、无阴影、无 logo、主体占 70%+&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;详情页：宽 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;750&lt;/code&gt;，总高别超 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;10000&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;主图视频：9:16，1080×1920，MP4&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3. 白底图误区&lt;/h3&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;白底图不是“首图必须白底”，而是“商城流量/活动报名的加分素材”。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;服装鞋包类：首图用实拍/纯色底图，白底图单独传；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;全 AI 生成主体、抠图假白底、牛皮癣大字：会被打压/下架/降权。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;五、类目与必填属性：发品被打回的重灾区&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/product/detail&lt;/code&gt; 里你能看到类目和属性，但&lt;strong&gt;发品/编辑时&lt;/strong&gt;：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cid&lt;/code&gt; 选错 → 类目错放（严重违规，下架+扣分）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;product_format_new&lt;/code&gt; 必填属性没填 → 审核不通过&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;必填属性要通过 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/product/getCatePropertyV2&lt;/code&gt; 拿，不是拍脑袋&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;编辑商品时：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_prices&lt;/code&gt; 是大 JSON，&lt;strong&gt;不传的字段不更新，传就要传完整结构&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;类目属性归一：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;pdd_cat_path&amp;nbsp;=&amp;nbsp;&amp;quot;男装&amp;nbsp;&amp;gt;&amp;nbsp;T恤&amp;nbsp;&amp;gt;&amp;nbsp;短袖T恤&amp;quot;
tb_cid3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;50012029
jd_cid3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;998
douyin_cid&amp;nbsp;&amp;nbsp;=&amp;nbsp;12345

#&amp;nbsp;跨平台别用&amp;nbsp;cat_id&amp;nbsp;直连，用“类目路径&amp;nbsp;+&amp;nbsp;属性词”做映射&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;六、Python：detail / list 拉取 + 字段归一&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/product_client.py
import&amp;nbsp;time
import&amp;nbsp;hashlib
import&amp;nbsp;requests
import&amp;nbsp;hmac


class&amp;nbsp;DouyinProductClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GATEWAY&amp;nbsp;=&amp;nbsp;&amp;quot;https://openapi-fxg.jinritemai.com/&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;access_token,&amp;nbsp;sign_method=&amp;quot;hmac-sha256&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.sign_method&amp;nbsp;=&amp;nbsp;sign_method

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_sign(self,&amp;nbsp;params:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;amp;&amp;quot;.join(f&amp;quot;{k}={params[k]}&amp;quot;&amp;nbsp;for&amp;nbsp;k&amp;nbsp;in&amp;nbsp;sorted(params))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.sign_method&amp;nbsp;==&amp;nbsp;&amp;quot;hmac-sha256&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hmac.new(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret.encode(),&amp;nbsp;qs.encode(),&amp;nbsp;hashlib.sha256
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).hexdigest()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(self.app_secret&amp;nbsp;+&amp;nbsp;qs&amp;nbsp;+&amp;nbsp;self.app_secret).encode()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_common(self,&amp;nbsp;method:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;method,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;access_token&amp;quot;:&amp;nbsp;self.access_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;time.strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;,&amp;nbsp;time.localtime()),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;self.sign_method,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;list_products(self,&amp;nbsp;status=None,&amp;nbsp;page=1,&amp;nbsp;page_size=100,&amp;nbsp;start=None,&amp;nbsp;end=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz&amp;nbsp;=&amp;nbsp;{&amp;quot;page&amp;quot;:&amp;nbsp;page,&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;page_size,&amp;nbsp;&amp;quot;order_by&amp;quot;:&amp;nbsp;1}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;status&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz[&amp;quot;status&amp;quot;]&amp;nbsp;=&amp;nbsp;status
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;start:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz[&amp;quot;start_time&amp;quot;]&amp;nbsp;=&amp;nbsp;start
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;end:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz[&amp;quot;end_time&amp;quot;]&amp;nbsp;=&amp;nbsp;end
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;self._common(&amp;quot;product.list&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;param_json&amp;quot;]&amp;nbsp;=&amp;nbsp;str(biz).replace(&amp;quot;&amp;#39;&amp;quot;,&amp;nbsp;&amp;#39;&amp;quot;&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;requests.post(self.GATEWAY,&amp;nbsp;data=params,&amp;nbsp;timeout=5).json()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_detail(self,&amp;nbsp;product_id=None,&amp;nbsp;out_product_id=None,&amp;nbsp;show_draft=False):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz&amp;nbsp;=&amp;nbsp;{&amp;quot;show_draft&amp;quot;:&amp;nbsp;show_draft}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;product_id:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz[&amp;quot;product_id&amp;quot;]&amp;nbsp;=&amp;nbsp;product_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;out_product_id:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz[&amp;quot;out_product_id&amp;quot;]&amp;nbsp;=&amp;nbsp;out_product_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ValueError(&amp;quot;product_id/out_product_id&amp;nbsp;至少传一个&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;self._common(&amp;quot;product.detail&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;param_json&amp;quot;]&amp;nbsp;=&amp;nbsp;str(biz).replace(&amp;quot;&amp;#39;&amp;quot;,&amp;nbsp;&amp;#39;&amp;quot;&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;requests.post(self.GATEWAY,&amp;nbsp;data=params,&amp;nbsp;timeout=5).json()&lt;/pre&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;param_json&lt;/code&gt; 是&lt;strong&gt;字符串化 JSON&lt;/strong&gt;，不是散参数；&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;timestamp&lt;/code&gt; 是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;yyyy-MM-dd HH:mm:ss&lt;/code&gt;（GMT+8）。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;七、Python：SKU 图按 spec_detail_id 关联&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/spec_pic_resolver.py
from&amp;nbsp;dataclasses&amp;nbsp;import&amp;nbsp;dataclass
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Dict,&amp;nbsp;List,&amp;nbsp;Optional


@dataclass
class&amp;nbsp;ResolvedSku:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_id:&amp;nbsp;str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;outer_sku_id:&amp;nbsp;Optional[str]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attrs:&amp;nbsp;Dict[str,&amp;nbsp;str]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_yuan:&amp;nbsp;float
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock:&amp;nbsp;int
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_img:&amp;nbsp;Optional[str]

#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
def&amp;nbsp;resolve_skus(detail:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;List[ResolvedSku]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;(detail.get(&amp;quot;data&amp;quot;)&amp;nbsp;or&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spec_pics&amp;nbsp;=&amp;nbsp;{p[&amp;quot;spec_detail_id&amp;quot;]:&amp;nbsp;p[&amp;quot;url&amp;quot;]&amp;nbsp;for&amp;nbsp;p&amp;nbsp;in&amp;nbsp;d.get(&amp;quot;spec_pics&amp;quot;,&amp;nbsp;[])}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;sku&amp;nbsp;in&amp;nbsp;d.get(&amp;quot;skus&amp;quot;,&amp;nbsp;d.get(&amp;quot;spec_prices&amp;quot;,&amp;nbsp;[])):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attrs&amp;nbsp;=&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;(1,&amp;nbsp;2,&amp;nbsp;3):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name&amp;nbsp;=&amp;nbsp;sku.get(f&amp;quot;spec_detail_name{i}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val&amp;nbsp;=&amp;nbsp;sku.get(f&amp;quot;spec_detail_value{i}&amp;quot;)&amp;nbsp;or&amp;nbsp;sku.get(f&amp;quot;spec{i}_name&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;name:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attrs[name]&amp;nbsp;=&amp;nbsp;val

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;一级规格图最常见；多级可拼&amp;nbsp;[sd1,&amp;nbsp;sd2]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sd&amp;nbsp;=&amp;nbsp;sku.get(&amp;quot;spec_detail_id1&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_img&amp;nbsp;=&amp;nbsp;spec_pics.get(sd)&amp;nbsp;if&amp;nbsp;sd&amp;nbsp;else&amp;nbsp;None

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_fen&amp;nbsp;=&amp;nbsp;sku.get(&amp;quot;price&amp;quot;)&amp;nbsp;or&amp;nbsp;sku.get(&amp;quot;sku_price&amp;quot;)&amp;nbsp;or&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock&amp;nbsp;=&amp;nbsp;sku.get(&amp;quot;stock_num&amp;quot;)&amp;nbsp;or&amp;nbsp;sku.get(&amp;quot;available_stock&amp;quot;)&amp;nbsp;or&amp;nbsp;0

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.append(ResolvedSku(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_id=str(sku[&amp;quot;sku_id&amp;quot;]),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;outer_sku_id=sku.get(&amp;quot;outer_sku_id&amp;quot;)&amp;nbsp;or&amp;nbsp;str(sku.get(&amp;quot;out_sku_id&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attrs=attrs,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_yuan=price_fen&amp;nbsp;/&amp;nbsp;100.0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock=int(stock),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_img=sku_img,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;out&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;八、Python：图片合规预检（上架前拦废图）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/image_compliance.py
import&amp;nbsp;re
from&amp;nbsp;urllib.parse&amp;nbsp;import&amp;nbsp;urlparse


FORBIDDEN_TEXT_HINTS&amp;nbsp;=&amp;nbsp;[&amp;quot;微信&amp;quot;,&amp;nbsp;&amp;quot;加我&amp;quot;,&amp;nbsp;&amp;quot;扫码&amp;quot;,&amp;nbsp;&amp;quot;薇信&amp;quot;,&amp;nbsp;&amp;quot;私聊&amp;quot;,&amp;nbsp;&amp;quot;淘宝&amp;quot;,&amp;nbsp;&amp;quot;京东&amp;quot;,&amp;nbsp;&amp;quot;拼多多&amp;quot;]
EXT_OK&amp;nbsp;=&amp;nbsp;{&amp;quot;.jpg&amp;quot;,&amp;nbsp;&amp;quot;.jpeg&amp;quot;,&amp;nbsp;&amp;quot;.png&amp;quot;}
LIMIT_MB&amp;nbsp;=&amp;nbsp;3


class&amp;nbsp;ImageComplianceError(Exception):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass


def&amp;nbsp;check_main_images(pics:&amp;nbsp;list,&amp;nbsp;first_must_be_real=True):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;pics&amp;nbsp;or&amp;nbsp;len(pics)&amp;nbsp;&amp;lt;&amp;nbsp;3:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ImageComplianceError(&amp;quot;主图至少&amp;nbsp;3&amp;nbsp;张&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(pics)&amp;nbsp;&amp;gt;&amp;nbsp;9:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ImageComplianceError(&amp;quot;主图最多&amp;nbsp;9&amp;nbsp;张&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;url&amp;nbsp;in&amp;nbsp;pics:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;=&amp;nbsp;urlparse(url)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ext&amp;nbsp;=&amp;nbsp;&amp;quot;.&amp;quot;&amp;nbsp;+&amp;nbsp;p.path.rsplit(&amp;quot;.&amp;quot;,&amp;nbsp;1)[-1].lower()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;ext&amp;nbsp;not&amp;nbsp;in&amp;nbsp;EXT_OK:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ImageComplianceError(f&amp;quot;格式不支持:&amp;nbsp;{url}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;any(h&amp;nbsp;in&amp;nbsp;url.lower()&amp;nbsp;for&amp;nbsp;h&amp;nbsp;in&amp;nbsp;(&amp;quot;qrcode&amp;quot;,&amp;nbsp;&amp;quot;wechat&amp;quot;,&amp;nbsp;&amp;quot;vip&amp;quot;)):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ImageComplianceError(f&amp;quot;疑似二维码/站外水印:&amp;nbsp;{url}&amp;quot;)

#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
def&amp;nbsp;check_title(title:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;title:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ImageComplianceError(&amp;quot;标题为空&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(title)&amp;nbsp;&amp;gt;&amp;nbsp;30:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ImageComplianceError(&amp;quot;标题超过&amp;nbsp;30&amp;nbsp;个汉字&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad&amp;nbsp;=&amp;nbsp;[&amp;quot;第一&amp;quot;,&amp;nbsp;&amp;quot;最高级&amp;quot;,&amp;nbsp;&amp;quot;全网最低&amp;quot;,&amp;nbsp;&amp;quot;百分百&amp;quot;,&amp;nbsp;&amp;quot;根治&amp;quot;,&amp;nbsp;&amp;quot;包治&amp;quot;,&amp;nbsp;&amp;quot;最便宜&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hit&amp;nbsp;=&amp;nbsp;[w&amp;nbsp;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;bad&amp;nbsp;if&amp;nbsp;w&amp;nbsp;in&amp;nbsp;title]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;hit:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ImageComplianceError(f&amp;quot;标题含极限/违规词:&amp;nbsp;{hit}&amp;quot;)


def&amp;nbsp;check_attr_completeness(product_format_new:&amp;nbsp;dict,&amp;nbsp;required_keys:&amp;nbsp;list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;missing&amp;nbsp;=&amp;nbsp;[k&amp;nbsp;for&amp;nbsp;k&amp;nbsp;in&amp;nbsp;required_keys&amp;nbsp;if&amp;nbsp;not&amp;nbsp;product_format_new.get(k)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;missing:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ImageComplianceError(f&amp;quot;类目必填属性缺失:&amp;nbsp;{missing}&amp;quot;)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;调用顺序：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;check_title(name)
check_main_images(pic)
check_attr_completeness(product_format_new,&amp;nbsp;required_keys)
#&amp;nbsp;过了再进&amp;nbsp;addV2&amp;nbsp;/&amp;nbsp;editV2&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;九、list → detail → sku 的生产流水线&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;/product/listV2
&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;拿到&amp;nbsp;product_id&amp;nbsp;+&amp;nbsp;status&amp;nbsp;+&amp;nbsp;update_time
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;状态/时间变化&amp;nbsp;→&amp;nbsp;进待同步队列

Worker:
&amp;nbsp;&amp;nbsp;&amp;nbsp;/product/detail(product_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├─&amp;nbsp;归一商品主数据（标题/类目/主图/详情）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├─&amp;nbsp;resolve_skus()&amp;nbsp;&amp;nbsp;→&amp;nbsp;SKU&amp;nbsp;表
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├─&amp;nbsp;spec_pics&amp;nbsp;按&amp;nbsp;spec_detail_id&amp;nbsp;关联
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;├─&amp;nbsp;check_title&amp;nbsp;/&amp;nbsp;check_main_images&amp;nbsp;/&amp;nbsp;check_attr_completeness
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;写&amp;nbsp;erp_spu&amp;nbsp;/&amp;nbsp;erp_sku&amp;nbsp;/&amp;nbsp;platform_product_snapshot

编辑回写：
&amp;nbsp;&amp;nbsp;&amp;nbsp;/product/editV2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;spec_prices&amp;nbsp;要传完整结构
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;不传的字段不会被更新&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;十、编辑商品的两个暗雷&lt;/h2&gt;&lt;h3&gt;1. &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_prices&lt;/code&gt; 是整体结构&lt;/h3&gt;&lt;div class=&quot;ybc-p&quot;&gt;编辑时你只改价格：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{&amp;quot;spec_prices&amp;quot;:&amp;nbsp;[{&amp;quot;sku_id&amp;quot;:&amp;nbsp;1,&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;3990}]}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;❌ 会丢库存/规格名/编码。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ 必须从 detail 里读完整 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_prices&lt;/code&gt;，改其中字段再回写。&lt;/div&gt;&lt;h3&gt;2. 审核中和在售商品&lt;/h3&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;编辑在售商品：审核通过后才会覆盖线上数据&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;审核中商品：别并发编辑，别用 list 里的缩略数据回写 detail 级字段&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十一、跨平台 SKU 归一（接前几篇）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;platform&amp;quot;:&amp;nbsp;&amp;quot;douyin&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;spu_id&amp;quot;:&amp;nbsp;product_id,
&amp;nbsp;&amp;nbsp;&amp;quot;sku_id&amp;quot;:&amp;nbsp;sku_id,
&amp;nbsp;&amp;nbsp;&amp;quot;outer_sku_id&amp;quot;:&amp;nbsp;outer_sku_id,
&amp;nbsp;&amp;nbsp;&amp;quot;attrs&amp;quot;:&amp;nbsp;{&amp;quot;颜色&amp;quot;:&amp;nbsp;&amp;quot;红&amp;quot;,&amp;nbsp;&amp;quot;尺码&amp;quot;:&amp;nbsp;&amp;quot;M&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;quot;sku_fingerprint&amp;quot;:&amp;nbsp;sha1(json.dumps(sorted(attrs))),
&amp;nbsp;&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;39.9,
&amp;nbsp;&amp;nbsp;&amp;quot;stock&amp;quot;:&amp;nbsp;10,
&amp;nbsp;&amp;nbsp;&amp;quot;images&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;product_pics&amp;quot;:&amp;nbsp;[...],&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;商品主图
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_spec_pic&amp;quot;:&amp;nbsp;&amp;quot;https://...&amp;quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;规格图，按&amp;nbsp;spec_detail_id&amp;nbsp;关联
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pic&lt;/code&gt; ≠ &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_pics&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_id&lt;/code&gt; ≠ &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_detail_id&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;out_sku_id&lt;/code&gt;(int) ≠ &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;outer_sku_id&lt;/code&gt;(string)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;跨平台别用平台 cat_id 直连，用类目路径+属性词&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十二、落地检查表&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;[ ] list 只做“哪些商品变了”，不写主数据&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] detail 才写 SPU/SKU/图片/属性&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] SKU 图用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_detail_id&lt;/code&gt; 关联 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_pics&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 主图 ≥3 张、≤9 张，首图实物无字&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 白底图单独传，不强制当首图&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 3:4 / 1:1 都支持，服装鞋包优先 3:4&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 标题 ≤30 汉字，无极限词/站外词&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 详情页无二维码/微信号/第三方水印&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;product_format_new&lt;/code&gt; 必填属性用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;getCatePropertyV2&lt;/code&gt; 拿&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] editV2 的 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_prices&lt;/code&gt; 传完整结构&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 图片 URL 拼域名后再存，别直接信相对路径&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 列表调用和详情调用分桶计费（2026.7.1 起都值钱）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十三、一句话收口&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;淘宝商品难在 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;properties_name&lt;/code&gt;，京东难在 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;skuList&lt;/code&gt; 嵌套，拼多多难在 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;specs + sku_list.specs&lt;/code&gt; 自己笛卡尔，&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店商品难在：&lt;strong&gt;list 和 detail 的字段边界、spec_id 和 spec_detail_id 的图关联、首图和白底图的合规语义、类目必填属性的审核拦截&lt;/strong&gt;。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;谁把 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;/product/list&lt;/code&gt; 的 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pic&lt;/code&gt; 当成 SKU 图、把白底图塞成首图、把 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_id&lt;/code&gt; 拿去查 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;spec_pics&lt;/code&gt;、把必填属性当可选填——&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;谁就会看到：商品能发上去，但流量起不来、审核被打回、SKU 图串色、跨平台主数据全歪。&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 16 Oct 2026 14:19:29 +0800</pubDate></item><item><title>《抖店开放平台API：落地方案、接口边界与业务踩坑 —— 2026.7.1 商品发布接口收费》（附 Python 源码）</title><link>https://alexob.com/?id=571</link><description>&lt;h1&gt;《抖店开放平台API：落地方案、接口边界与业务踩坑 —— 2026.7.1 商品发布接口收费》（附 Python 源码）&lt;/h1&gt;&lt;h2&gt;一、2026.7.1 新规先拍死（官方口径）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店开放平台 2026-06-16 发《收费范围调整公告》+《技术服务费规则 V1.3》，&lt;strong&gt;2026-07-01 起生效&lt;/strong&gt;：&lt;/div&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;true&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;类型&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;抖店云内&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;抖店云外（公网/ECS/本地）&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;计费&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础 API&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/addV2&lt;/code&gt;、&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/addSchema&lt;/code&gt; 等&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;¥0.018 / 百次 / AppKey&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;¥0.18 / 百次 / AppKey（×10）&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;按实际调用量&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;基础 API&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单/售后/商品详情等&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;¥0.018 / 百次&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;¥0.18 / 百次&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;按实际调用量&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值 API&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;批量解密等&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;¥0.05 / 百次&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;禁止云外调用&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;按实际调用量&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;新增收费类目：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;电商软件服务商 → 商品供应链&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;电商软件服务商 → 选品铺货-微应用&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;结算模型：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;预充值&lt;/strong&gt;。每月 5 号扣上月费用；余额不足 = 硬断调用（不是 429 限流）；已充金额&lt;strong&gt;不退、不提现、不转账&lt;/strong&gt;。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;这点和拼多多一样毒：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;淘宝/京东是“用后结”，抖店/拼多多是“先充钱，欠费断气”&lt;/strong&gt;。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;二、抖店 API 的“视角”和别家不同&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;平台&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商品发布&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单真相&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;推送&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.add&lt;/code&gt; 聚石塔内&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;trade.fullinfo.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;DSS 推送&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.goods.create&lt;/code&gt; / read 模型&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.order.detail.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;JMQ&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;拼多多&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.goods.add&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.order.information.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增量轮询为主&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;抖店&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/addV2&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/addSchema&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/order/orderDetail&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;数据推送（订单/售后→RDS）免费&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店最舒服的一点：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;订单/售后数据推送是免费产品&lt;/strong&gt;，官方明着建议你“云内调用 + 数据推送”代替轮询。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店最坑的一点：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;商品发布以前是铺货 ERP 的“免费洼地”，2026.7.1 起填平了。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;店群/选品铺货/微应用 ISV 的“日发几万 SKU”模型直接变成本中心。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;三、商品发布接口边界（别把 addV2 当 detail 用）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;作用&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;收费？&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/publishPreCheck&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;发品前置校验（类目/资质/门槛）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;官方定位为前置校验，别当 addV2 发&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/addSchema&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;Schema 草稿/结构化发品&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;收费（基础 API）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/addV2&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;直接发布商品&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;收费（基础 API）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/editV2&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;编辑商品&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;是否收费看当期收费列表&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/listQuery&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商品列表&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;看收费列表&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/product/detail&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商品详情&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;看收费列表&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;/spu/query&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;SPU 是否存在&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;批量化摊薄&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;数据推送（订单/售后）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;变更写 RDS&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;免费&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;生产铁律：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;免费前置校验&amp;nbsp;→&amp;nbsp;拦掉必败请求
批量查&amp;nbsp;SPU&amp;nbsp;/&amp;nbsp;类目&amp;nbsp;/&amp;nbsp;属性&amp;nbsp;→&amp;nbsp;摊薄
addSchema&amp;nbsp;建草稿&amp;nbsp;→&amp;nbsp;同源商品复用
addV2&amp;nbsp;正式发&amp;nbsp;→&amp;nbsp;只发一次
listQuery&amp;nbsp;兜底&amp;nbsp;→&amp;nbsp;别逐单&amp;nbsp;detail&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;四、成本测算（店群一眼看懂）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/cost_calc.py
class&amp;nbsp;DouyinErpCost:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RATES&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cloud_inner&amp;quot;:&amp;nbsp;0.018&amp;nbsp;/&amp;nbsp;100,&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;元/次
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cloud_outer&amp;quot;:&amp;nbsp;0.18&amp;nbsp;/&amp;nbsp;100,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;元/次
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;monthly(self,&amp;nbsp;calls_per_day:&amp;nbsp;int,&amp;nbsp;shops:&amp;nbsp;int,&amp;nbsp;env:&amp;nbsp;str,&amp;nbsp;days=30):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;env&amp;nbsp;not&amp;nbsp;in&amp;nbsp;self.RATES:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ValueError(env)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unit&amp;nbsp;=&amp;nbsp;self.RATES[env]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_calls&amp;nbsp;=&amp;nbsp;calls_per_day&amp;nbsp;*&amp;nbsp;shops&amp;nbsp;*&amp;nbsp;days
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;total_calls&amp;nbsp;*&amp;nbsp;unit


if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c&amp;nbsp;=&amp;nbsp;DouyinErpCost()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;单店日&amp;nbsp;1&amp;nbsp;万次发布类调用
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;云内&amp;nbsp;1店:&amp;quot;,&amp;nbsp;c.monthly(10_000,&amp;nbsp;1,&amp;nbsp;&amp;quot;cloud_inner&amp;quot;))&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;54.0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;云外&amp;nbsp;1店:&amp;quot;,&amp;nbsp;c.monthly(10_000,&amp;nbsp;1,&amp;nbsp;&amp;quot;cloud_outer&amp;quot;))&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;540.0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;云内&amp;nbsp;20店:&amp;quot;,&amp;nbsp;c.monthly(10_000,&amp;nbsp;20,&amp;nbsp;&amp;quot;cloud_inner&amp;quot;))&amp;nbsp;#&amp;nbsp;1080.0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;云外&amp;nbsp;20店:&amp;quot;,&amp;nbsp;c.monthly(10_000,&amp;nbsp;20,&amp;nbsp;&amp;quot;cloud_outer&amp;quot;))&amp;nbsp;#&amp;nbsp;10800.0&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;店群场景：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;100 店 × 日 3000 发品调用&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;云内：≈ ¥1620 / 月&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;云外：≈ ¥16200 / 月&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;云外不是“贵一点”，是&lt;strong&gt;把商品发布 ERP 的利润模型打穿&lt;/strong&gt;。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;五、抖店签名 Client（method + timestamp 秒级）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/client.py
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;requests


class&amp;nbsp;DouyinOpenClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GATEWAY&amp;nbsp;=&amp;nbsp;&amp;quot;https://openapi-fxg.jinritemai.com/&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;access_token=None,&amp;nbsp;timeout=5):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.timeout&amp;nbsp;=&amp;nbsp;timeout
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_sign(self,&amp;nbsp;params:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flat&amp;nbsp;=&amp;nbsp;{k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted(flat.items()))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;self.app_secret&amp;nbsp;+&amp;nbsp;qs&amp;nbsp;+&amp;nbsp;self.app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;execute(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz:&amp;nbsp;dict):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;method,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;str(int(time.time())),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.access_token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;access_token&amp;quot;]&amp;nbsp;=&amp;nbsp;self.access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params.update(biz)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.GATEWAY,&amp;nbsp;data=params,&amp;nbsp;timeout=self.timeout)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;⚠️ 抖店：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;时间戳秒级&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;app_secret&lt;/code&gt; 头尾包&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;公共参数 + 业务参数一起排&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;和拼多多很像，但 gateway / method 命名体系不同&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;六、预充值余额守卫（和拼多多同思路，但按月扣）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/balance_guard.py
class&amp;nbsp;DouyinBalanceGuard:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;redis,&amp;nbsp;client,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warn_yuan=200.0,&amp;nbsp;stop_yuan=50.0,&amp;nbsp;alarm=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r&amp;nbsp;=&amp;nbsp;redis
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.warn&amp;nbsp;=&amp;nbsp;warn_yuan
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.stop&amp;nbsp;=&amp;nbsp;stop_yuan
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.alarm&amp;nbsp;=&amp;nbsp;alarm
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;cached(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v&amp;nbsp;=&amp;nbsp;self.r.get(&amp;quot;douyin:balance&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;float(v)&amp;nbsp;if&amp;nbsp;v&amp;nbsp;else&amp;nbsp;999999.0

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;refresh(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;调开放平台账户/费用查询接口（伪代码）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;open.account.balance.query&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bal&amp;nbsp;=&amp;nbsp;float(resp[&amp;quot;data&amp;quot;][&amp;quot;balance&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r.set(&amp;quot;douyin:balance&amp;quot;,&amp;nbsp;bal,&amp;nbsp;ex=120)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;bal

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;pre_check(self,&amp;nbsp;is_paid_api=True):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;is_paid_api:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bal&amp;nbsp;=&amp;nbsp;self.cached()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;bal&amp;nbsp;&amp;lt;=&amp;nbsp;self.stop:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.alarm&amp;nbsp;and&amp;nbsp;self.alarm(f&amp;quot;抖店余额熔断:&amp;nbsp;{bal}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;CircuitOpen(&amp;quot;douyin&amp;nbsp;balance&amp;nbsp;too&amp;nbsp;low&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;bal&amp;nbsp;&amp;lt;=&amp;nbsp;self.warn:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.alarm&amp;nbsp;and&amp;nbsp;self.alarm(f&amp;quot;抖店余额预警:&amp;nbsp;{bal}&amp;quot;)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;订单推送（免费）：照常消费&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;addV2 / addSchema / 收费详情：先过 guard&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;欠费不是限流，是&lt;strong&gt;发品链路整段熄火&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;七、发品降本：把“N 次散弹”合并成“1 次收费”&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;douyin/product_publisher.py
class&amp;nbsp;ProductPublisher:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client,&amp;nbsp;guard,&amp;nbsp;bucket):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.guard&amp;nbsp;=&amp;nbsp;guard
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket&amp;nbsp;=&amp;nbsp;bucket
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;publish_batch(self,&amp;nbsp;products:&amp;nbsp;list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1)&amp;nbsp;免费前置校验
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pre&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;/product/publishPreCheck&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;products&amp;quot;:&amp;nbsp;products
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid&amp;nbsp;=&amp;nbsp;[p&amp;nbsp;for&amp;nbsp;p&amp;nbsp;in&amp;nbsp;products&amp;nbsp;if&amp;nbsp;pre_ok(pre,&amp;nbsp;p)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;valid:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2)&amp;nbsp;批量查&amp;nbsp;SPU&amp;nbsp;是否存在（摊薄）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;existing&amp;nbsp;=&amp;nbsp;self.batch_spu_query([p[&amp;quot;outer_spu_id&amp;quot;]&amp;nbsp;for&amp;nbsp;p&amp;nbsp;in&amp;nbsp;valid])

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;3)&amp;nbsp;同源商品先建&amp;nbsp;schema&amp;nbsp;草稿
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drafts&amp;nbsp;=&amp;nbsp;self.build_schema_drafts(valid)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;4)&amp;nbsp;只对新&amp;nbsp;SPU&amp;nbsp;调&amp;nbsp;addV2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;p&amp;nbsp;in&amp;nbsp;drafts:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;p[&amp;quot;spu_id&amp;quot;]&amp;nbsp;in&amp;nbsp;existing:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.guard.pre_check(is_paid_api=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket.acquire()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client.execute(&amp;quot;/product/addV2&amp;quot;,&amp;nbsp;p)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;batch_spu_query(self,&amp;nbsp;outer_ids:&amp;nbsp;list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out&amp;nbsp;=&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(0,&amp;nbsp;len(outer_ids),&amp;nbsp;50):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;chunk&amp;nbsp;=&amp;nbsp;outer_ids[i:i+50]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;/spu/query&amp;quot;,&amp;nbsp;{&amp;quot;outer_spu_ids&amp;quot;:&amp;nbsp;chunk})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.update(parse_spu(resp))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;out

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;build_schema_drafts(self,&amp;nbsp;products):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;同源（同图/同详情/不同规格）合成一个&amp;nbsp;schema
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;groups&amp;nbsp;=&amp;nbsp;group_by_template(products)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drafts&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;g&amp;nbsp;in&amp;nbsp;groups:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.guard.pre_check(is_paid_api=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket.acquire()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;/product/addSchema&amp;quot;,&amp;nbsp;g)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drafts.append(d)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;drafts&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;降本公式（经验）：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;散弹式：preCheck(0?)&amp;nbsp;+&amp;nbsp;spu查×N&amp;nbsp;+&amp;nbsp;addV2×N&amp;nbsp;+&amp;nbsp;detail×N
合并式：preCheck(1)&amp;nbsp;+&amp;nbsp;spu查(N/50)&amp;nbsp;+&amp;nbsp;addSchema(组数)&amp;nbsp;+&amp;nbsp;addV2(新SPU数)&amp;nbsp;+&amp;nbsp;listQuery(1/20)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;铺货型 ERP 通常能砍掉 &lt;strong&gt;60%~75% 收费调用&lt;/strong&gt;。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;八、订单侧：推送为主，轮询兜底&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;抖店数据推送（免费）
&amp;nbsp;&amp;nbsp;└─&amp;nbsp;订单/售后变更&amp;nbsp;→&amp;nbsp;RDS
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;ERP&amp;nbsp;读库&amp;nbsp;+&amp;nbsp;状态机

每&amp;nbsp;5~10&amp;nbsp;min：
&amp;nbsp;&amp;nbsp;/order/searchList（收费基础API）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;补漏单/晚到事件

详情：
&amp;nbsp;&amp;nbsp;/order/orderDetail
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;真相源，别拿列表写业务&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;和淘宝 DSS、京东 JMQ 同构：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;推送/消息 = 触发器，列表 = 兜底，详情 = 法官。&lt;/strong&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;九、云内部署决策（抖店比拼多多更硬）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;场景&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;建议&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;自研单店 ERP&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;云外能跑，但发品/订单量大就亏&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;铺货/店群/选品微应用&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;strong style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;必须抖店云内&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单地址/手机解密&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;云外直接无权限（和淘宝增值/拼多多增值同逻辑）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;大促&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;云内 + 推送 + 限流桶 + 余额守卫&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;架构：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;抖店云内&amp;nbsp;ECS
&amp;nbsp;├─&amp;nbsp;DyBaseClient&amp;nbsp;&amp;nbsp;&amp;nbsp;基础API（订单/商品/库存）&amp;nbsp;&amp;nbsp;令牌桶
&amp;nbsp;├─&amp;nbsp;DyAdvClient&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;增值API（解密）&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;单独AppKey&amp;nbsp;+&amp;nbsp;强制云内
&amp;nbsp;├─&amp;nbsp;PushConsumer&amp;nbsp;&amp;nbsp;&amp;nbsp;数据推送&amp;nbsp;→&amp;nbsp;RDS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;免费
&amp;nbsp;└─&amp;nbsp;Redis&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;幂等键&amp;nbsp;/&amp;nbsp;日调用计数&amp;nbsp;/&amp;nbsp;余额缓存&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;十、错误分类（抖店特有）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;现象&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;处理&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;sign invalid&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;secret/排序/时间戳&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;access_token expired&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;刷新 1 次&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;no permission / 非云内调用&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;增值 API 别云外调&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;系统错误/余额类&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;熔断 + 充值，不重试业务&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;限流&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;退避&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;网络超时&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;退避，但别当“发布失败”直接重发（会双发）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;发品审核挂起&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不是接口错，进人工/异步审核流&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;发品最阴的 bug：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;超时 → 你重试 addV2 → 同商品发两次 → 重复 SPU / 类目违规 / 被平台判铺货异常。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;解决：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;idempotency_key&amp;nbsp;=&amp;nbsp;sha1(shop_id&amp;nbsp;+&amp;nbsp;outer_spu_id&amp;nbsp;+&amp;nbsp;spec_fingerprint)
if&amp;nbsp;dedup.exists(idempotency_key):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;existing_product&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;十一、和前几篇收口&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;1688&lt;/strong&gt;：基础免费，QPS 卡脖，签名 secret 头尾&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;淘宝 TOP&lt;/strong&gt;：聚石塔内外 10 倍，DSS 推送免费&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;京东 JOS&lt;/strong&gt;：云鼎内稳，POP 时间窗滚动&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;拼多多&lt;/strong&gt;：预充值，云外 ×10，增值禁外&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;抖店&lt;/strong&gt;：预充值 + 云外 ×10 + 商品发布 2026.7.1 起收费 + 数据推送免费&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;一句话：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;抖店 2026.7.1 之前，铺货 ERP 的潜规则是“商品发布不要钱，拼命发”；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;2026.7.1 之后，规则变成“&lt;strong&gt;发一次就计费，云外发一次顶云内十次，欠费不是限流是断气&lt;/strong&gt;”。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;能活下来的抖店 ERP 不是“能发品”，而是：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;前置校验拦废单、SPU 批量查、schema 并草稿、addV2 只发新、推送替轮询、余额守卫在 Client 层&lt;/strong&gt;。&lt;/div&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 16 Oct 2026 13:47:43 +0800</pubDate></item><item><title>《拼多多订单API：pdd.order.list.get 落地方案 —— 退款/售后状态机的幂等设计》（附 Python 源码）</title><link>https://alexob.com/?id=570</link><description>&lt;h1&gt;《拼多多订单API：pdd.order.list.get 落地方案 —— 退款/售后状态机的幂等设计》（附 Python 源码）&lt;/h1&gt;&lt;div class=&quot;ybc-p&quot;&gt;先拍结论：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.order.list.get&lt;/code&gt; &lt;strong&gt;不是实时增量主接口&lt;/strong&gt;，它是“按成交时间捞历史/初始化”的接口（时间窗 ≤24h，历史 90 天）。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;实时同步要用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.order.number.list.increment.get&lt;/code&gt;，真相用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.order.information.get&lt;/code&gt;，售后用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.refund.list.increment.get&lt;/code&gt; + &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.refund.information.get&lt;/code&gt;。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多订单最坑的是：&lt;strong&gt;订单发货态（order_status）和售后态（after_sales_status / refund_status）是两条独立轴&lt;/strong&gt;，不能只存一个“状态”字段。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;正确模型：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;order_status&amp;nbsp;:&amp;nbsp;1待发货&amp;nbsp;/&amp;nbsp;2已发货待签收&amp;nbsp;/&amp;nbsp;3已签收
refund_status:&amp;nbsp;1无售后或关闭&amp;nbsp;/&amp;nbsp;2售后处理中&amp;nbsp;/&amp;nbsp;3退款中&amp;nbsp;/&amp;nbsp;4退款成功
after_sales_status:&amp;nbsp;0/2/3/4/5/6/7/8/9/10/11/...（细粒度售后单状态）
risk_control_status:&amp;nbsp;0正常&amp;nbsp;/&amp;nbsp;1审核中&lt;/pre&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;生产里“订单状态机”必须是 &lt;strong&gt;(order_status, refund_status, after_sales_status, risk_control_status, version)&lt;/strong&gt; 五维收敛，不是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;status&lt;/code&gt; 一个字段来回覆盖。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;一、pdd.order.list.get 的定位（别用错）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;时间维度&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;用途&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;生产角色&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.order.list.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;成交时间，窗 ≤24h，历史 90 天&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;历史初始化&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;新店接入/补数据&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.order.number.list.increment.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;更新时间，窗 ≤30min&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;实时增量&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;主轮询&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.order.information.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;order_sn&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单真相&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;拉子单/优惠/地址/售后态&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.refund.list.increment.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;售后更新时间，窗 ≤30min&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;售后增量&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;售后单触发器&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.refund.information.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;order_sn + after_sales_id&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;售后真相&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;退款/退货/换货处理&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;官方口径很明确：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;新用户用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;order.list.get&lt;/code&gt; 同步历史，实时用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;order.number.list.increment.get&lt;/code&gt;，消息/增量只当触发器，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;information&lt;/code&gt; 才是真相。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;二、拼多多订单/售后状态轴（必须分开建）&lt;/h2&gt;&lt;h3&gt;1. 订单发货轴 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;order_status&lt;/code&gt;&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;1&amp;nbsp;待发货
2&amp;nbsp;已发货待签收
3&amp;nbsp;已签收&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;（仅已成交订单：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;confirm_status=1&lt;/code&gt;）&lt;/div&gt;&lt;h3&gt;2. 售后粗轴 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;refund_status&lt;/code&gt;（列表接口用）&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;1&amp;nbsp;无售后或售后关闭
2&amp;nbsp;售后处理中
3&amp;nbsp;退款中
4&amp;nbsp;退款成功
5&amp;nbsp;全部&lt;/pre&gt;&lt;h3&gt;3. 售后细轴 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;after_sales_status&lt;/code&gt;（详情/售后接口用）&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;0&amp;nbsp;&amp;nbsp;无售后
2&amp;nbsp;&amp;nbsp;买家申请退款，待商家处理
3&amp;nbsp;&amp;nbsp;退货退款，待商家处理
4&amp;nbsp;&amp;nbsp;商家同意退款，退款中
5&amp;nbsp;&amp;nbsp;平台同意退款，退款中
6&amp;nbsp;&amp;nbsp;驳回退款，待买家处理
7&amp;nbsp;&amp;nbsp;已同意退货退款，待用户发货
8&amp;nbsp;&amp;nbsp;平台处理中
9&amp;nbsp;&amp;nbsp;平台拒绝退款，退款关闭
10&amp;nbsp;退款成功
11&amp;nbsp;买家撤销
12&amp;nbsp;买家逾期未处理，退款失败
13&amp;nbsp;买家逾期，超过有效期
14&amp;nbsp;换货补寄待商家处理
15&amp;nbsp;换货补寄待用户处理
16&amp;nbsp;换货补寄成功
17&amp;nbsp;换货补寄失败
18&amp;nbsp;换货补寄待用户确认完成
21&amp;nbsp;待商家同意维修
22&amp;nbsp;待用户确认发货
24&amp;nbsp;维修关闭
25&amp;nbsp;维修成功
27&amp;nbsp;待用户确认收货
31&amp;nbsp;已同意拒收退款，待用户拒收
32&amp;nbsp;补寄待商家发货
33&amp;nbsp;同意召回后退款，待商家召回&lt;/pre&gt;&lt;h3&gt;4. 风控轴&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;risk_control_status&amp;nbsp;=&amp;nbsp;1&amp;nbsp;&amp;nbsp;→&amp;nbsp;审核订单，不能发货&lt;/pre&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;发货铁律（官方）：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;order_status=1 AND refund_status=1 AND risk_control_status=0&lt;/code&gt; 才能发。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;三、幂等键设计（三层叠加）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;L1&amp;nbsp;唯一键：&amp;nbsp;&amp;nbsp;&amp;nbsp;(shop_id,&amp;nbsp;order_sn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;→&amp;nbsp;防重复插入
L2&amp;nbsp;去重表：&amp;nbsp;&amp;nbsp;&amp;nbsp;(shop_id,&amp;nbsp;order_sn,&amp;nbsp;event_key)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;→&amp;nbsp;防重复消费
L3&amp;nbsp;状态机：&amp;nbsp;&amp;nbsp;&amp;nbsp;UPDATE&amp;nbsp;...&amp;nbsp;WHERE&amp;nbsp;order_sn=?&amp;nbsp;AND&amp;nbsp;version&amp;nbsp;&amp;lt;&amp;nbsp;new_version&amp;nbsp;AND&amp;nbsp;status&amp;nbsp;合法&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;event_key&lt;/code&gt; 可以是：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;incr:{updated_at}&lt;/code&gt;（增量轮询）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;msg:{msg_id}&lt;/code&gt;（消息推送）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;refund:{after_sales_id}:{after_sales_status}:{updated_at}&lt;/code&gt;（售后事件）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;四、统一订单快照模型&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd/order_model.py
from&amp;nbsp;dataclasses&amp;nbsp;import&amp;nbsp;dataclass,&amp;nbsp;field
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Optional


@dataclass
class&amp;nbsp;PddOrderSnapshot:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id:&amp;nbsp;str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_sn:&amp;nbsp;str

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_status:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1/2/3
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refund_status:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1/2/3/4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;after_sales_status:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;细粒度
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;risk_control_status:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;0/1

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;confirm_status:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;0未成交&amp;nbsp;1已成交&amp;nbsp;2取消
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pay_amount:&amp;nbsp;float&amp;nbsp;=&amp;nbsp;0.0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updated_at:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;平台更新时间（秒）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;=&amp;nbsp;updated_at，单调推进

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;after_sales_id:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refund_amount:&amp;nbsp;float&amp;nbsp;=&amp;nbsp;0.0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw:&amp;nbsp;dict&amp;nbsp;=&amp;nbsp;field(default_factory=dict)


def&amp;nbsp;snapshot_from_list(o:&amp;nbsp;dict,&amp;nbsp;shop_id:&amp;nbsp;str)&amp;nbsp;-&amp;gt;&amp;nbsp;PddOrderSnapshot:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updated&amp;nbsp;=&amp;nbsp;int(o.get(&amp;quot;updated_at&amp;quot;)&amp;nbsp;or&amp;nbsp;o.get(&amp;quot;last_updated_time&amp;quot;)&amp;nbsp;or&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;PddOrderSnapshot(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id=shop_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_sn=o[&amp;quot;order_sn&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_status=int(o.get(&amp;quot;order_status&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refund_status=int(o.get(&amp;quot;refund_status&amp;quot;,&amp;nbsp;1)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;after_sales_status=int(o.get(&amp;quot;after_sales_status&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;risk_control_status=int(o.get(&amp;quot;risk_control_status&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;confirm_status=int(o.get(&amp;quot;confirm_status&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pay_amount=float(o.get(&amp;quot;pay_amount&amp;quot;,&amp;nbsp;0)&amp;nbsp;or&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updated_at=updated,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version=updated,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw=o,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;五、状态机：订单轴 × 售后轴 分别收敛&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd/order_state_machine.py
from&amp;nbsp;enum&amp;nbsp;import&amp;nbsp;IntEnum


class&amp;nbsp;OrderShipStatus(IntEnum):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UNKNOWN&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WAIT_SHIP&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SHIPPED&amp;nbsp;=&amp;nbsp;2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SIGNED&amp;nbsp;=&amp;nbsp;3


class&amp;nbsp;AfterSalesStatus(IntEnum):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NONE&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BUYER_APPLY_REFUND&amp;nbsp;=&amp;nbsp;2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RETURN_REFUND_PENDING&amp;nbsp;=&amp;nbsp;3
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELLER_AGREED_REFUNDING&amp;nbsp;=&amp;nbsp;4
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PLATFORM_AGREED_REFUNDING&amp;nbsp;=&amp;nbsp;5
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;REJECTED_PENDING_BUYER&amp;nbsp;=&amp;nbsp;6
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AGREED_RETURN_WAIT_BUYER_SHIP&amp;nbsp;=&amp;nbsp;7
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PLATFORM_PROCESSING&amp;nbsp;=&amp;nbsp;8
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;REFUND_CLOSED&amp;nbsp;=&amp;nbsp;9
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;REFUND_SUCCESS&amp;nbsp;=&amp;nbsp;10
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BUYER_CANCELED&amp;nbsp;=&amp;nbsp;11
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCHANGE_PENDING_SELLER&amp;nbsp;=&amp;nbsp;14
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCHANGE_PENDING_BUYER&amp;nbsp;=&amp;nbsp;15
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EXCHANGE_SUCCESS&amp;nbsp;=&amp;nbsp;16
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;REPAIR_PENDING_SELLER&amp;nbsp;=&amp;nbsp;21
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;REPAIR_SUCCESS&amp;nbsp;=&amp;nbsp;25


#&amp;nbsp;订单发货态：只允许前进，不允许被旧事件覆盖
ORDER_ALLOWED&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OrderShipStatus.WAIT_SHIP:&amp;nbsp;{OrderShipStatus.SHIPPED},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OrderShipStatus.SHIPPED:&amp;nbsp;{OrderShipStatus.SIGNED},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OrderShipStatus.SIGNED:&amp;nbsp;set(),
}

#&amp;nbsp;售后态：可以“升级/关闭/成功”，但不能从&amp;nbsp;退款成功&amp;nbsp;退回&amp;nbsp;待处理
AFTERSALES_BLOCKED_FROM&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AfterSalesStatus.REFUND_SUCCESS:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AfterSalesStatus.BUYER_APPLY_REFUND,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AfterSalesStatus.RETURN_REFUND_PENDING,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AfterSalesStatus.SELLER_AGREED_REFUNDING,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AfterSalesStatus.REFUND_CLOSED:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AfterSalesStatus.SELLER_AGREED_REFUNDING,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AfterSalesStatus.PLATFORM_AGREED_REFUNDING,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
}


class&amp;nbsp;IllegalTransition(Exception):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass


def&amp;nbsp;check_order_transition(cur:&amp;nbsp;int,&amp;nbsp;new:&amp;nbsp;int):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur_s&amp;nbsp;=&amp;nbsp;OrderShipStatus(cur)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_s&amp;nbsp;=&amp;nbsp;OrderShipStatus(new)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;new_s&amp;nbsp;==&amp;nbsp;cur_s:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;new_s&amp;nbsp;not&amp;nbsp;in&amp;nbsp;ORDER_ALLOWED.get(cur_s,&amp;nbsp;set()):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;IllegalTransition(f&amp;quot;order&amp;nbsp;{cur}&amp;nbsp;-&amp;gt;&amp;nbsp;{new}&amp;nbsp;not&amp;nbsp;allowed&amp;quot;)
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex

def&amp;nbsp;check_aftersales_transition(cur:&amp;nbsp;int,&amp;nbsp;new:&amp;nbsp;int):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_s&amp;nbsp;=&amp;nbsp;AfterSalesStatus(new)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;new_s&amp;nbsp;==&amp;nbsp;AfterSalesStatus(cur):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blocked&amp;nbsp;=&amp;nbsp;AFTERSALES_BLOCKED_FROM.get(AfterSalesStatus(cur),&amp;nbsp;set())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;new_s&amp;nbsp;in&amp;nbsp;blocked:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;IllegalTransition(f&amp;quot;after_sales&amp;nbsp;{cur}&amp;nbsp;-&amp;gt;&amp;nbsp;{new}&amp;nbsp;rollback&amp;nbsp;blocked&amp;quot;)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;六、幂等落库（SQL 层兜底）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;pdd_order&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VARCHAR(32)&amp;nbsp;&amp;nbsp;NOT&amp;nbsp;NULL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_sn&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VARCHAR(64)&amp;nbsp;&amp;nbsp;NOT&amp;nbsp;NULL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_status&amp;nbsp;&amp;nbsp;&amp;nbsp;SMALLINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refund_status&amp;nbsp;&amp;nbsp;SMALLINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;after_sales_status&amp;nbsp;SMALLINT&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;risk_control_status&amp;nbsp;SMALLINT&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;confirm_status&amp;nbsp;SMALLINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pay_amount&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DECIMAL(12,2)&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIGINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updated_at&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BIGINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOT&amp;nbsp;NULL&amp;nbsp;DEFAULT&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;(shop_id,&amp;nbsp;order_sn)
);

CREATE&amp;nbsp;TABLE&amp;nbsp;pdd_order_event_dedup&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VARCHAR(32)&amp;nbsp;NOT&amp;nbsp;NULL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_sn&amp;nbsp;&amp;nbsp;&amp;nbsp;VARCHAR(64)&amp;nbsp;NOT&amp;nbsp;NULL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event_key&amp;nbsp;&amp;nbsp;VARCHAR(128)&amp;nbsp;NOT&amp;nbsp;NULL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;created_at&amp;nbsp;BIGINT&amp;nbsp;NOT&amp;nbsp;NULL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;(shop_id,&amp;nbsp;order_sn,&amp;nbsp;event_key)
);&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;更新语句（防乱序核心）：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;UPDATE&amp;nbsp;pdd_order
SET
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_status&amp;nbsp;=&amp;nbsp;#{new_order_status},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refund_status&amp;nbsp;=&amp;nbsp;#{new_refund_status},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;after_sales_status&amp;nbsp;=&amp;nbsp;#{new_after_sales},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;risk_control_status&amp;nbsp;=&amp;nbsp;#{new_risk},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pay_amount&amp;nbsp;=&amp;nbsp;#{pay_amount},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version&amp;nbsp;=&amp;nbsp;#{new_version},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updated_at&amp;nbsp;=&amp;nbsp;#{new_updated_at}
WHERE&amp;nbsp;shop_id&amp;nbsp;=&amp;nbsp;#{shop_id}
&amp;nbsp;&amp;nbsp;AND&amp;nbsp;order_sn&amp;nbsp;=&amp;nbsp;#{order_sn}
&amp;nbsp;&amp;nbsp;AND&amp;nbsp;version&amp;nbsp;&amp;lt;&amp;nbsp;#{new_version};&lt;/pre&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;version &amp;lt; new_version&lt;/code&gt; 一行搞定：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;旧消息晚到 → 0 行&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;同版本重复 → 0 行&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;新状态推进 → 1 行&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;七、Python：增量同步 + 幂等消费&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd/order_sync.py
import&amp;nbsp;time


class&amp;nbsp;PddOrderSync:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client,&amp;nbsp;repo,&amp;nbsp;dedup,&amp;nbsp;bucket):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.repo&amp;nbsp;=&amp;nbsp;repo
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.dedup&amp;nbsp;=&amp;nbsp;dedup
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket&amp;nbsp;=&amp;nbsp;bucket

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;poll_increment(self,&amp;nbsp;start_sec:&amp;nbsp;int,&amp;nbsp;end_sec:&amp;nbsp;int):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket.acquire()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;pdd.order.number.list.increment.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;start_updated_at&amp;quot;:&amp;nbsp;start_sec,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;end_updated_at&amp;quot;:&amp;nbsp;end_sec,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;100,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;orders&amp;nbsp;=&amp;nbsp;self._extract(resp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;orders:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;o&amp;nbsp;in&amp;nbsp;orders:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.ingest(o)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(orders)&amp;nbsp;&amp;lt;&amp;nbsp;100:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;+=&amp;nbsp;1

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;ingest(self,&amp;nbsp;o:&amp;nbsp;dict):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id&amp;nbsp;=&amp;nbsp;o[&amp;quot;shop_id&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_sn&amp;nbsp;=&amp;nbsp;o[&amp;quot;order_sn&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updated&amp;nbsp;=&amp;nbsp;int(o.get(&amp;quot;updated_at&amp;quot;)&amp;nbsp;or&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;event_key&amp;nbsp;=&amp;nbsp;f&amp;quot;incr:{updated}&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;L2&amp;nbsp;去重
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;self.dedup.mark(shop_id,&amp;nbsp;order_sn,&amp;nbsp;event_key):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;列表字段不全&amp;nbsp;→&amp;nbsp;拉详情
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;detail&amp;nbsp;=&amp;nbsp;self.fetch_detail(order_sn)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snap&amp;nbsp;=&amp;nbsp;snapshot_from_list(detail&amp;nbsp;if&amp;nbsp;detail&amp;nbsp;else&amp;nbsp;o,&amp;nbsp;shop_id)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.apply_snapshot(snap)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;fetch_detail(self,&amp;nbsp;order_sn:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;pdd.order.information.get&amp;quot;,&amp;nbsp;{&amp;quot;order_sn&amp;quot;:&amp;nbsp;order_sn})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(resp.get(&amp;quot;order_info_get_response&amp;quot;)&amp;nbsp;or&amp;nbsp;{}).get(&amp;quot;order_info&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;RetriableError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;下次增量/兜底再补
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;apply_snapshot(self,&amp;nbsp;snap:&amp;nbsp;PddOrderSnapshot):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur&amp;nbsp;=&amp;nbsp;self.repo.get(shap=snap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;cur&amp;nbsp;is&amp;nbsp;None:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.repo.insert(snap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.emit_order_events(None,&amp;nbsp;snap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;snap.version&amp;nbsp;&amp;lt;&amp;nbsp;cur.version:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;nbsp;#&amp;nbsp;旧事件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;snap.version&amp;nbsp;==&amp;nbsp;cur.version&amp;nbsp;and&amp;nbsp;snap.order_status&amp;nbsp;==&amp;nbsp;cur.order_status&amp;nbsp;\
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;and&amp;nbsp;snap.after_sales_status&amp;nbsp;==&amp;nbsp;cur.after_sales_status:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;nbsp;#&amp;nbsp;完全幂等

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;状态机校验
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;check_order_transition(cur.order_status,&amp;nbsp;snap.order_status)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;check_aftersales_transition(cur.after_sales_status,&amp;nbsp;snap.after_sales_status)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;IllegalTransition&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.repo.append_suspect(cur,&amp;nbsp;snap,&amp;nbsp;str(e))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rows&amp;nbsp;=&amp;nbsp;self.repo.update_if_newer(snap)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;rows&amp;nbsp;==&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.emit_order_events(cur,&amp;nbsp;snap)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;八、售后单独立建模（别塞进订单表覆盖）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;@dataclass
class&amp;nbsp;PddAfterSale:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_id:&amp;nbsp;str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_sn:&amp;nbsp;str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;after_sales_id:&amp;nbsp;str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;after_sales_status:&amp;nbsp;int
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;after_sales_type:&amp;nbsp;int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2仅退款&amp;nbsp;3退货退款&amp;nbsp;4换货&amp;nbsp;5补寄&amp;nbsp;6维修
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;refund_amount:&amp;nbsp;float
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;int
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw:&amp;nbsp;dict&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;售后增量：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;sync_refund(shop_id,&amp;nbsp;start_sec,&amp;nbsp;end_sec):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;client.execute(&amp;quot;pdd.refund.list.increment.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;start_updated_at&amp;quot;:&amp;nbsp;start_sec,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;end_updated_at&amp;quot;:&amp;nbsp;end_sec,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;after_sales_status&amp;quot;:&amp;nbsp;0,&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;0=全部
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;100,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;r&amp;nbsp;in&amp;nbsp;extract_refunds(resp):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;dedup.mark(shop_id,&amp;nbsp;r[&amp;quot;order_sn&amp;quot;],&amp;nbsp;f&amp;quot;rf:{r[&amp;#39;after_sales_id&amp;#39;]}:{r[&amp;#39;after_sales_status&amp;#39;]}:{r[&amp;#39;updated_at&amp;#39;]}&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;detail&amp;nbsp;=&amp;nbsp;client.execute(&amp;quot;pdd.refund.information.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_sn&amp;quot;:&amp;nbsp;r[&amp;quot;order_sn&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;after_sales_id&amp;quot;:&amp;nbsp;r[&amp;quot;after_sales_id&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apply_aftersale(detail)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;订单上的 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;after_sales_status&lt;/code&gt; 只是“最新一条售后单的投影”，&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;真实仲裁看 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd_after_sale&lt;/code&gt; 表&lt;/strong&gt;。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;九、业务动作守卫（最值钱的部分）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;can_ship(snap:&amp;nbsp;PddOrderSnapshot)&amp;nbsp;-&amp;gt;&amp;nbsp;(bool,&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;snap.confirm_status&amp;nbsp;!=&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False,&amp;nbsp;&amp;quot;not_confirmed&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;snap.order_status&amp;nbsp;!=&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False,&amp;nbsp;&amp;quot;not_wait_ship&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;snap.risk_control_status&amp;nbsp;==&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False,&amp;nbsp;&amp;quot;risk_review&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;snap.refund_status&amp;nbsp;in&amp;nbsp;(2,&amp;nbsp;3):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False,&amp;nbsp;&amp;quot;refund_in_process&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;snap.after_sales_status&amp;nbsp;in&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4,&amp;nbsp;5,&amp;nbsp;7,&amp;nbsp;8,&amp;nbsp;14,&amp;nbsp;15,&amp;nbsp;21,&amp;nbsp;31,&amp;nbsp;33
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False,&amp;nbsp;&amp;quot;after_sale_open&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;True,&amp;nbsp;&amp;quot;ok&amp;quot;&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;调用发货前：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;ok,&amp;nbsp;reason&amp;nbsp;=&amp;nbsp;can_ship(snap)
if&amp;nbsp;not&amp;nbsp;ok:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;freeze_and_alert(snap.order_sn,&amp;nbsp;reason)
else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do_ship(snap)&lt;/pre&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;这就是前面说的：“货发出去了，用户申请退款”的坑。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多买家仅退款很早就能发起，ERP 不冻结 = 资损。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;十、消息推送 + 轮询 双通道（和淘宝/京东同构）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;消息推送
&amp;nbsp;&amp;nbsp;└─&amp;nbsp;快返回&amp;nbsp;success（2~5s&amp;nbsp;内）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;入&amp;nbsp;MQ
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;nbsp;pdd.order.information.get&amp;nbsp;拉真相

pdd.order.number.list.increment.get（30min&amp;nbsp;窗，每&amp;nbsp;60s）
&amp;nbsp;&amp;nbsp;└─&amp;nbsp;兜底漏推送/超时

pdd.refund.list.increment.get（30min&amp;nbsp;窗）
&amp;nbsp;&amp;nbsp;└─&amp;nbsp;售后单独立推进

三者都写：
&amp;nbsp;&amp;nbsp;pdd_order(order_sn&amp;nbsp;主键)
&amp;nbsp;&amp;nbsp;pdd_after_sale(after_sales_id&amp;nbsp;主键)
&amp;nbsp;&amp;nbsp;pdd_order_event_dedup(event_key&amp;nbsp;主键)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;十一、时间窗与限流&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;order.list.get&lt;/code&gt;：成交时间窗 ≤ 24h，历史 90 天，别做实时主源&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;number.list.increment.get&lt;/code&gt;：更新时间窗 ≤ 30min，实时主源&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;refund.list.increment.get&lt;/code&gt;：更新时间窗 ≤ 30min&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;列表 QPS / 详情 QPS / 售后 QPS 分桶&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;预充值余额守卫（上篇）必须套在这里：欠费不是 429，是订单同步直接断气&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十二、落地检查表&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;[ ] &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;order.list.get&lt;/code&gt; 只用于初始化/补历史，不用于实时&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 实时用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;order.number.list.increment.get&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 订单轴 / 售后轴 / 风控轴 三轴分开存&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;(shop_id, order_sn)&lt;/code&gt; 唯一键 + &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;(order_sn, event_key)&lt;/code&gt; 去重表 + &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;version&amp;lt;new_version&lt;/code&gt; 状态机&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 售后单独立表，订单表只存“最新售后投影”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 发货前 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;order_status=1 &amp;amp; refund_status=1 &amp;amp; risk_control_status=0 &amp;amp; 无未结售后&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 消息 2~5s 返回 success，业务异步跑&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 旧事件晚到 → 0 行更新；同版本重发 → 0 行更新&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 退款成功/售后关闭不允许回退到“待处理”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 余额守卫在 Client 层，不在业务层事后发现&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十三、一句话收口&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;淘宝订单难在“消息+增量+详情”三角，&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东难在“时间窗+鼎内+POP/FBP 分域”，&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多订单难在：&lt;strong&gt;一个订单号下面，发货态、售后态、风控态、成交态是四根平行轴&lt;/strong&gt;。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;你用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;status&lt;/code&gt; 一个字段存拼多多订单，迟早会把“已发货 + 退款成功 + 换货中”存成“已发货”。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;正确做法：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;列表做触发器，详情做真相，售后单独立建模，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;version&lt;/code&gt; 做时间仲裁，状态机做乱序防火墙。&lt;/strong&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 15 Oct 2026 13:36:51 +0800</pubDate></item><item><title>《拼多多商品API：pdd.goods.detail.get 与 pdd.goods.cats.get 的类目与规格踩坑》（附 Python 源码）</title><link>https://alexob.com/?id=569</link><description>&lt;h1&gt;《拼多多商品API：pdd.goods.detail.get 与 pdd.goods.cats.get 的类目与规格踩坑》（附 Python 源码）&lt;/h1&gt;&lt;div class=&quot;ybc-p&quot;&gt;先拍结论：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多商品模型里最坑的不是“拿不到数据”，而是&lt;strong&gt;类目有两套、规格是组合爆炸、cat_id 不能直接当发布类目、spec 不是 SKU&lt;/strong&gt;。&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.cats.get&lt;/code&gt;：标准类目树（全平台类目字典），不是“当前店铺能发什么”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.authorization.cats&lt;/code&gt;：店铺可发布类目（受经营范围限制）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.detail.get&lt;/code&gt;：商品视图，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_id / cat_ids&lt;/code&gt; 是归属类目，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sku_list / goods_specs&lt;/code&gt; 才是可售单元&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;拼多多的“规格”是 &lt;strong&gt;维度(spec_key) × 值(spec_value) → SKU 组合&lt;/strong&gt;，直接平铺就会下错“红色 / M”&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;一、两个接口的职责边界&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;视角&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;主要用途&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;常见误用&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.goods.cats.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;平台标准类目树&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;类目 ID ↔ 名称、层级、父子关系&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;拿它当“本店可发类目”&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.goods.authorization.cats&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商家可发布类目&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;发布商品时选类目&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;忘了循环下钻到叶子&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.goods.detail.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;单个商品详情&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;标题/价格/图/类目/规格/SKU&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;以为 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;specs&lt;/code&gt; 就是可售 SKU&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;官方商品发布说明里写得很清楚：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;标准类目用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.cats.get&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;商家可发类目用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.authorization.cats&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;要发商品必须循环下钻到&lt;strong&gt;最子集（叶子）类目&lt;/strong&gt;，拼多多商品必须有三级或四级分类&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;二、类目踩坑 1：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_id&lt;/code&gt; ≠ 可发布类目&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.detail.get&lt;/code&gt; 返回：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;cat_id&amp;quot;:&amp;nbsp;12345,
&amp;nbsp;&amp;nbsp;&amp;quot;cat_ids&amp;quot;:&amp;nbsp;[100,&amp;nbsp;200,&amp;nbsp;12345]
}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;含义：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_id&lt;/code&gt;：商品当前归属类目（可能是三级/四级）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_ids&lt;/code&gt;：一级 → 二级 → 三级 → 四级 路径&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;但：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;店铺能不能发这个类目，要看 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.authorization.cats&lt;/code&gt;。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;不在店铺经营范围 → 用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_id&lt;/code&gt; 调 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.add&lt;/code&gt; 直接报：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;“当前商品分类不在店铺经营范围内”&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ 正确动作：&lt;/div&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;authorization.cats(parent_cat_id=0)&lt;/code&gt; 拿一级可发类目&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;逐级下钻到叶子&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;再用叶子 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_id&lt;/code&gt; 发商品&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;goods.cats.get&lt;/code&gt; 只做“类目 ID → 名称 / 路径展示 / 跨平台映射”&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;三、类目踩坑 2：类目会到四级，不是淘宝三级就完事&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.cats.get&lt;/code&gt; 返回结构：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;goods_cats_get_response&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_cats_list&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cat_id&amp;quot;:&amp;nbsp;239,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cat_name&amp;quot;:&amp;nbsp;&amp;quot;男装&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;level&amp;quot;:&amp;nbsp;1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;parent_cat_id&amp;quot;:&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cat_id&amp;quot;:&amp;nbsp;242,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cat_name&amp;quot;:&amp;nbsp;&amp;quot;T恤&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;level&amp;quot;:&amp;nbsp;3,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;parent_cat_id&amp;quot;:&amp;nbsp;241
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;level=1&lt;/code&gt; 一级，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;level=2&lt;/code&gt; 二级，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;level=3&lt;/code&gt; 三级，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;level=4&lt;/code&gt; 四级&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;有些类目三级是叶子，有些要四级&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;发布必须用叶子&lt;/strong&gt;；用父级 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_id&lt;/code&gt; 发商品 → 审核挂起/类目校验失败&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;四、规格踩坑 3：specs 不是 SKU，是“维度值清单”&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多常见返回（简化）：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;goods_specs&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;spec_key&amp;quot;:&amp;nbsp;&amp;quot;颜色&amp;quot;,&amp;nbsp;&amp;quot;spec_value&amp;quot;:&amp;nbsp;&amp;quot;红色&amp;quot;,&amp;nbsp;&amp;quot;spec_id&amp;quot;:&amp;nbsp;1},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;spec_key&amp;quot;:&amp;nbsp;&amp;quot;颜色&amp;quot;,&amp;nbsp;&amp;quot;spec_value&amp;quot;:&amp;nbsp;&amp;quot;蓝色&amp;quot;,&amp;nbsp;&amp;quot;spec_id&amp;quot;:&amp;nbsp;2},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;spec_key&amp;quot;:&amp;nbsp;&amp;quot;尺码&amp;quot;,&amp;nbsp;&amp;quot;spec_value&amp;quot;:&amp;nbsp;&amp;quot;M&amp;quot;,&amp;nbsp;&amp;quot;spec_id&amp;quot;:&amp;nbsp;3},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;spec_key&amp;quot;:&amp;nbsp;&amp;quot;尺码&amp;quot;,&amp;nbsp;&amp;quot;spec_value&amp;quot;:&amp;nbsp;&amp;quot;L&amp;quot;,&amp;nbsp;&amp;quot;spec_id&amp;quot;:&amp;nbsp;4}
&amp;nbsp;&amp;nbsp;],
&amp;nbsp;&amp;nbsp;&amp;quot;sku_list&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;sku_id&amp;quot;:&amp;nbsp;&amp;quot;111&amp;quot;,&amp;nbsp;&amp;quot;specs&amp;quot;:&amp;nbsp;[1,&amp;nbsp;3],&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;3900,&amp;nbsp;&amp;quot;quantity&amp;quot;:&amp;nbsp;10},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;sku_id&amp;quot;:&amp;nbsp;&amp;quot;112&amp;quot;,&amp;nbsp;&amp;quot;specs&amp;quot;:&amp;nbsp;[1,&amp;nbsp;4],&amp;nbsp;&amp;quot;specs_info&amp;quot;:&amp;nbsp;[{&amp;quot;key&amp;quot;:&amp;quot;颜色&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;红色&amp;quot;},{&amp;quot;key&amp;quot;:&amp;quot;尺码&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;L&amp;quot;}],&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;4100,&amp;nbsp;&amp;quot;quantity&amp;quot;:&amp;nbsp;8},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;sku_id&amp;quot;:&amp;nbsp;&amp;quot;113&amp;quot;,&amp;nbsp;&amp;quot;specs&amp;quot;:&amp;nbsp;[2,&amp;nbsp;3],&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;3900,&amp;nbsp;&amp;quot;quantity&amp;quot;:&amp;nbsp;5}
&amp;nbsp;&amp;nbsp;]
}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;❌ 错误模型：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;options&amp;nbsp;=&amp;nbsp;[&amp;quot;红色&amp;quot;,&amp;nbsp;&amp;quot;蓝色&amp;quot;,&amp;nbsp;&amp;quot;M&amp;quot;,&amp;nbsp;&amp;quot;L&amp;quot;]&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;用户选规格时下成&amp;nbsp;红色&amp;nbsp;+&amp;nbsp;M&amp;nbsp;两个标签&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;✅ 正确模型：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;goods_specs&lt;/code&gt;：规格维度值池&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sku_list[].specs&lt;/code&gt;：该 SKU 引用的 spec_id 组合&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;真正下单/库存/价格单位是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sku_id&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;五、Python：类目树加载器&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd/category_tree.py
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Optional


class&amp;nbsp;PddCategoryTree:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.cache&amp;nbsp;=&amp;nbsp;{}&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;cat_id&amp;nbsp;-&amp;gt;&amp;nbsp;node
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;load_children(self,&amp;nbsp;parent_cat_id:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;0):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;pdd.goods.cats.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;parent_cat_id&amp;quot;:&amp;nbsp;parent_cat_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nodes&amp;nbsp;=&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.get(&amp;quot;goods_cats_get_response&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.get(&amp;quot;goods_cats_list&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;n&amp;nbsp;in&amp;nbsp;nodes:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.cache[n[&amp;quot;cat_id&amp;quot;]]&amp;nbsp;=&amp;nbsp;n
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;nodes

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;load_full_path(self,&amp;nbsp;cat_ids:&amp;nbsp;list[int]):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;cat_ids=[100,200,12345]&amp;nbsp;-&amp;gt;&amp;nbsp;名称路径&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[self.cat_name(cid)&amp;nbsp;for&amp;nbsp;cid&amp;nbsp;in&amp;nbsp;cat_ids]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;cat_name(self,&amp;nbsp;cat_id:&amp;nbsp;int)&amp;nbsp;-&amp;gt;&amp;nbsp;Optional[str]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;cat_id&amp;nbsp;in&amp;nbsp;self.cache:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.cache[cat_id][&amp;quot;cat_name&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;没缓存就查一次
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;children&amp;nbsp;=&amp;nbsp;self.load_children(0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.cache.get(cat_id,&amp;nbsp;{}).get(&amp;quot;cat_name&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;is_leaf(self,&amp;nbsp;cat_id:&amp;nbsp;int)&amp;nbsp;-&amp;gt;&amp;nbsp;bool:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;children&amp;nbsp;=&amp;nbsp;self.load_children(cat_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;len(children)&amp;nbsp;==&amp;nbsp;0&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;店铺可发类目（发布用）：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;shop_publishable_leaf_cats(client):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;leaves&amp;nbsp;=&amp;nbsp;[]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;dfs(parent):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nodes&amp;nbsp;=&amp;nbsp;client.execute(&amp;quot;pdd.goods.authorization.cats&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;parent_cat_id&amp;quot;:&amp;nbsp;parent
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}).get(&amp;quot;goods_auth_cats_get_response&amp;quot;,&amp;nbsp;{}).get(&amp;quot;goods_cats_list&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;nodes:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;leaves.append(parent)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;n&amp;nbsp;in&amp;nbsp;nodes:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dfs(n[&amp;quot;cat_id&amp;quot;])

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dfs(0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;leaves&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;六、Python：规格 → SKU 组合解析&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd/spec_resolver.py
from&amp;nbsp;dataclasses&amp;nbsp;import&amp;nbsp;dataclass
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;List,&amp;nbsp;Dict


@dataclass
class&amp;nbsp;ResolvedSku:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_id:&amp;nbsp;str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spec_combo:&amp;nbsp;Dict[str,&amp;nbsp;str]&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;{&amp;quot;颜色&amp;quot;:&amp;nbsp;&amp;quot;红色&amp;quot;,&amp;nbsp;&amp;quot;尺码&amp;quot;:&amp;nbsp;&amp;quot;M&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_yuan:&amp;nbsp;float
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock:&amp;nbsp;int


def&amp;nbsp;build_spec_index(goods_specs:&amp;nbsp;list)&amp;nbsp;-&amp;gt;&amp;nbsp;Dict[int,&amp;nbsp;dict]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spec_id&amp;nbsp;-&amp;gt;&amp;nbsp;{key,&amp;nbsp;value}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;idx&amp;nbsp;=&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;s&amp;nbsp;in&amp;nbsp;goods_specs&amp;nbsp;or&amp;nbsp;[]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;idx[s[&amp;quot;spec_id&amp;quot;]]&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;s.get(&amp;quot;spec_key&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;value&amp;quot;:&amp;nbsp;s.get(&amp;quot;spec_value&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;idx
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex

def&amp;nbsp;resolve_skus(goods_detail:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;List[ResolvedSku]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;specs&amp;nbsp;=&amp;nbsp;goods_detail.get(&amp;quot;goods_specs&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spec_idx&amp;nbsp;=&amp;nbsp;build_spec_index(specs)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;sku&amp;nbsp;in&amp;nbsp;goods_detail.get(&amp;quot;sku_list&amp;quot;,&amp;nbsp;[]):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;combo&amp;nbsp;=&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;sid&amp;nbsp;in&amp;nbsp;sku.get(&amp;quot;specs&amp;quot;,&amp;nbsp;[]):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;meta&amp;nbsp;=&amp;nbsp;spec_idx.get(sid)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;meta:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;combo[meta[&amp;quot;key&amp;quot;]]&amp;nbsp;=&amp;nbsp;meta[&amp;quot;value&amp;quot;]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;拼多多价格单位：分
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_fen&amp;nbsp;=&amp;nbsp;sku.get(&amp;quot;price&amp;quot;)&amp;nbsp;or&amp;nbsp;sku.get(&amp;quot;sku_price&amp;quot;)&amp;nbsp;or&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock&amp;nbsp;=&amp;nbsp;sku.get(&amp;quot;quantity&amp;quot;)&amp;nbsp;or&amp;nbsp;sku.get(&amp;quot;sku_quantity&amp;quot;)&amp;nbsp;or&amp;nbsp;0

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.append(ResolvedSku(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_id=str(sku[&amp;quot;sku_id&amp;quot;]),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spec_combo=combo,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_yuan=price_fen&amp;nbsp;/&amp;nbsp;100.0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock=int(stock),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;out&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;消费侧：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;skus&amp;nbsp;=&amp;nbsp;resolve_skus(detail)
for&amp;nbsp;s&amp;nbsp;in&amp;nbsp;skus:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(s.sku_id,&amp;nbsp;s.spec_combo,&amp;nbsp;s.price_yuan,&amp;nbsp;s.stock)
#&amp;nbsp;111&amp;nbsp;{&amp;#39;颜色&amp;#39;:&amp;nbsp;&amp;#39;红色&amp;#39;,&amp;nbsp;&amp;#39;尺码&amp;#39;:&amp;nbsp;&amp;#39;M&amp;#39;}&amp;nbsp;39.0&amp;nbsp;10&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;⚠️ 有的接口返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sku_list[].specs_info=[{&amp;quot;key&amp;quot;:&amp;quot;颜色&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;红色&amp;quot;}]&lt;/code&gt;，&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;有的只给 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;specs=[spec_id,...]&lt;/code&gt;。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;生产里两个都兼容，别只信一种。&lt;/strong&gt;&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;七、跨平台规格归一（接前几篇）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;平台&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;规格模型&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;可售主键&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;1688&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skuInfo&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skuArray&lt;/code&gt;，属性对&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;offerId + skuId&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skus.sku.properties_name&lt;/code&gt; = &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pid:vid:名:值&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;num_iid + sku_id&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skuList[].specText&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skuId + skuList.skuId&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;拼多多&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;goods_specs&lt;/code&gt; 维度值 + &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;sku_list.specs&lt;/code&gt; 引用&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;goods_id + sku_id&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;统一模型：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;platform&amp;quot;:&amp;nbsp;&amp;quot;pdd&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;spu_id&amp;quot;:&amp;nbsp;goods_id,
&amp;nbsp;&amp;nbsp;&amp;quot;sku_id&amp;quot;:&amp;nbsp;sku_id,
&amp;nbsp;&amp;nbsp;&amp;quot;attrs&amp;quot;:&amp;nbsp;{&amp;quot;颜色&amp;quot;:&amp;nbsp;&amp;quot;红色&amp;quot;,&amp;nbsp;&amp;quot;尺码&amp;quot;:&amp;nbsp;&amp;quot;M&amp;quot;},
&amp;nbsp;&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;39.00,
&amp;nbsp;&amp;nbsp;&amp;quot;currency&amp;quot;:&amp;nbsp;&amp;quot;CNY&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;stock&amp;quot;:&amp;nbsp;10,
&amp;nbsp;&amp;nbsp;&amp;quot;stock_trusted&amp;quot;:&amp;nbsp;True,
}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;跨平台别用“颜色/尺码”硬字段&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;attrs: dict&lt;/code&gt; + &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sku_fingerprint = sha1(json(sorted(attrs)))&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;八、类目映射踩坑：用 cat_id 跨平台直连会翻车&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;淘宝 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cid3=50012029&lt;/code&gt; ≠ 京东 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cid3=123&lt;/code&gt; ≠ 拼多多 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_id=12345&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;三者没有全局主键。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;正确做法：&lt;/div&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;各平台拉类目树&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;建 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;platform_cat_id ↔ 标准类目词（女装/T恤/3C）&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;用“类目路径文本 + 属性词”做向量/规则匹配&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;低置信度 → 人工审&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;pdd_cat_path(client,&amp;nbsp;cat_ids):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tree&amp;nbsp;=&amp;nbsp;PddCategoryTree(client)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;&amp;nbsp;&amp;gt;&amp;nbsp;&amp;quot;.join(tree.cat_name(c)&amp;nbsp;for&amp;nbsp;c&amp;nbsp;in&amp;nbsp;cat_ids)
#&amp;nbsp;&amp;quot;男装&amp;nbsp;&amp;gt;&amp;nbsp;T恤&amp;nbsp;&amp;gt;&amp;nbsp;短袖T恤&amp;quot;&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;九、发布商品时的类目/规格顺序（很重要）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;1.&amp;nbsp;authorization.cats&amp;nbsp;下钻到叶子&amp;nbsp;cat_id
2.&amp;nbsp;goods.cat.rule.get&amp;nbsp;拿类目必填属性
3.&amp;nbsp;goods.spec.get&amp;nbsp;/&amp;nbsp;goods.spec.id.get&amp;nbsp;建规格维度
4.&amp;nbsp;组装&amp;nbsp;sku_list：spec&amp;nbsp;组合&amp;nbsp;→&amp;nbsp;价格&amp;nbsp;→&amp;nbsp;库存
5.&amp;nbsp;goods.img.upload&amp;nbsp;传图
6.&amp;nbsp;goods.add&amp;nbsp;/&amp;nbsp;goods.edit.goods.commit
7.&amp;nbsp;goods.commit.status.get&amp;nbsp;查审核&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;最常见失败：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;用标准类目 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cats.get&lt;/code&gt; 的 id 直接发 → 不在经营范围&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;用父级类目发 → 类目校验失败&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;只传 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;specs&lt;/code&gt; 不传 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sku_list&lt;/code&gt; → 没可售单元&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;把“颜色:红”和“尺码:M”当两个 SKU → 下单串规格&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十、字段缺失清单（拼多多特有）&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_ids&lt;/code&gt; 可能空 → 用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;cat_id&lt;/code&gt; 反查，但别信它完整&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;goods_desc&lt;/code&gt; 可能带 HTML / 被审核截断&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;min_group_price / min_normal_price&lt;/code&gt; 单位是&lt;strong&gt;分&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sku_list&lt;/code&gt; 可能空（仅 SPU 无 SKU 的商品）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;多多进宝接口 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.ddk.goods.detail&lt;/code&gt; 返回结构和商家接口不同，别混 parser&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;goods_sign&lt;/code&gt; 是加密商品标识，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;goods_id&lt;/code&gt; 在某些场景会被引导用 goods_sign 替代&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十一、和前几篇收口&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;1688&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;offerId+skuId&lt;/code&gt;，批发视角，库存快照不可信&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;淘宝&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;item.get&lt;/code&gt; 公开 / &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;item.seller.get&lt;/code&gt; 私有，SKU 是 properties_name&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;京东&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.item.read.get&lt;/code&gt; 是 SPU+skuList+priceInfo+stockInfo&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;拼多多&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;goods_specs&lt;/code&gt; 是维度值池，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sku_list.specs&lt;/code&gt; 才是组合，类目有“标准类目 / 可发类目”两套&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;一句话：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;淘宝把 SKU 藏在 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;properties_name&lt;/code&gt; 里，京东把 SKU 放在 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;skuList.specText&lt;/code&gt; 里，&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多把 SKU &lt;strong&gt;拆成 spec 维度再让你自己笛卡尔&lt;/strong&gt;——&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;谁直接把 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;颜色:红, 尺码:M&lt;/code&gt; 当两个下拉项，谁就会把“红色M”卖成“红色 + M”。&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;下一篇可以写：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;《拼多多 × 淘宝 × 京东 × 1688 SKU 指纹统一：spec_dict → sha1 → erp_sku_id 的跨平台商品主数据模型》&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;要我直接写吗？&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 15 Oct 2026 13:19:13 +0800</pubDate></item><item><title>《拼多多开放平台API：落地方案、接口边界与业务踩坑 —— 预充值模式的成本陷阱》（附 Python 源码）</title><link>https://alexob.com/?id=568</link><description>&lt;h1&gt;《拼多多开放平台API：落地方案、接口边界与业务踩坑 —— 预充值模式的成本陷阱》（附 Python 源码）&lt;/h1&gt;&lt;h2&gt;一、先拍结论&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多开放平台最坑的不是“接口难调”，而是&lt;strong&gt;计费模型&lt;/strong&gt;：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;预充值 + 云外 ×10 + 欠费硬切断 + 控制台余额 T-1 滞后&lt;/strong&gt;。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;单价 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;0.01 元/百次/client_id&lt;/code&gt; 看起来像白送，&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;但生产里真正烧钱/漏单的三件事是：&lt;/div&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;公网 ECS（阿里云/腾讯云/本地机房）调 = &lt;strong&gt;云外 ×10&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;地址/手机号解密等增值能力 = &lt;strong&gt;云外直接禁调，不是加钱&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;余额 ≤ 0 = &lt;strong&gt;不是 429 限流，是系统级错误把订单同步打断&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;官方收费规则写得很直白：基础 API 云内 0.01、云外 0.10；增值 API 云内 0.03、云外 0.30，且增值 API 未经允许禁止云外调用；按日统计并从预充值余额扣除。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;二、拼多多 API 的“视角”和别家不同&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;平台&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;主视角&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单真相接口&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;1688&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;买家采购&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;alibaba.trade.*&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;淘宝&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;卖家经营&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;taobao.trade.fullinfo.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;POP 商家&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.order.detail.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;拼多多&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商家/服务商&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.order.information.get&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.order.list.get&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pdd.order.increment.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多核心订单族：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.order.list.get&lt;/code&gt;：按状态/时间拉列表&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.order.increment.get&lt;/code&gt;：增量变更&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.order.information.get&lt;/code&gt;：订单详情（子单/优惠/收货/售后）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.logistics.tracking.get&lt;/code&gt;：物流轨迹&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.erp.*&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.goods.*&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pdd.refund.*&lt;/code&gt;：商品、售后、ERP 类扩展&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;list/increment 是“捕捞网”，information 是“法官”，tracking 是“物流视角”。&lt;/strong&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多没有“消息推送替代轮询”的淘宝 DSS 级体验，小 ISV 经常是“增量 + 定时兜底”。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;三、预充值模式的四个隐形陷阱&lt;/h2&gt;&lt;h3&gt;1️⃣ 先充钱，不是月底结账&lt;/h3&gt;&lt;div class=&quot;ybc-p&quot;&gt;淘宝/京东：超免额后月底结。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多：&lt;strong&gt;调用前账户必须有余额&lt;/strong&gt;，今天跑的调用明天才扣，但“现在能不能调”看“现在余额”。&lt;/div&gt;&lt;h3&gt;2️⃣ 云外 ×10 倍&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;云内（拼多多云）：基础&amp;nbsp;0.01&amp;nbsp;/&amp;nbsp;百次&amp;nbsp;/&amp;nbsp;client_id
云外（阿里云/腾讯云/本地）：基础&amp;nbsp;0.10&amp;nbsp;/&amp;nbsp;百次&amp;nbsp;/&amp;nbsp;client_id
增值：云内&amp;nbsp;0.03，云外&amp;nbsp;0.30&amp;nbsp;且禁止&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;单店日 1 万次：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;云内：30 天 × 100 百次 × 0.01 = &lt;strong&gt;¥30/月&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;云外：= &lt;strong&gt;¥300/月&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;10 店 ISV 云外：¥3000/月，一年 3.6 万纯部署费&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3️⃣ 欠费是“断气”，不是限流&lt;/h3&gt;&lt;div class=&quot;ybc-p&quot;&gt;余额 0 / 负数：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;不返回 429&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;返回系统级错误（社区常见如 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;50001&lt;/code&gt; 类费用/权限特征，具体以当期文档为准）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;订单同步直接停，不会优雅降级&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;4️⃣ 控制台余额是 T-1&lt;/h3&gt;&lt;div class=&quot;ybc-p&quot;&gt;按日结算，界面看到的是“昨天扣完后的残值”。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;你以为还有 8 毛，其实这一小时已经欠了 3 块。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;四、签名：拼多多是 MD5(client_secret + kv + client_secret)&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;官方规则：&lt;/div&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;所有参数（公共 + 业务，不含 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;sign&lt;/code&gt;）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;key 按 ASCII 升序&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;拼成 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;keyvaluekeyvalue&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;头尾拼 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;client_secret&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;MD5 → 大写&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd/client.py
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;requests


class&amp;nbsp;PddClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GATEWAY&amp;nbsp;=&amp;nbsp;&amp;quot;https://gw-api.pinduoduo.com/api/router&amp;quot;
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client_id,&amp;nbsp;client_secret,&amp;nbsp;access_token=None,&amp;nbsp;timeout=5):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client_id&amp;nbsp;=&amp;nbsp;client_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client_secret&amp;nbsp;=&amp;nbsp;client_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.timeout&amp;nbsp;=&amp;nbsp;timeout

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_sign(self,&amp;nbsp;params:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flat&amp;nbsp;=&amp;nbsp;{k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted(flat.items()))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;f&amp;quot;{self.client_secret}{qs}{self.client_secret}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;execute(self,&amp;nbsp;type_:&amp;nbsp;str,&amp;nbsp;biz:&amp;nbsp;dict):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;type&amp;quot;:&amp;nbsp;type_,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;client_id&amp;quot;:&amp;nbsp;self.client_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;str(int(time.time())),&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;秒级，误差&amp;nbsp;&amp;lt;10min
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;data_type&amp;quot;:&amp;nbsp;&amp;quot;JSON&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.access_token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;access_token&amp;quot;]&amp;nbsp;=&amp;nbsp;self.access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params.update(biz)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.GATEWAY,&amp;nbsp;data=params,&amp;nbsp;timeout=self.timeout)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;⚠️ 网上有文章写“HMAC-SHA256 / key=value&amp;amp;...&amp;amp;client_secret=xxx”，那是错配/第三方网关写法。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;开放平台官方是 MD5 + 无分隔拼接 + secret 头尾&lt;/strong&gt;。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;五、余额守卫：把“欠费断气”变成“熔断+告警”&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd/balance_guard.py
import&amp;nbsp;time

#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
class&amp;nbsp;PddBalanceGuard:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;redis,&amp;nbsp;client,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;warn_yuan=50.0,&amp;nbsp;stop_yuan=10.0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alarm=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r&amp;nbsp;=&amp;nbsp;redis
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.warn&amp;nbsp;=&amp;nbsp;warn_yuan
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.stop&amp;nbsp;=&amp;nbsp;stop_yuan
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.alarm&amp;nbsp;=&amp;nbsp;alarm
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.key&amp;nbsp;=&amp;nbsp;&amp;quot;pdd:balance:cached&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;cached_balance(self)&amp;nbsp;-&amp;gt;&amp;nbsp;float:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v&amp;nbsp;=&amp;nbsp;self.r.get(self.key)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;float(v)&amp;nbsp;if&amp;nbsp;v&amp;nbsp;else&amp;nbsp;999999.0

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;refresh_from_platform(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;实际调用拼多多费用/账户查询接口；这里用伪接口
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;pdd.finance.account.balance.get&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bal&amp;nbsp;=&amp;nbsp;float(resp[&amp;quot;xxx&amp;quot;][&amp;quot;balance&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r.set(self.key,&amp;nbsp;bal,&amp;nbsp;ex=60)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;bal

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;pre_check(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bal&amp;nbsp;=&amp;nbsp;self.cached_balance()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;bal&amp;nbsp;&amp;lt;=&amp;nbsp;self.stop:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.alarm&amp;nbsp;and&amp;nbsp;self.alarm(f&amp;quot;PDD&amp;nbsp;余额熔断:&amp;nbsp;{bal}&amp;nbsp;元，停止非核心调用&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;CircuitOpen(&amp;quot;pdd&amp;nbsp;balance&amp;nbsp;too&amp;nbsp;low&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;bal&amp;nbsp;&amp;lt;=&amp;nbsp;self.warn:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.alarm&amp;nbsp;and&amp;nbsp;self.alarm(f&amp;quot;PDD&amp;nbsp;余额预警:&amp;nbsp;{bal}&amp;nbsp;元，准备充值&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;on_api_billing_error(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;命中费用类系统错误：立刻刷新余额并降级
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.refresh_from_platform()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r.set(self.key,&amp;nbsp;&amp;quot;0&amp;quot;,&amp;nbsp;ex=30)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;CircuitOpen(&amp;quot;pdd&amp;nbsp;billing/permission&amp;nbsp;error&amp;quot;)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;调用侧：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;guard.pre_check()
try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;client.execute(&amp;quot;pdd.order.increment.get&amp;quot;,&amp;nbsp;{...})
except&amp;nbsp;BillingError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;guard.on_api_billing_error()&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;六、订单同步：增量 + 兜底，不深翻页&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd/order_scanner.py
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime,&amp;nbsp;timedelta
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex

class&amp;nbsp;PddOrderScanner:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client,&amp;nbsp;guard,&amp;nbsp;bucket,&amp;nbsp;slide_back_sec=60):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.guard&amp;nbsp;=&amp;nbsp;guard
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket&amp;nbsp;=&amp;nbsp;bucket
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.slide_back&amp;nbsp;=&amp;nbsp;slide_back_sec

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;scan(self,&amp;nbsp;start:&amp;nbsp;datetime,&amp;nbsp;end:&amp;nbsp;datetime,&amp;nbsp;order_status:&amp;nbsp;int):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;start&amp;nbsp;&amp;lt;&amp;nbsp;end:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window_end&amp;nbsp;=&amp;nbsp;min(start&amp;nbsp;+&amp;nbsp;timedelta(hours=1),&amp;nbsp;end)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._scan_window(start,&amp;nbsp;window_end,&amp;nbsp;order_status)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;window_end&amp;nbsp;-&amp;nbsp;timedelta(seconds=self.slide_back)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_scan_window(self,&amp;nbsp;start,&amp;nbsp;end,&amp;nbsp;order_status,&amp;nbsp;page=1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.guard.pre_check()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket.acquire()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;pdd.order.increment.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;start_updated_at&amp;quot;:&amp;nbsp;int(start.timestamp()),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;end_updated_at&amp;quot;:&amp;nbsp;int(end.timestamp()),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_status&amp;quot;:&amp;nbsp;order_status,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;100,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;is_billing_error(resp):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.guard.on_api_billing_error()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;orders&amp;nbsp;=&amp;nbsp;resp.get(&amp;quot;order_increment_get_response&amp;quot;,&amp;nbsp;{}).get(&amp;quot;order_list&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;orders:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;o&amp;nbsp;in&amp;nbsp;orders:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield&amp;nbsp;o

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(orders)&amp;nbsp;&amp;lt;&amp;nbsp;100&amp;nbsp;or&amp;nbsp;page&amp;nbsp;&amp;gt;=&amp;nbsp;50:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;+=&amp;nbsp;1&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;详情补全：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;fill_detail(client,&amp;nbsp;guard,&amp;nbsp;order_sn):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;guard.pre_check()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;client.execute(&amp;quot;pdd.order.information.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_sn&amp;quot;:&amp;nbsp;order_sn,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;is_hit_rule&amp;quot;:&amp;nbsp;1,&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;按权限要返的字段
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.get(&amp;quot;order_info_get_response&amp;quot;,&amp;nbsp;{}).get(&amp;quot;order_info&amp;quot;)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;七、云内/云外部署决策&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;pdd_deploy_recommend(shops:&amp;nbsp;int,&amp;nbsp;need_decrypt:&amp;nbsp;bool)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;need_decrypt:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;必须拼多多云内；云外增值/解密直接禁调&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;shops&amp;nbsp;&amp;gt;=&amp;nbsp;5:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;拼多多云内；云外&amp;nbsp;10&amp;nbsp;店&amp;nbsp;ISV&amp;nbsp;一年多花几万&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;小自研可云外，但订单/地址解密迟早要回云内&amp;quot;&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;经验：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;商品/订单列表：云外能跑，但 ×10&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;收货人姓名/手机/地址解密：敏感数据强制云内&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;增值 API：云外不是贵，是&lt;strong&gt;不允许&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;大促：云外网络抖动 + 余额临界 = 双杀&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;八、成本守卫（本地计数器兜底）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;pdd/cost_meter.py
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;date


class&amp;nbsp;CostMeter:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;redis,&amp;nbsp;client_id,&amp;nbsp;price_per_100,&amp;nbsp;budget_per_day):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r&amp;nbsp;=&amp;nbsp;redis
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client_id&amp;nbsp;=&amp;nbsp;client_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.price&amp;nbsp;=&amp;nbsp;price_per_100
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.budget&amp;nbsp;=&amp;nbsp;budget_per_day

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;incr(self,&amp;nbsp;calls=1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;key&amp;nbsp;=&amp;nbsp;f&amp;quot;pdd:cost:{self.client_id}:{date.today()}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;=&amp;nbsp;self.r.incrby(key,&amp;nbsp;calls)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r.expire(key,&amp;nbsp;60&amp;nbsp;*&amp;nbsp;60&amp;nbsp;*&amp;nbsp;48)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;total&amp;nbsp;/&amp;nbsp;100&amp;nbsp;*&amp;nbsp;self.price&amp;nbsp;&amp;gt;&amp;nbsp;self.budget:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;BudgetExceeded(f&amp;quot;今日预算将超：{total}&amp;nbsp;calls&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;estimated_cost(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;key&amp;nbsp;=&amp;nbsp;f&amp;quot;pdd:cost:{self.client_id}:{date.today()}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;=&amp;nbsp;int(self.r.get(key)&amp;nbsp;or&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;total&amp;nbsp;/&amp;nbsp;100&amp;nbsp;*&amp;nbsp;self.price&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;云端部署 ≠ 忘了记账&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;本地 meter 用来“提前刹车”，平台账单用来“事后对账”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;预算超 80% → 降频；超 100% → 停非核心同步&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;九、错误分类（拼多多特有）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;现象&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;类型&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;处理&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;sign invalid&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;签名错&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;改拼接/时间戳/secret&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;timestamp expired&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;时钟偏差&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;校准机器时间&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;无接口权限&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;权限没申请&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;后台点申请，不重试&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;系统错误/费用类（如 50001 特征）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;欠费/余额&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;熔断 + 充值 + 不重试业务&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;限流/频繁访问&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;可重试&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;指数退避&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;网络超时&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;可重试&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;退避，但别当“没单”&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;解密返回空&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;云外调增值&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;必须云内，不靠加钱解决&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;十、和前几篇收口&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;1688&lt;/strong&gt;：基础免费但 QPS 卡脖，跨境/分销另立域&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;淘宝 TOP&lt;/strong&gt;：聚石塔内外 10 倍，增值禁外&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;京东 JOS&lt;/strong&gt;：云鼎内稳，POP 订单时间窗滚动&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;拼多多&lt;/strong&gt;：预充值硬断，云外 10 倍，增值禁外&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;共同真理：&lt;/p&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;消息/增量做触发器，详情接口做真相，本地守卫做安全带，云内合规做底线。&lt;/div&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;一句话：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;拼多多 API 的单价是糖，预充值模型是刀。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;你以为在省 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;0.01 元/百次&lt;/code&gt;，&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;其实在赌“余额别在双 11 凌晨归零、云外别被禁调解密、控制台别拿 T-1 余额骗你”。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;把 BalanceGuard 写进 Client，比把 sign 写对更重要。&lt;/strong&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 14 Oct 2026 10:27:08 +0800</pubDate></item><item><title>《京东订单API jingdong.pop.order.search 落地方案：鼎内调用与QPS配额管理》（附 Python 源码）</title><link>https://alexob.com/?id=567</link><description>&lt;h1&gt;《京东订单API jingdong.pop.order.search 落地方案：鼎内调用与QPS配额管理》（附 Python 源码）&lt;/h1&gt;&lt;h2&gt;一、先拍结论&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.pop.order.search&lt;/code&gt; 是 &lt;strong&gt;POP 商家订单检索接口&lt;/strong&gt;，不是订单真相源（真相是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.order.detail.get&lt;/code&gt; / 订单消息）。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;它的生产定位是：&lt;strong&gt;“按状态+时间窗捞订单列表”&lt;/strong&gt;，再拿 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;orderId&lt;/code&gt; 去拉详情。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;官方已经明说：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;创建时间支持查近 2 年，按更新时间只支持近 3 个月&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;开始/结束时间不得相差超过 1 个月&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;“建议通过时间滚动的方式拉取订单，页数要尽量少”&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;云鼎内调用是官方标注的调用方式之一&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;所以京东订单同步的成熟写法不是“翻页翻到天荒地老”，而是：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;时间窗滚动（30天/窗）
&amp;nbsp;&amp;nbsp;→&amp;nbsp;pop.order.search&amp;nbsp;捞&amp;nbsp;orderId
&amp;nbsp;&amp;nbsp;→&amp;nbsp;jd.order.detail.get&amp;nbsp;拉真相
&amp;nbsp;&amp;nbsp;→&amp;nbsp;(order_id,&amp;nbsp;order_state,&amp;nbsp;operate_time)&amp;nbsp;做幂等
&amp;nbsp;&amp;nbsp;→&amp;nbsp;JMQ/订单消息做触发器，search&amp;nbsp;做兜底&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;二、接口边界（别和这些搞混）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;接口&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;作用&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;备注&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.pop.order.search&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;POP 订单列表检索&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;创建时间近2年 / 更新时间近3月 / 时间窗≤1月&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.pop.order.fbp.search&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;FBP 订单检索&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东仓配履约订单&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.order.detail.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;单订单详情&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;子单/优惠/发票/收货&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;JMQ 订单消息&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;变更推送&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;触发器，不是真相&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.pop.order.print.data.get&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;发货/打单数据&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;打单用&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.etms.waybill.*&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;电子面单/轨迹&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;履约用&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;POP 和 VOP（企业采购）权限完全隔离，别用同一个 AppKey 想通吃。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;三、时间窗与分页：官方给的“反模式”&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;官方文档原话要点：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;start_date&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;end_date&lt;/code&gt; 差值 &lt;strong&gt;不得超过 1 个月&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;WAIT_SELLER_STOCK_OUT&lt;/code&gt; 时起止可空，默认前一个月&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;其他状态 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;start_date&lt;/code&gt; 必传&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;page_size&lt;/code&gt; 最大 100&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;“建议您之前频繁的翻页，页数较大，请尽快调整为时间滚动方式”&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;❌ 错误写法&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;page=1..5000，固定最近30天，order_state=ALL&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;问题：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;大商家一窗几万单 → 翻页深 → 超时/限流&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;订单在窗口内被修改 → 翻页过程中顺序漂移 → 漏单&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;状态 ALL + 深翻页 = 京东最喜欢限你流&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;✅ 正确写法&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;按&amp;nbsp;order_state&amp;nbsp;分桶
每个状态：时间窗&amp;nbsp;30&amp;nbsp;天，sortType=0&amp;nbsp;升序，page&amp;nbsp;不超&amp;nbsp;50
窗滚动：end&amp;nbsp;=&amp;nbsp;now&amp;nbsp;-&amp;nbsp;30s，start&amp;nbsp;=&amp;nbsp;end&amp;nbsp;-&amp;nbsp;30d
每次同步记录&amp;nbsp;(state,&amp;nbsp;last_operate_time)
下次从&amp;nbsp;last_operate_time&amp;nbsp;继续&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;四、鼎内调用是什么&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东有“云鼎/鼎内”概念：应用/服务在京东云鼎环境内调用，某些订单/数据/合规链路更稳，官方接口文档也会标“云鼎内调用”。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;生产含义：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;鼎内：延迟低、订单/隐私字段合规链路更完整、大促抖动小&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;鼎外（公网 IDC）：能调，但隐私字段/大促稳定性/审计不如鼎内&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;订单类接口&lt;strong&gt;必须卖家 OAuth access_token&lt;/strong&gt;，不管鼎内鼎外&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;经验口径（非官方保证）：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东商家 JOS 订单类接口，鼎内通常比鼎外更适合做“持续同步 + 大促兜底”；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;但&lt;strong&gt;“鼎内”不是免限流金牌&lt;/strong&gt;，QPS 配额照样按应用/权限包来。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;五、QPS 与配额：社区经验口径&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;官方不把“所有应用的 QPS”写死成一刀切，社区实测大致是：&lt;/div&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;应用类型&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单类经验 QPS&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;说明&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;个人应用&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;1~2/s&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;订单类基本别上生产&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业实名（基础）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;5~10/s&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;pop.order.search&lt;/code&gt; 常见档&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;买资源包&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;20 / 50 / 100/s&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;需平台审批/购包&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;鼎内企业应用&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right; font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;视权限包&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不是无限，别睡大觉&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;费用口径（社区经验）：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;商家 JOS 有日免费额度&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pop.order.search&lt;/code&gt; 超量按量计费&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;鼎内/云内单价低于公网（类似淘宝聚石塔内外价差逻辑）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;联盟 API（&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.union.open.*&lt;/code&gt;）是 CPS 选品体系，和商家订单同步是两回事&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;六、Python：京东 JOS 基础 Client（秒级时间！）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;jd/jos_client.py
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;requests


class&amp;nbsp;JdJosClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GATEWAY&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.jd.com/routerjson&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;access_token=None,&amp;nbsp;timeout=5):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.timeout&amp;nbsp;=&amp;nbsp;timeout

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_sign(self,&amp;nbsp;params:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flat&amp;nbsp;=&amp;nbsp;{k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted(flat.items()))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;f&amp;quot;{self.app_secret}{qs}{self.app_secret}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;execute(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz:&amp;nbsp;dict):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;method,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;time.strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;),&amp;nbsp;&amp;nbsp;#&amp;nbsp;京东用秒级/字符串
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.access_token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;access_token&amp;quot;]&amp;nbsp;=&amp;nbsp;self.access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params.update(biz)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.GATEWAY,&amp;nbsp;data=params,&amp;nbsp;timeout=self.timeout)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()&lt;/pre&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东坑：把 1688 的&lt;strong&gt;毫秒时间戳&lt;/strong&gt;带过来 → &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;timestamp invalid&lt;/code&gt;。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东要 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;yyyy-MM-dd HH:mm:ss&lt;/code&gt;，允许误差 10 分钟。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;七、Python：时间滚动订单检索器&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;jd/pop_order_scanner.py
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime,&amp;nbsp;timedelta
from&amp;nbsp;ratelimit.token_bucket&amp;nbsp;import&amp;nbsp;TokenBucket


class&amp;nbsp;PopOrderScanner:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MAX_WINDOW&amp;nbsp;=&amp;nbsp;timedelta(days=30)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SLIDE_BACK&amp;nbsp;=&amp;nbsp;timedelta(seconds=30)&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;防修改时间漂移漏单

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;client:&amp;nbsp;JdJosClient,&amp;nbsp;bucket:&amp;nbsp;TokenBucket):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.client&amp;nbsp;=&amp;nbsp;client
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket&amp;nbsp;=&amp;nbsp;bucket

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;scan_state(self,&amp;nbsp;order_state:&amp;nbsp;str,&amp;nbsp;start:&amp;nbsp;datetime,&amp;nbsp;end:&amp;nbsp;datetime):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;start&amp;nbsp;&amp;lt;&amp;nbsp;end:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window_end&amp;nbsp;=&amp;nbsp;min(start&amp;nbsp;+&amp;nbsp;self.MAX_WINDOW,&amp;nbsp;end)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield&amp;nbsp;from&amp;nbsp;self._scan_window(order_state,&amp;nbsp;start,&amp;nbsp;window_end)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;下一窗往前滚，并回退&amp;nbsp;30s&amp;nbsp;防丢
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start&amp;nbsp;=&amp;nbsp;window_end&amp;nbsp;-&amp;nbsp;self.SLIDE_BACK
#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_scan_window(self,&amp;nbsp;order_state,&amp;nbsp;start,&amp;nbsp;end,&amp;nbsp;page_size=100):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.bucket.acquire()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.client.execute(&amp;quot;jingdong.pop.order.search&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;start_date&amp;quot;:&amp;nbsp;start.strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;end_date&amp;quot;:&amp;nbsp;end.strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_state&amp;quot;:&amp;nbsp;order_state,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;dateType&amp;quot;:&amp;nbsp;0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;0=按创建时间；1=按修改时间
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sortType&amp;quot;:&amp;nbsp;0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;0=升序，滚动拉取稳
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;str(page),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;str(page_size),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;optional_fields&amp;quot;:&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;orderId,orderState,operateTime,orderStartTime,&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;itemInfoList,payType,orderSellerPrice,consigneeInfo&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node&amp;nbsp;=&amp;nbsp;resp.get(&amp;quot;jingdong_pop_order_search_responce&amp;quot;)&amp;nbsp;or&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;node.get(&amp;quot;searchorderinfo_result&amp;quot;)&amp;nbsp;or&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api_result&amp;nbsp;=&amp;nbsp;result.get(&amp;quot;apiResult&amp;quot;)&amp;nbsp;or&amp;nbsp;{}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;api_result.get(&amp;quot;success&amp;quot;)&amp;nbsp;==&amp;nbsp;&amp;quot;false&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;JdApiError(api_result.get(&amp;quot;chineseErrCode&amp;quot;),&amp;nbsp;api_result.get(&amp;quot;numberCode&amp;quot;))

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;orders&amp;nbsp;=&amp;nbsp;result.get(&amp;quot;orderInfoList&amp;quot;)&amp;nbsp;or&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;orders:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;o&amp;nbsp;in&amp;nbsp;orders:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield&amp;nbsp;o

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;官方建议：别深翻页
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(orders)&amp;nbsp;&amp;lt;&amp;nbsp;page_size&amp;nbsp;or&amp;nbsp;page&amp;nbsp;&amp;gt;=&amp;nbsp;50:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;+=&amp;nbsp;1&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;状态分桶示例：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;STATES&amp;nbsp;=&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;NOT_PAY&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;WAIT_SELLER_STOCK_OUT&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;WAIT_GOODS_RECEIVE_CONFIRM&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;FINISHED_L&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;TRADE_CANCELED&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;LOCKED&amp;quot;,
]&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;八、QPS 配额管理器（单实例 + Redis 分布式）&lt;/h2&gt;&lt;h3&gt;单实例令牌桶&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;ratelimit/token_bucket.py
import&amp;nbsp;time

#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
class&amp;nbsp;TokenBucket:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;rate:&amp;nbsp;float,&amp;nbsp;capacity:&amp;nbsp;float&amp;nbsp;=&amp;nbsp;None,&amp;nbsp;jitter:&amp;nbsp;float&amp;nbsp;=&amp;nbsp;0.05):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.rate&amp;nbsp;=&amp;nbsp;rate
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.capacity&amp;nbsp;=&amp;nbsp;capacity&amp;nbsp;or&amp;nbsp;rate
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tokens&amp;nbsp;=&amp;nbsp;self.capacity
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.last&amp;nbsp;=&amp;nbsp;time.monotonic()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.jitter&amp;nbsp;=&amp;nbsp;jitter

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;acquire(self,&amp;nbsp;n:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now&amp;nbsp;=&amp;nbsp;time.monotonic()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tokens&amp;nbsp;=&amp;nbsp;min(self.capacity,&amp;nbsp;self.tokens&amp;nbsp;+&amp;nbsp;(now&amp;nbsp;-&amp;nbsp;self.last)&amp;nbsp;*&amp;nbsp;self.rate)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.last&amp;nbsp;=&amp;nbsp;now
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.tokens&amp;nbsp;&amp;gt;=&amp;nbsp;n:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.tokens&amp;nbsp;-=&amp;nbsp;n
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sleep&amp;nbsp;=&amp;nbsp;(n&amp;nbsp;-&amp;nbsp;self.tokens)&amp;nbsp;/&amp;nbsp;self.rate&amp;nbsp;+&amp;nbsp;self.jitter
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(sleep)&lt;/pre&gt;&lt;h3&gt;多实例分布式限流&lt;/h3&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;ratelimit/redis_sliding.py
import&amp;nbsp;time


class&amp;nbsp;RedisQpsLimiter:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;redis,&amp;nbsp;key:&amp;nbsp;str,&amp;nbsp;qps:&amp;nbsp;int):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r&amp;nbsp;=&amp;nbsp;redis
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.key&amp;nbsp;=&amp;nbsp;key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.qps&amp;nbsp;=&amp;nbsp;qps

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;allow(self)&amp;nbsp;-&amp;gt;&amp;nbsp;bool:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now&amp;nbsp;=&amp;nbsp;time.time()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r.zremrangebyscore(self.key,&amp;nbsp;0,&amp;nbsp;now&amp;nbsp;-&amp;nbsp;1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r.zadd(self.key,&amp;nbsp;{str(now):&amp;nbsp;now})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.r.expire(self.key,&amp;nbsp;2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self.r.zcard(self.key)&amp;nbsp;&amp;lt;=&amp;nbsp;self.qps&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;调用侧：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;if&amp;nbsp;not&amp;nbsp;redis_limiter.allow():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(0.1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
bucket.acquire()&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;企业 10 QPS → 客户端设 8&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;鼎内企业 20 QPS → 客户端设 16&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;多店铺：按 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;shop_id&lt;/code&gt; 分桶，别全店共享一个令牌桶&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;列表 8 QPS + 详情 5 QPS 分开桶，别互相挤死&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;九、限流/错误分类（京东特有）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;class&amp;nbsp;JdApiError(Exception):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;msg,&amp;nbsp;code=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super().__init__(msg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.code&amp;nbsp;=&amp;nbsp;code


def&amp;nbsp;classify(resp):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node&amp;nbsp;=&amp;nbsp;resp.get(&amp;quot;jingdong_pop_order_search_responce&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api&amp;nbsp;=&amp;nbsp;(node.get(&amp;quot;searchorderinfo_result&amp;quot;)&amp;nbsp;or&amp;nbsp;{}).get(&amp;quot;apiResult&amp;quot;)&amp;nbsp;or&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;api.get(&amp;quot;success&amp;quot;)&amp;nbsp;==&amp;nbsp;&amp;quot;false&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;msg&amp;nbsp;=&amp;nbsp;api.get(&amp;quot;chineseErrCode&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;code&amp;nbsp;=&amp;nbsp;api.get(&amp;quot;numberCode&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;限额/限流
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;quot;accesscontrol&amp;quot;&amp;nbsp;in&amp;nbsp;msg&amp;nbsp;or&amp;nbsp;&amp;quot;limited&amp;quot;&amp;nbsp;in&amp;nbsp;msg&amp;nbsp;or&amp;nbsp;str(code)&amp;nbsp;==&amp;nbsp;&amp;quot;16&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;RetriableError(f&amp;quot;jd&amp;nbsp;limit:&amp;nbsp;{msg}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;参数/权限
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;quot;permission&amp;quot;&amp;nbsp;in&amp;nbsp;msg&amp;nbsp;or&amp;nbsp;&amp;quot;validate&amp;quot;&amp;nbsp;in&amp;nbsp;msg:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;FatalError(f&amp;quot;jd&amp;nbsp;param/perm:&amp;nbsp;{msg}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;RetriableError(f&amp;quot;jd&amp;nbsp;api&amp;nbsp;err:&amp;nbsp;{msg}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;HTTP&amp;nbsp;层
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;code=16&amp;nbsp;/&amp;nbsp;429&amp;nbsp;/&amp;nbsp;ISP_FLOW_CONTROL_LIMIT&amp;nbsp;→&amp;nbsp;退避&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;重试策略：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;code=16&lt;/code&gt; / 429 / flow control → 指数退避（10s, 30s, 60s）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;token 过期 → 刷 access_token 再试 1 次&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;参数错 / 无权限 / 店铺未授权 → 不重试，告警&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;网络超时 → 重试，但&lt;strong&gt;别把“超时”当成“没数据”&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十、幂等与状态机&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pop.order.search&lt;/code&gt; 只给列表，别直接写业务：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;upsert_from_search(order):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_id&amp;nbsp;=&amp;nbsp;str(order[&amp;quot;orderId&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state&amp;nbsp;=&amp;nbsp;order[&amp;quot;orderState&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;op_time&amp;nbsp;=&amp;nbsp;parse_time(order.get(&amp;quot;operateTime&amp;quot;)&amp;nbsp;or&amp;nbsp;order.get(&amp;quot;orderStartTime&amp;quot;))

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur&amp;nbsp;=&amp;nbsp;order_repo.get(order_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;version&amp;nbsp;=&amp;nbsp;int(op_time.timestamp()&amp;nbsp;*&amp;nbsp;1000)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;cur&amp;nbsp;and&amp;nbsp;version&amp;nbsp;&amp;lt;&amp;nbsp;cur.version:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;nbsp;#&amp;nbsp;旧窗数据晚到

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;只存“列表级快照”，详情再去&amp;nbsp;jd.order.detail.get&amp;nbsp;拉
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_repo.upsert({
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_id&amp;quot;:&amp;nbsp;order_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;order_state&amp;quot;:&amp;nbsp;state,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;operate_time&amp;quot;:&amp;nbsp;op_time,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;version&amp;quot;:&amp;nbsp;version,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;need_detail&amp;quot;:&amp;nbsp;True,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;详情拉取：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;fill_detail(order_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;client.execute(&amp;quot;jd.order.detail.get&amp;quot;,&amp;nbsp;{&amp;quot;order_id&amp;quot;:&amp;nbsp;order_id})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trade&amp;nbsp;=&amp;nbsp;extract_trade(resp)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order_repo.update_detail(trade)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;十一、消息 + 搜索 双通道（生产必做）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;JMQ&amp;nbsp;订单消息
&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;gt;&amp;nbsp;入队&amp;nbsp;order_change(order_id)

定时器（每&amp;nbsp;60s）
&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;gt;&amp;nbsp;pop.order.search&amp;nbsp;按状态滚动
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└─&amp;gt;&amp;nbsp;补消息漏掉的&amp;nbsp;order_id

两者都只干一件事：
&amp;nbsp;&amp;nbsp;&amp;nbsp;mark&amp;nbsp;need_detail&amp;nbsp;=&amp;nbsp;True

Worker：
&amp;nbsp;&amp;nbsp;&amp;nbsp;jd.order.detail.get&amp;nbsp;→&amp;nbsp;写&amp;nbsp;order_snapshot&amp;nbsp;→&amp;nbsp;跑状态机&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;铁律：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;消息：快返回、msgId 去重、异步处理&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;搜索：兜底、时间滚动、别深翻页&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;详情：真相源&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;(order_id, order_state, operate_time)&lt;/code&gt;：幂等键&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十二、大促/店铺多时的配置&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;JD_POP_CONFIG&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;bucket_qps&amp;quot;:&amp;nbsp;8,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;企业&amp;nbsp;10&amp;nbsp;留余量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;detail_qps&amp;quot;:&amp;nbsp;5,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;window_days&amp;quot;:&amp;nbsp;30,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;slide_back_sec&amp;quot;:&amp;nbsp;30,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;max_page&amp;quot;:&amp;nbsp;50,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;states&amp;quot;:&amp;nbsp;STATES,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;per_shop_bucket&amp;quot;:&amp;nbsp;True,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;use_jmq&amp;quot;:&amp;nbsp;True,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;search_fallback_interval&amp;quot;:&amp;nbsp;60,&amp;nbsp;&amp;nbsp;#&amp;nbsp;秒
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;dingnei_preferred&amp;quot;:&amp;nbsp;True,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;鼎内网关/部署优先
}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;鼎内部署时：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;订单同步服务放鼎内容器&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Redis/DB 也走鼎内内网&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;公网只暴露“内部调度 API”，不暴露 JOS 调用层&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;大促前压测的是 &lt;strong&gt;detail + 发货 + 面单&lt;/strong&gt;，不是 search 翻页&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十三、落地检查表&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;[ ] 时间戳用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;yyyy-MM-dd HH:mm:ss&lt;/code&gt;，别用毫秒&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;pop.order.search&lt;/code&gt; 只捞列表，不写业务&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 时间窗 ≤ 30 天，状态分桶，回退 30s&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] page 不超 50，不深翻页&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 列表 QPS / 详情 QPS / 面单 QPS 分桶&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 多实例用 Redis 滑动窗口，不用单机 time.sleep 假装限流&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 限流退避、token 过期刷一次、权限错告警&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] JMQ 做触发器，search 做兜底，detail 做真相&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;(order_id, order_state, operate_time)&lt;/code&gt; 幂等&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] POP / FBP / VOP 应用分开，不串 AppKey&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;[ ] 鼎内优先，但鼎内也不假设“无限 QPS”&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;十四、一句话收口&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.pop.order.search&lt;/code&gt; 不是“订单同步主接口”，是“订单 ID 捕捞网”。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;生产里把它当主角 → 深翻页、限流、漏单、大促崩；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;把它当配角 → 时间滚动捞 ID、消息做闹钟、detail 做法官、QPS 桶做安全带。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;鼎内调用解决的是合规和稳定性，不解决“你不会限流”的问题。&lt;/strong&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 14 Oct 2026 09:20:52 +0800</pubDate></item><item><title>《京东商品API：从 item.jd.get 迁移到 jingdong.item.read.get 的字段映射与踩坑》（附 Python 源码）</title><link>https://alexob.com/?id=566</link><description>&lt;h1&gt;《京东商品API：从 item.jd.get 迁移到 jingdong.item.read.get 的字段映射与踩坑》（附 Python 源码）&lt;/h1&gt;&lt;div class=&quot;ybc-p&quot;&gt;先拍结论：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东这波迁移&lt;strong&gt;不是重构业务&lt;/strong&gt;，而是“宙斯 JOS → 京东商家开放平台”的命名/入口收敛。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;网关还是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;https://api.jd.com/routerjson&lt;/code&gt;，签名还是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;secret + kv(ASCII) + secret&lt;/code&gt;，AccessToken 逻辑不变；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;真正要改的是三件事：&lt;/div&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;method&lt;/code&gt; 从 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;item.jd.get / jd.item.get / jingdong.ware.get&lt;/code&gt; 换成 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.item.read.get&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;返回根节点从 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;item_get_response / jingdong_ware_get_response&lt;/code&gt; 换成 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong_item_read_get_response&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;旧接口“单 SKU 平铺”，新接口“SPU + skuList + priceInfo + stockInfo”嵌套化&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;ybc-p&quot;&gt;老代码直接 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;item[&amp;quot;title&amp;quot;]&lt;/code&gt; 的，迁移后必炸。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;一、老 vs 新：先对齐接口身份&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;维度&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;老 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.jd.get&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.item.get&lt;/code&gt;&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;新 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.item.read.get&lt;/code&gt;&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;平台&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;宙斯 JOS（已融合到 open.jd.com）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东商家开放平台&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;定位&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商品详情只读（旧命名）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商品基础信息只读（标准化）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;网关&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;api.jd.com/routerjson&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;同上&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;签名&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;MD5(secret+kv+secret)&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;同上（一行不改）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;入参&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;sku_id&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item_id&lt;/code&gt; + &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;fields&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;sku_id&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;sku_ids&lt;/code&gt; + &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;fields&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;批量&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不支持或各版本不一&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;支持 &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;sku_ids&lt;/code&gt;，最多 20 个&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;返回根&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item_get_response&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong_item_read_get_response&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;结构&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;平铺多&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;goodsInfoList / priceInfo / imageInfo / skuList / stockInfo&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;新应用申请&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;维护期，不鼓励&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;官方推荐&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;经验口径：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;网关/签名/鉴权零改动，解析层重写，批量能力顺手用上。&lt;/strong&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;二、旧接口“脑内模型”（为什么会写错）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;老 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;item.jd.get&lt;/code&gt; 很多人写成：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;item_get_response&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_id&amp;quot;:&amp;nbsp;100012345678,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title&amp;quot;:&amp;nbsp;&amp;quot;XX&amp;nbsp;笔记本&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;4999.00,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock&amp;quot;:&amp;nbsp;120,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;image&amp;quot;:&amp;nbsp;&amp;quot;https://img10.360buyimg.com/...&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;于是老代码：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;item&amp;nbsp;=&amp;nbsp;resp[&amp;quot;item_get_response&amp;quot;][&amp;quot;item&amp;quot;]
title&amp;nbsp;=&amp;nbsp;item[&amp;quot;title&amp;quot;]
price&amp;nbsp;=&amp;nbsp;float(item[&amp;quot;price&amp;quot;])
stock&amp;nbsp;=&amp;nbsp;int(item[&amp;quot;stock&amp;quot;])&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;三、新接口真实结构（简化但接近生产）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;jingdong_item_read_get_response&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;code&amp;quot;:&amp;nbsp;&amp;quot;0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;message&amp;quot;:&amp;nbsp;&amp;quot;success&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;result&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goodsInfoList&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;skuId&amp;quot;:&amp;nbsp;&amp;quot;100012345678&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;title&amp;quot;:&amp;nbsp;&amp;quot;XX&amp;nbsp;笔记本&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;shortTitle&amp;quot;:&amp;nbsp;&amp;quot;轻薄本&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;saleState&amp;quot;:&amp;nbsp;1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;priceInfo&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;marketPrice&amp;quot;:&amp;nbsp;&amp;quot;5999.00&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;jdPrice&amp;quot;:&amp;nbsp;&amp;quot;4999.00&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;promotionPrice&amp;quot;:&amp;nbsp;&amp;quot;4799.00&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;currency&amp;quot;:&amp;nbsp;&amp;quot;CNY&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;imageInfo&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;mainImg&amp;quot;:&amp;nbsp;&amp;quot;https://img10.360buyimg.com/n1/...&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;imgList&amp;quot;:&amp;nbsp;[&amp;quot;https://img10...&amp;quot;,&amp;nbsp;&amp;quot;https://img10...&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;brand&amp;quot;:&amp;nbsp;{&amp;nbsp;&amp;quot;brandId&amp;quot;:&amp;nbsp;123,&amp;nbsp;&amp;quot;brandName&amp;quot;:&amp;nbsp;&amp;quot;Lenovo&amp;quot;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;category&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cid1&amp;quot;:&amp;nbsp;1,&amp;nbsp;&amp;quot;cid1Name&amp;quot;:&amp;nbsp;&amp;quot;电脑办公&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cid2&amp;quot;:&amp;nbsp;12,&amp;nbsp;&amp;quot;cid2Name&amp;quot;:&amp;nbsp;&amp;quot;笔记本&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cid3&amp;quot;:&amp;nbsp;123,&amp;nbsp;&amp;quot;cid3Name&amp;quot;:&amp;nbsp;&amp;quot;轻薄本&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stockInfo&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stockNum&amp;quot;:&amp;nbsp;120,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stockStatus&amp;quot;:&amp;nbsp;&amp;quot;available&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;salesInfo&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;totalSold&amp;quot;:&amp;nbsp;3200,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;commentCount&amp;quot;:&amp;nbsp;1450,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goodRate&amp;quot;:&amp;nbsp;&amp;quot;97.2&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;skuList&amp;quot;:&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;skuId&amp;quot;:&amp;nbsp;&amp;quot;10001234567801&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;specText&amp;quot;:&amp;nbsp;&amp;quot;16G+512G&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;&amp;quot;4999.00&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock&amp;quot;:&amp;nbsp;60
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;skuId&amp;quot;:&amp;nbsp;&amp;quot;10001234567802&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;specText&amp;quot;:&amp;nbsp;&amp;quot;32G+1T&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;&amp;quot;5799.00&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock&amp;quot;:&amp;nbsp;60
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;⚠️ 不同权限包返回的字段名会有差异：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;有的返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jdPrice&lt;/code&gt;，有的返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;salePrice&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;有的返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;stockNum&lt;/code&gt;，有的返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;stock&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;有的返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;goodsInfoList&lt;/code&gt;，联盟接口返回 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;data&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;下架商品 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;saleState=0&lt;/code&gt;，价格/库存可能直接为空&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;strong&gt;所以迁移第一原则：别信字段名，先打原始 JSON 建映射表。&lt;/strong&gt;&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;四、字段映射表（ERP 落地用）&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;老 item.jd.get&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;新 jingdong.item.read.get&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;说明&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.sku_id&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;goodsInfoList[].skuId&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;最小销售单元&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.item_id&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;ware_id&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;SPU 需另查 / 用 sku 反推&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东强 SKU 模型&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.title&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;goodsInfoList[].title&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.sub_title&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;shortTitle&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;不一定有&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.price&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;priceInfo.jdPrice&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;当前京东价&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.market_price&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;priceInfo.marketPrice&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;划线价&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.promotion_price&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;priceInfo.promotionPrice&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;活动价&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.stock&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;stockInfo.stockNum&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skuList[].stock&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;区域库存才准&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.img_url&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;imageInfo.mainImg&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;360buy 图链有防盗链&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.images&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;imageInfo.imgList&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.brand&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;brand.brandName&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.cid&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;category.cid3&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;三级类目&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.sku_attrs&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;skuList[].specText&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;“颜色:黑;尺码:XL”&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.desc&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;新接口常不返回&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;详情 HTML 要别的权限/接口&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.seller_nick&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;shopInfo.shopName&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商家接口才有&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;item.outer_id&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商家后台字段，新只读接口未必返&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;自营运配编码要店铺商品接口&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;跨平台统一模型里：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;京东主键用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd_&amp;lt;skuId&amp;gt;&lt;/code&gt;，不是 item_id；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;1688 是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;offerId+skuId&lt;/code&gt;，淘宝是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;num_iid+sku_id&lt;/code&gt;，京东是 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;skuId + skuList[].skuId&lt;/code&gt;。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;五、Python：兼容老新的客户端&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;jd/client.py
import&amp;nbsp;hashlib
import&amp;nbsp;time
import&amp;nbsp;requests

#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
class&amp;nbsp;JDClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GATEWAY&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.jd.com/routerjson&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key,&amp;nbsp;app_secret,&amp;nbsp;access_token=None,&amp;nbsp;timeout=5):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.access_token&amp;nbsp;=&amp;nbsp;access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.timeout&amp;nbsp;=&amp;nbsp;timeout

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_sign(self,&amp;nbsp;params:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flat&amp;nbsp;=&amp;nbsp;{k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()&amp;nbsp;if&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qs&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(f&amp;quot;{k}{v}&amp;quot;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;sorted(flat.items()))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;f&amp;quot;{self.app_secret}{qs}{self.app_secret}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;execute(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;biz:&amp;nbsp;dict):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;method,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;str(int(time.time()&amp;nbsp;*&amp;nbsp;1000)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;2.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;self.access_token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;access_token&amp;quot;]&amp;nbsp;=&amp;nbsp;self.access_token
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params.update(biz)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.GATEWAY,&amp;nbsp;data=params,&amp;nbsp;timeout=self.timeout)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;六、Python：旧→新适配层（重点）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;jd/item_adapter.py
from&amp;nbsp;dataclasses&amp;nbsp;import&amp;nbsp;dataclass,&amp;nbsp;field
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Optional


@dataclass
class&amp;nbsp;JDItem:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_id:&amp;nbsp;str
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;spu_hint:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;short_title:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;market_price:&amp;nbsp;Optional[float]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sale_price:&amp;nbsp;Optional[float]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;promo_price:&amp;nbsp;Optional[float]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;main_img:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img_list:&amp;nbsp;list[str]&amp;nbsp;=&amp;nbsp;field(default_factory=list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;brand_name:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cid3:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cid3_name:&amp;nbsp;Optional[str]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_stock:&amp;nbsp;Optional[int]&amp;nbsp;=&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;on_sale:&amp;nbsp;bool&amp;nbsp;=&amp;nbsp;True
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;skus:&amp;nbsp;list[dict]&amp;nbsp;=&amp;nbsp;field(default_factory=list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw:&amp;nbsp;dict&amp;nbsp;=&amp;nbsp;field(default_factory=dict)


def&amp;nbsp;_f(x):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;float(x)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;(TypeError,&amp;nbsp;ValueError):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None


def&amp;nbsp;_i(x):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;int(x)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;(TypeError,&amp;nbsp;ValueError):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None


def&amp;nbsp;parse_legacy_item(resp:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;JDItem:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;老&amp;nbsp;item.jd.get&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item&amp;nbsp;=&amp;nbsp;(resp.get(&amp;quot;item_get_response&amp;quot;)&amp;nbsp;or&amp;nbsp;{}).get(&amp;quot;item&amp;quot;)&amp;nbsp;or&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;JDItem(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_id=str(item.get(&amp;quot;sku_id&amp;quot;)&amp;nbsp;or&amp;nbsp;item.get(&amp;quot;skuId&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title=item.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;market_price=_f(item.get(&amp;quot;market_price&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sale_price=_f(item.get(&amp;quot;price&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;promo_price=_f(item.get(&amp;quot;promotion_price&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;main_img=item.get(&amp;quot;img_url&amp;quot;)&amp;nbsp;or&amp;nbsp;item.get(&amp;quot;image&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_stock=_i(item.get(&amp;quot;stock&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;skus=[{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_id&amp;quot;:&amp;nbsp;str(item.get(&amp;quot;sku_id&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;spec&amp;quot;:&amp;nbsp;&amp;quot;&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;_f(item.get(&amp;quot;price&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock&amp;quot;:&amp;nbsp;_i(item.get(&amp;quot;stock&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw=item,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)

#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
def&amp;nbsp;parse_new_item(resp:&amp;nbsp;dict)&amp;nbsp;-&amp;gt;&amp;nbsp;JDItem:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;新&amp;nbsp;jingdong.item.read.get&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node&amp;nbsp;=&amp;nbsp;resp.get(&amp;quot;jingdong_item_read_get_response&amp;quot;)&amp;nbsp;or&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;str(node.get(&amp;quot;code&amp;quot;))&amp;nbsp;not&amp;nbsp;in&amp;nbsp;(&amp;quot;0&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;,&amp;nbsp;None)&amp;nbsp;and&amp;nbsp;&amp;quot;result&amp;quot;&amp;nbsp;not&amp;nbsp;in&amp;nbsp;node:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;RuntimeError(node.get(&amp;quot;message&amp;quot;)&amp;nbsp;or&amp;nbsp;&amp;quot;jd&amp;nbsp;item&amp;nbsp;read&amp;nbsp;error&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_list&amp;nbsp;=&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(node.get(&amp;quot;result&amp;quot;)&amp;nbsp;or&amp;nbsp;{}).get(&amp;quot;goodsInfoList&amp;quot;)&amp;nbsp;or&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;goods_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;RuntimeError(&amp;quot;empty&amp;nbsp;goodsInfoList&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g&amp;nbsp;=&amp;nbsp;goods_list[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_info&amp;nbsp;=&amp;nbsp;g.get(&amp;quot;priceInfo&amp;quot;)&amp;nbsp;or&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock_info&amp;nbsp;=&amp;nbsp;g.get(&amp;quot;stockInfo&amp;quot;)&amp;nbsp;or&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;image_info&amp;nbsp;=&amp;nbsp;g.get(&amp;quot;imageInfo&amp;quot;)&amp;nbsp;or&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;category&amp;nbsp;=&amp;nbsp;g.get(&amp;quot;category&amp;quot;)&amp;nbsp;or&amp;nbsp;{}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;JDItem(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku_id=str(g.get(&amp;quot;skuId&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title=g.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;short_title=g.get(&amp;quot;shortTitle&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;market_price=_f(price_info.get(&amp;quot;marketPrice&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sale_price=_f(price_info.get(&amp;quot;jdPrice&amp;quot;)&amp;nbsp;or&amp;nbsp;price_info.get(&amp;quot;salePrice&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;promo_price=_f(price_info.get(&amp;quot;promotionPrice&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;main_img=image_info.get(&amp;quot;mainImg&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img_list=image_info.get(&amp;quot;imgList&amp;quot;)&amp;nbsp;or&amp;nbsp;[],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;brand_name=(g.get(&amp;quot;brand&amp;quot;)&amp;nbsp;or&amp;nbsp;{}).get(&amp;quot;brandName&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cid3=str(category.get(&amp;quot;cid3&amp;quot;)&amp;nbsp;or&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cid3_name=category.get(&amp;quot;cid3Name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_stock=_i(stock_info.get(&amp;quot;stockNum&amp;quot;)&amp;nbsp;or&amp;nbsp;stock_info.get(&amp;quot;stock&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;on_sale=g.get(&amp;quot;saleState&amp;quot;,&amp;nbsp;1)&amp;nbsp;==&amp;nbsp;1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;skus=[{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_id&amp;quot;:&amp;nbsp;str(s.get(&amp;quot;skuId&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;spec&amp;quot;:&amp;nbsp;s.get(&amp;quot;specText&amp;quot;)&amp;nbsp;or&amp;nbsp;s.get(&amp;quot;spec&amp;quot;)&amp;nbsp;or&amp;nbsp;&amp;quot;&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;price&amp;quot;:&amp;nbsp;_f(s.get(&amp;quot;price&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;stock&amp;quot;:&amp;nbsp;_i(s.get(&amp;quot;stock&amp;quot;)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;for&amp;nbsp;s&amp;nbsp;in&amp;nbsp;(g.get(&amp;quot;skuList&amp;quot;)&amp;nbsp;or&amp;nbsp;[])],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw=g,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;调用侧：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;client&amp;nbsp;=&amp;nbsp;JDClient(APP_KEY,&amp;nbsp;APP_SECRET,&amp;nbsp;ACCESS_TOKEN)

#&amp;nbsp;老
legacy&amp;nbsp;=&amp;nbsp;parse_legacy_item(client.execute(&amp;quot;item.jd.get&amp;quot;,&amp;nbsp;{&amp;quot;sku_id&amp;quot;:&amp;nbsp;sku}))
#&amp;nbsp;新
new&amp;nbsp;=&amp;nbsp;parse_new_item(client.execute(&amp;quot;jingdong.item.read.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_id&amp;quot;:&amp;nbsp;sku,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;fields&amp;quot;:&amp;nbsp;&amp;quot;skuId,title,shortTitle,priceInfo,imageInfo,brand,category,stockInfo,skuList,salesInfo&amp;quot;
}))&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;七、批量迁移红利：别再单 SKU 狂打&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;batch_get(client,&amp;nbsp;sku_ids:&amp;nbsp;list[str]):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(sku_ids)&amp;nbsp;&amp;gt;&amp;nbsp;20:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;ValueError(&amp;quot;jingdong.item.read.get&amp;nbsp;单次最多&amp;nbsp;20&amp;nbsp;个&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;client.execute(&amp;quot;jingdong.item.read.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_ids&amp;quot;:&amp;nbsp;&amp;quot;,&amp;quot;.join(sku_ids),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;fields&amp;quot;:&amp;nbsp;&amp;quot;skuId,title,priceInfo,stockInfo,imageInfo,skuList&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node&amp;nbsp;=&amp;nbsp;resp.get(&amp;quot;jingdong_item_read_get_response&amp;quot;)&amp;nbsp;or&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(node.get(&amp;quot;result&amp;quot;)&amp;nbsp;or&amp;nbsp;{}).get(&amp;quot;goodsInfoList&amp;quot;)&amp;nbsp;or&amp;nbsp;[]&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;限流口径（社区经验）：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;基础 2 QPS&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;企业 5~50 QPS&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;批量 20 个 ≠ 20 次免费，仍按平台计费/限流模型走&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;BUCKET&amp;nbsp;=&amp;nbsp;TokenBucket(rate=8)&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;企业&amp;nbsp;10&amp;nbsp;的话留余量

def&amp;nbsp;safe_batch(skus):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;chunk&amp;nbsp;in&amp;nbsp;chunks(skus,&amp;nbsp;20):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BUCKET.acquire()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield&amp;nbsp;batch_get(client,&amp;nbsp;chunk)&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;八、迁移期双跑校验（很重要）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;def&amp;nbsp;migrate_check(sku):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old&amp;nbsp;=&amp;nbsp;safe_parse(parse_legacy_item(client.execute(&amp;quot;item.jd.get&amp;quot;,&amp;nbsp;{&amp;quot;sku_id&amp;quot;:&amp;nbsp;sku})))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new&amp;nbsp;=&amp;nbsp;safe_parse(parse_new_item(client.execute(&amp;quot;jingdong.item.read.get&amp;quot;,&amp;nbsp;{&amp;quot;sku_id&amp;quot;:&amp;nbsp;sku})))

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;diffs&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;old.title&amp;nbsp;!=&amp;nbsp;new.title:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;diffs.append((&amp;quot;title&amp;quot;,&amp;nbsp;old.title,&amp;nbsp;new.title))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;abs((old.sale_price&amp;nbsp;or&amp;nbsp;0)&amp;nbsp;-&amp;nbsp;(new.sale_price&amp;nbsp;or&amp;nbsp;0))&amp;nbsp;&amp;gt;&amp;nbsp;0.01:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;diffs.append((&amp;quot;price&amp;quot;,&amp;nbsp;old.sale_price,&amp;nbsp;new.sale_price))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(old.total_stock&amp;nbsp;or&amp;nbsp;0)&amp;nbsp;!=&amp;nbsp;(new.total_stock&amp;nbsp;or&amp;nbsp;0):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;diffs.append((&amp;quot;stock&amp;quot;,&amp;nbsp;old.total_stock,&amp;nbsp;new.total_stock))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;diffs&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;标题/价格不一致 → 先查 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;area&lt;/code&gt; 区域价、查促销时间窗&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;库存不一致 → 京东库存是&lt;strong&gt;区域可售库存&lt;/strong&gt;，不传 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;area&lt;/code&gt; 默认北京&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;老接口有、新接口没有（desc / outer_id / cost_price）→ 不是丢了，是权限域不同&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;九、区域库存坑（京东特有）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;client.execute(&amp;quot;jingdong.item.read.get&amp;quot;,&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_id&amp;quot;:&amp;nbsp;sku,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;area&amp;quot;:&amp;nbsp;&amp;quot;19_1607_3157_0&amp;quot;,&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;省_市_区_镇
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;fields&amp;quot;:&amp;nbsp;&amp;quot;skuId,stockInfo,priceInfo&amp;quot;
})&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;不传 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;area&lt;/code&gt;：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;价格用默认区域&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;库存用平台默认仓配视角&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;跨境/家电/冷链会明显失真&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;淘宝/1688 很少强调“区域库存”，京东 POP/自营必须传 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;area&lt;/code&gt;。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;十、和前几篇收口&lt;/h2&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;1688&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;offerId+skuId&lt;/code&gt; 采购视角，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;amountOnSale=-1/999999&lt;/code&gt; 不可信&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;淘宝&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;num_iid&lt;/code&gt; 卖家视角，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;item.get&lt;/code&gt; 公开 / &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;item.seller.get&lt;/code&gt; 私有&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;京东&lt;/strong&gt;：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;skuId&lt;/code&gt; 是王，&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.item.read.get&lt;/code&gt; 是商家/POP 只读视图；联盟 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.union.open.goods.detail.query&lt;/code&gt; 是 CPS 视角，别混用&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;迁移本质&lt;/strong&gt;：京东不是“接口变了”，是“返回从平铺商品变成 SPU/SKU 价格库存对象树”&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;一句话：&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;老京东商品接口教你怎么“取一个商品”；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;新 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.item.read.get&lt;/code&gt; 教你怎么“理解一个京东 SPU：哪些 SKU、各区多少钱、哪区有货”。&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;迁移别只改 method，要把“商品=一条记录”的脑模型，升级成“商品=SPU 聚合 + SKU 集合 + 区域库存”。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;br/&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 13 Oct 2026 09:36:34 +0800</pubDate></item><item><title>《京东JOS API：落地方案、接口边界与业务踩坑 —— 联盟免费 vs 商家按量的双轨制》（附python源码）</title><link>https://alexob.com/?id=565</link><description>&lt;div class=&quot;ybc-p&quot;&gt;下面按「&lt;strong&gt;双轨制定位 → 接口边界 → 落地架构 → 常见踩坑 → Python 双 Client 源码&lt;/strong&gt;」给你一套可直接抄的工程化方案。&lt;/div&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;结论先拍：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;em&gt;&lt;em&gt;京东联盟 API（jd.union.open.&lt;/em&gt;）= 选品/CPS/比价，调用本身接近免费，赚钱靠成交抽佣&lt;/em&gt;*&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;&lt;em&gt;&lt;em&gt;京东商家 JOS（jingdong.&lt;/em&gt; / jd.&lt;/em&gt;）= 店铺订单/真实库存/发货/电子面单，有日免额，超量按量计费**&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;两套 Key、两套授权、两套配额，&lt;strong&gt;绝不能混用&lt;/strong&gt;。&lt;/div&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;一、双轨制全景对照&lt;/h2&gt;&lt;div class=&quot;hyc-common-markdown__table-wrapper&quot; data-has-scroll=&quot;false&quot; style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;div style=&quot;font-size: 16px; border-collapse: separate; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;table&gt;&lt;thead style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;维度&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东联盟 API&lt;/div&gt;&lt;/th&gt;&lt;th style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;京东商家 JOS&lt;/div&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;前缀&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.union.open.*&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jingdong.*&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.pop.order.*&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 2px 4px;&quot;&gt;jd.order.*&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;目的&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;选品、券价、佣金、CPS 推广&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;ERP、订单同步、真实库存、发货回写&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;资质&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;联盟实名（可不绑店铺）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;企业认证 + 卖家 OAuth AccessToken&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;库存&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;有货 / 无货 / 预售&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;可售库存、锁定库存、区域仓存&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;价格&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;促销价、券后价、佣金率&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商家后台基准价、协议价&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;费用&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;调用免费，成交抽佣 5%~20%&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;日免额内免费，超量云内 ¥0.01~0.05/百次，云外 ×3~×10&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;电子面单&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;无&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;按单计费（几分/单）&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;典型 QPS&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;5~30/s（可申）&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;个人 1~2/s，企业 5~10/s&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;适合&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;导购站、比价、铺货、达人系统&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 10.7143px 12.8571px 10.7143px 0px; border: 1px solid rgb(224, 224, 224);&quot;&gt;&lt;div class=&quot;ybc-p&quot; style=&quot;font-size: 16px; border-collapse: collapse; border-spacing: 0px; padding: 0px;&quot;&gt;商家自建 ERP / WMS / 打单系统&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;⚠️ &lt;strong&gt;最贵误区&lt;/strong&gt;：&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;用联盟 API 拿“自己店铺真实库存”→ 拿不到；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;用商家 JOS 批量爬竞品比价 → 3000 次/天或企业免额瞬间烧完，云外再放大 10 倍账单。&lt;/div&gt;&lt;hr/&gt;&lt;h2&gt;二、接口边界（什么时候用哪套）&lt;/h2&gt;&lt;h3&gt;✅ 用「联盟 API」&lt;/h3&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;商品搜索：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.union.open.goods.query&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;商品详情：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.union.open.goods.detail.query&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;推广链接：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.union.open.goods.promotiongoodsinfo.query&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;券后价 / 佣金率 / 类目 CPS&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;跨店选品、内容电商、返利机器人&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;✅ 用「商家 JOS」&lt;/h3&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;商品主数据：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.read.get&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SKU：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.sku.read&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;真实库存：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.stock.get&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;ware.stock.get&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;店铺订单：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.pop.order.search&lt;/code&gt; / &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jd.order.detail.get&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;发货回写 / 物流轨迹：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.etms.trace.get&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;电子面单：&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.etms.waybill.get&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;❌ 禁止用法&lt;/h3&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;联盟 Key 查自己店铺订单 → 无权&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;商家 Key 爬全站竞品 → 超量 + 合规风险&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;把联盟调用量“无限轮询”思维套到商家 Key → 月烧几千块&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;三、落地架构（生产可用）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;┌──────────────┐
&amp;nbsp;定时任务/Webhook│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;───────────────▶│&amp;nbsp;&amp;nbsp;API&amp;nbsp;Router&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;└──────┬───────┘
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;┌───────────────┴───────────────┐
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼
&amp;nbsp;UnionClient&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JosMerchantClient
（联盟：选品/比价/推广）&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;（商家：订单/库存/发货）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;│
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;▼
&amp;nbsp;Quota:&amp;nbsp;只记调用量&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Quota:&amp;nbsp;日额度&amp;nbsp;+&amp;nbsp;超量预警
&amp;nbsp;Billing:&amp;nbsp;CPS&amp;nbsp;佣金&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Billing:&amp;nbsp;按量&amp;nbsp;+&amp;nbsp;电子面单&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;工程原则：&lt;/div&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Key 不混用&lt;/strong&gt;：配置层就隔离&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;商家接口走令牌桶&lt;/strong&gt;：QPS 保守（企业 8/s，个人 1/s）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;订单/库存优先消息推送&lt;/strong&gt;，别轮询&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;商家调用打 meter&lt;/strong&gt;：日调用量、接口级、店铺级&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;联盟接口可高频，但别用来“补商家数据”&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;四、业务踩坑清单（很值钱）&lt;/h2&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;时间戳用秒不是毫秒&lt;/strong&gt;&lt;br/&gt;JOS 要 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;int(time.time())&lt;/code&gt;，用毫秒 → &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;Invalid Timestamp&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;签名必须 ASCII 升序 + 空值剔除 + 紧凑 JSON&lt;/strong&gt;&lt;br/&gt;数组/JSON 字段别用 &lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;json.dumps(obj)&lt;/code&gt; 默认空格&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;公开商品接口 ≠ 自己店铺数据&lt;/strong&gt;&lt;br/&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;jingdong.ware.read.get&lt;/code&gt; 不传 token 也能查公开字段&lt;br/&gt;但库存 / 商家编码 / 区域仓 → 必须卖家 AccessToken&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;订单类接口要“企业应用 + 接口权限申请 + token”&lt;/strong&gt;&lt;br/&gt;个人应用直接 403 / no permission&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;日免额耗尽返回类似&lt;/strong&gt;&lt;br/&gt;&lt;code class=&quot;hyc-common-markdown__code__inline&quot;&gt;accesscontrol.limited-by-app-access-count&lt;/code&gt;&lt;br/&gt;不是代码错，是没钱了&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;电子面单“取号即计费”&lt;/strong&gt;&lt;br/&gt;取消未揽收通常不扣，但取号动作本身计费&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;沙箱只验签名&lt;/strong&gt;&lt;br/&gt;沙箱返 mock 商品/空订单是正常的，别调试到怀疑人生&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;云外调用贵到离谱&lt;/strong&gt;&lt;br/&gt;商家系统尽量放京东云/聚石塔体系内&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;五、Python 双 Client 源码（可直接用）&lt;/h2&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;#&amp;nbsp;jd_dual_api_client.py
&amp;quot;&amp;quot;&amp;quot;
京东双通道&amp;nbsp;API&amp;nbsp;Client
1.&amp;nbsp;UnionClient&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt;&amp;nbsp;京东联盟&amp;nbsp;API&amp;nbsp;(jd.union.open.*)
2.&amp;nbsp;JosMerchantClient&amp;nbsp;-&amp;gt;&amp;nbsp;京东商家&amp;nbsp;JOS&amp;nbsp;&amp;nbsp;(jingdong.*&amp;nbsp;/&amp;nbsp;jd.*)
网关统一:&amp;nbsp;https://api.jd.com/routerjson
&amp;quot;&amp;quot;&amp;quot;

import&amp;nbsp;hashlib
import&amp;nbsp;json
import&amp;nbsp;time
import&amp;nbsp;requests
from&amp;nbsp;typing&amp;nbsp;import&amp;nbsp;Any,&amp;nbsp;Dict


class&amp;nbsp;BaseJDClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GATEWAY&amp;nbsp;=&amp;nbsp;&amp;quot;https://api.jd.com/routerjson&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;app_key:&amp;nbsp;str,&amp;nbsp;app_secret:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_key&amp;nbsp;=&amp;nbsp;app_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.app_secret&amp;nbsp;=&amp;nbsp;app_secret

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_build_sign(self,&amp;nbsp;params:&amp;nbsp;Dict[str,&amp;nbsp;Any])&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MD5&amp;nbsp;签名：
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;剔除&amp;nbsp;sign
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;空字符串可保留（京东一般要求非空，但实现上建议剔除&amp;nbsp;None）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;key&amp;nbsp;按&amp;nbsp;ASCII&amp;nbsp;升序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;secret&amp;nbsp;+&amp;nbsp;kv&amp;nbsp;+&amp;nbsp;secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filtered&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k:&amp;nbsp;v&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;params.items()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;k&amp;nbsp;!=&amp;nbsp;&amp;quot;sign&amp;quot;&amp;nbsp;and&amp;nbsp;v&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None&amp;nbsp;and&amp;nbsp;v&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;self.app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;k&amp;nbsp;in&amp;nbsp;sorted(filtered.keys()):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v&amp;nbsp;=&amp;nbsp;filtered[k]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;isinstance(v,&amp;nbsp;(dict,&amp;nbsp;list)):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v&amp;nbsp;=&amp;nbsp;json.dumps(v,&amp;nbsp;ensure_ascii=False,&amp;nbsp;separators=(&amp;quot;,&amp;quot;,&amp;nbsp;&amp;quot;:&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;+=&amp;nbsp;f&amp;quot;{k}{v}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;+=&amp;nbsp;self.app_secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hashlib.md5(raw.encode(&amp;quot;utf-8&amp;quot;)).hexdigest().upper()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;_request(self,&amp;nbsp;method:&amp;nbsp;str,&amp;nbsp;extra:&amp;nbsp;Dict[str,&amp;nbsp;Any],&amp;nbsp;token:&amp;nbsp;str&amp;nbsp;=&amp;nbsp;None)&amp;nbsp;-&amp;gt;&amp;nbsp;dict:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;app_key&amp;quot;:&amp;nbsp;self.app_key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;method&amp;quot;:&amp;nbsp;method,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;timestamp&amp;quot;:&amp;nbsp;str(int(time.time())),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;format&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;v&amp;quot;:&amp;nbsp;&amp;quot;1.0&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sign_method&amp;quot;:&amp;nbsp;&amp;quot;md5&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;token:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;access_token&amp;quot;]&amp;nbsp;=&amp;nbsp;token

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;业务参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;k,&amp;nbsp;v&amp;nbsp;in&amp;nbsp;extra.items():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;isinstance(v,&amp;nbsp;(dict,&amp;nbsp;list)):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v&amp;nbsp;=&amp;nbsp;json.dumps(v,&amp;nbsp;ensure_ascii=False,&amp;nbsp;separators=(&amp;quot;,&amp;quot;,&amp;nbsp;&amp;quot;:&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[k]&amp;nbsp;=&amp;nbsp;v

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;sign&amp;quot;]&amp;nbsp;=&amp;nbsp;self._build_sign(params)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.post(self.GATEWAY,&amp;nbsp;data=params,&amp;nbsp;timeout=10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()


class&amp;nbsp;UnionClient(BaseJDClient):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;京东联盟&amp;nbsp;API
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;场景：选品&amp;nbsp;/&amp;nbsp;比价&amp;nbsp;/&amp;nbsp;券后价&amp;nbsp;/&amp;nbsp;佣金&amp;nbsp;/&amp;nbsp;CPS
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;goods_query(self,&amp;nbsp;keyword:&amp;nbsp;str,&amp;nbsp;page_index:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;1,&amp;nbsp;page_size:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;20):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goodsReqDTO&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;keyword&amp;quot;:&amp;nbsp;keyword,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;pageIndex&amp;quot;:&amp;nbsp;page_index,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;pageSize&amp;quot;:&amp;nbsp;page_size,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self._request(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method=&amp;quot;jd.union.open.goods.query&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extra={&amp;quot;360buy_param_json&amp;quot;:&amp;nbsp;biz},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;goods_detail(self,&amp;nbsp;sku_ids:&amp;nbsp;list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;skuIds&amp;quot;:&amp;nbsp;sku_ids
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self._request(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method=&amp;quot;jd.union.open.goods.detail.query&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extra={&amp;quot;360buy_param_json&amp;quot;:&amp;nbsp;biz},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)

#&amp;nbsp;封装好API供应商demo&amp;nbsp;url=https://console.open.onebound.cn/console/?i=Lex
class&amp;nbsp;JosMerchantClient(BaseJDClient):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;京东商家&amp;nbsp;JOS
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;场景：商品主数据&amp;nbsp;/&amp;nbsp;真实库存&amp;nbsp;/&amp;nbsp;店铺订单&amp;nbsp;/&amp;nbsp;发货
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;ware_read(self,&amp;nbsp;ware_id:&amp;nbsp;int,&amp;nbsp;access_token:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;wareId&amp;quot;:&amp;nbsp;ware_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self._request(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method=&amp;quot;jingdong.ware.read.get&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extra={&amp;quot;360buy_param_json&amp;quot;:&amp;nbsp;biz},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token=access_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;stock_get(self,&amp;nbsp;sku_id:&amp;nbsp;int,&amp;nbsp;access_token:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;skuId&amp;quot;:&amp;nbsp;sku_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self._request(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method=&amp;quot;jingdong.stock.get&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extra={&amp;quot;360buy_param_json&amp;quot;:&amp;nbsp;biz},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token=access_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;pop_order_search(self,&amp;nbsp;start_date:&amp;nbsp;str,&amp;nbsp;end_date:&amp;nbsp;str,&amp;nbsp;page:&amp;nbsp;int,&amp;nbsp;access_token:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;biz&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;orderReq&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;startDate&amp;quot;:&amp;nbsp;start_date,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;endDate&amp;quot;:&amp;nbsp;end_date,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;pageSize&amp;quot;:&amp;nbsp;100,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;self._request(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method=&amp;quot;jingdong.pop.order.search&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extra={&amp;quot;360buy_param_json&amp;quot;:&amp;nbsp;biz},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;token=access_token,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)


if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;union&amp;nbsp;=&amp;nbsp;UnionClient(&amp;quot;UNION_APP_KEY&amp;quot;,&amp;nbsp;&amp;quot;UNION_APP_SECRET&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(union.goods_query(&amp;quot;机械键盘&amp;quot;))

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;merchant&amp;nbsp;=&amp;nbsp;JosMerchantClient(&amp;quot;JOS_APP_KEY&amp;quot;,&amp;nbsp;&amp;quot;JOS_APP_SECRET&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(merchant.ware_read(1000123,&amp;nbsp;&amp;quot;SELLER_ACCESS_TOKEN&amp;quot;))&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;六、配额护栏（生产必加）&lt;/h2&gt;&lt;div class=&quot;ybc-p&quot;&gt;商家侧一定要加：&lt;/div&gt;&lt;pre class=&quot;ybc-pre-component ybc-pre-component_not-math&quot;&gt;from&amp;nbsp;collections&amp;nbsp;import&amp;nbsp;defaultdict
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;date

daily_counter&amp;nbsp;=&amp;nbsp;defaultdict(int)

def&amp;nbsp;count_and_guard(app_name:&amp;nbsp;str,&amp;nbsp;cost:&amp;nbsp;int,&amp;nbsp;daily_limit:&amp;nbsp;int):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;today&amp;nbsp;=&amp;nbsp;str(date.today())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;key&amp;nbsp;=&amp;nbsp;f&amp;quot;{app_name}:{today}&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daily_counter[key]&amp;nbsp;+=&amp;nbsp;cost
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;daily_counter[key]&amp;nbsp;&amp;gt;&amp;nbsp;daily_limit:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise&amp;nbsp;RuntimeError(f&amp;quot;{app_name}&amp;nbsp;日调用量即将超免额：{daily_counter[key]}/{daily_limit}&amp;quot;)&lt;/pre&gt;&lt;div class=&quot;ybc-p&quot;&gt;规则建议：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;联盟：只统计，不扣费&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;商家：日调用 &amp;gt; 80% 免额 → 告警&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;订单列表：能用 Webhook/消息就不翻页&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;库存：本地缓存 30~60s，别每秒查&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;七、一句话选型&lt;/h2&gt;&lt;blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;**“看别人商品”用联盟，“管自己店铺”用 JOS；&lt;/div&gt;&lt;div class=&quot;ybc-p&quot;&gt;联盟烧的是佣金，JOS 烧的是调用次数和面单。”**&lt;/div&gt;&lt;/blockquote&gt;&lt;div class=&quot;ybc-p&quot;&gt;如果你愿意，我可以把这套再扩成：&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;✅ 联盟推广链生成 + 佣金回执校验&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;✅ 商家订单增量同步（cursor / 消息 / 防超卖）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;✅ 京东 + 淘宝 + 拼多多 三平台 API 统一抽象层&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;ybc-p&quot;&gt;你更想先要哪一个？&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 13 Oct 2026 09:16:31 +0800</pubDate></item></channel></rss>