博客 / 詳情

返回

拼多多商品詳情 API 的 5 個 “潛規則”

在電商開發圈摸爬滾打這些年,拼多多商品詳情 API 的 “接地氣” 設計,既藏着批發採購的便利,也埋了不少讓你抓瞎的坑。作為主打低價拼團的平台,它的接口返回裏全是零售平台沒有的 “特殊邏輯”—— 從嵌套三層的規格參數,到拼團價和單買價的隱式區分,每次對接都像在解帶陷阱的數學題。今天就把這些年踩過的雷、攢的可落地代碼全抖出來。

一、初次翻車:簽名少了個 “&”,調試到凌晨兩點

第一次接[拼多多 API] 時,我剛做完淘寶的項目,自信滿滿照搬 “參數排序 + 加密” 的邏輯,結果連續 5 小時返回1001簽名錯誤。翻遍拼多多開放平台文檔,發現它的簽名規則有個 “反常識” 要求:參數拼接時必須用 “&key=value” 格式,且最後一個參數後不能加 & ,而我習慣了 “key=value&” 的拼接方式,多了個尾綴 & 直接導致加密結果錯了。

更坑的是,拼多多的簽名需要把app_keytimestampsign之外的所有參數都加入計算,連pagepage_size這種分頁參數都不能漏。那天對着官方示例算到眼痠,終於磨出能跑通的簽名函數:

python

運行

import hashlib
import time
import urllib.parse

def generate_pdd_sign(params, app_secret):
    """生成拼多多商品詳情API簽名(注意拼接格式!)"""
    # 1. 過濾sign參數(如果有),排除無需簽名的字段
    sign_params = {k: v for k, v in params.items() if k not in ["sign"]}
    # 2. 按參數名ASCII升序排序(拼多多要求嚴格升序,小寫字母在前)
    sorted_params = sorted(sign_params.items(), key=lambda x: x[0])
    # 3. 拼接成"&key=value"格式(開頭無&,結尾無&,這是坑點!)
    query_str = "&".join([f"{k}={urllib.parse.quote(str(v), safe='')}" for k, v in sorted_params])
    # 4. 拼接app_secret,MD5加密後轉大寫(拼多多固定用MD5)
    sign_str = f"{query_str}{app_secret}"
    return hashlib.md5(sign_str.encode()).hexdigest().upper()

# 使用示例
params = {
    "type": "pdd.goods.detail.get",
    "client_id": "your_client_id",  # 拼多多叫client_id,不是app_key
    "goods_id": "1234567890123",  # 拼多多商品ID是13位
    "timestamp": str(int(time.time())),  # 秒級時間戳,必須傳
    "page": 1,
    "page_size": 20
}
params["sign"] = generate_pdd_sign(params, "your_client_secret")

二、規格解析:把 “顏色 - 尺碼” 拆成了兩個字段,客户下單下錯規格

系統上線後第一個月,採購客户反饋:“明明選了‘紅色 - M 碼’,下單時變成了‘紅色’和‘M 碼’兩個單獨選項!” 排查發現,拼多多的商品規格是 “嵌套組合” 結構 —— 接口返回的specs字段裏,spec_key是 “顏色”“尺碼” 這類維度,spec_value是具體值,但不同維度的組合需要自己關聯,而我直接把維度和值拆成了獨立選項,導致規格錯亂。

比如一件衣服的規格,接口返回是這樣的:

json

"specs": [
  {"spec_key": "顏色", "spec_value": "紅色"},
  {"spec_key": "顏色", "spec_value": "藍色"},
  {"spec_key": "尺碼", "spec_value": "M"},
  {"spec_key": "尺碼", "spec_value": "L"}
]

而實際可售規格是 “紅色 - M”“紅色 - L”“藍色 - M”“藍色 - L”,需要按spec_key分組後組合。我連夜重寫的規格解析函數,專門處理這種組合邏輯:

python

運行

from itertools import product

def parse_pdd_specs(specs):
    """解析拼多多商品規格,生成維度-值組合(如顏色-紅色+尺碼-M)"""
    # 1. 按spec_key分組(如{"顏色": ["紅色", "藍色"], "尺碼": ["M", "L"]})
    spec_groups = {}
    for spec in specs:
        key = spec.get("spec_key")
        value = spec.get("spec_value")
        if key not in spec_groups:
            spec_groups[key] = []
        spec_groups[key].append(value)
    
    # 2. 生成所有維度的組合(如[("紅色", "M"), ("紅色", "L"), ...])
    spec_dimensions = list(spec_groups.values())
    spec_combinations = product(*spec_dimensions)
    
    # 3. 格式化組合結果(如"顏色-紅色,尺碼-M")
    formatted_specs = []
    spec_keys = list(spec_groups.keys())
    for combo in spec_combinations:
        spec_str = ",".join([f"{spec_keys[i]}-{combo[i]}" for i in range(len(combo))])
        formatted_specs.append(spec_str)
    
    return formatted_specs

# 示例調用
raw_specs = [
    {"spec_key": "顏色", "spec_value": "紅色"},
    {"spec_key": "顏色", "spec_value": "藍色"},
    {"spec_key": "尺碼", "spec_value": "M"},
    {"spec_key": "尺碼", "spec_value": "L"}
]
parsed_specs = parse_pdd_specs(raw_specs)
print(parsed_specs)  # 輸出:["顏色-紅色,尺碼-M", "顏色-紅色,尺碼-L", "顏色-藍色,尺碼-M", "顏色-藍色,尺碼-L"]
  1. 商品 ID 是 13 位數字:別和淘寶的 11 位、京東的 10 位混了,傳錯 ID 會返回 “商品不存在”,但錯誤碼和 “商品下架” 一樣,容易混淆。
  2. 規格要自己組合:接口只返回獨立的 “維度 - 值”,不會給組合結果(如 “紅色 - M”),必須用 product 函數生成所有組合,否則規格顯示錯亂。
  3. 價格要區分拼團類型:2 人拼團價(min_group_price)、3 人拼團價(group_price)、單買價(single_price)要分開,別把拼團價當單買價,否則會虧。

image.png

---------------------------------------
{
    "item": {
        "num_iid": 831950269446,
        "title": "復古牛仔褲春秋2025小個子高腰直筒寬鬆垂感褲子拖地新款",
        "detail_url": "http://mobile.yangkeduo.com/goods2.html?goods_id=831950269446",
        "price": 99.99,
        "pic_url": "https://img.pddpic.com/gaudit-image/2025-10-18/a5691c17800c25f3aa45120c3e170039.jpeg",
        "sales": "321",
        "item_url": [
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/6fee03d8-cb6a-4395-9039-481c48101705.jpeg.a.jpeg"
            },
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/6bb22580-0d4e-419c-8db9-19e828d8c6c2.jpeg.a.jpeg"
            },
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/f37c8146-7470-4781-aea4-a8de297caffb.jpeg.a.jpeg"
            },
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/c2931bfd-5373-485f-b1af-0cd6e9adf66c.jpeg.a.jpeg"
            },
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/4551a1da-e5be-44e8-9150-5f02b2b1cce4.jpeg.a.jpeg"
            },
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/0ce40725-6f06-4987-bb83-a8488b27e7d9.jpeg.a.jpeg"
            },
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/e563180c-96ed-4bf3-b56e-073a6e9cb027.jpeg.a.jpeg"
            },
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/491a8e26-d569-4cc6-8698-df02252b250c.jpeg.a.jpeg"
            },
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/f5045975-0170-48ba-a226-d143fd13ef0d.jpeg.a.jpeg"
            },
            {
                "url": "https://img.pddpic.com/mms-goods-image/2025-09-12/ed2b1eaf-43b4-484d-abe8-e0e785f1fdfa.jpeg.a.jpeg"
            }
        ],
        "shop_name": "",
        "shop_id": "",
        "promotion_price": "29.99",
        "category": 17370,
        "cid": "女裝",
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.