拼多多开放平台提供了查询商品价格及优惠信息的 API 接口,其中 “到手价” 需结合商品基础价格、优惠券、多多果园折扣等多种优惠计算。以下是基于拼多多联盟 API 的实现方案,包含签名生成、接口调用及价格解析逻辑。
一、核心接口与认证机制
1. 相关 API 接口
获取商品到手价主要依赖拼多多联盟的商品详情接口:
pdd.ddk.goods.detail
:获取商品基础价格、优惠券、佣金、活动折扣等信息,支持直接返回优惠后价格(需联盟权限)。2. 认证机制
拼多多 API 采用client_id + client_secret + 签名
的认证体系:- 开发者需在拼多多开放平台注册应用,获取
client_id
(应用 ID)和client_secret
(密钥); - 所有请求必须包含
sign
参数(通过client_secret
对请求参数加密生成); - 接口调用需通过联盟账号授权,部分优惠信息(如专属优惠券)需传递推广位 ID。
二、Python 脚本实现
以下脚本实现通过拼多多 API 获取商品到手价,包含完整的签名生成、接口调用和价格解析逻辑。
import requests import json import time import hashlib import logging from requests.exceptions import RequestException from typing import Dict, Optional
配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
class PDDAPI:
def init(self, client_id: str, client_secret: str):
"""
初始化拼多多 API 客户端
:param client_id: 应用 client_id
:param client_secret: 应用 client_secret
"""
self.client_id = client_id
self.client_secret = client_secret
self.base_url = "" # 拼多多 API 网关
def _generate_sign (self, params: Dict [str, str]) -> str:
"""生成签名(拼多多 API 签名规则)"""
- 按参数名 ASCII 升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0]) - 拼接为 key=value&key=value 格式
sign_str = "&".join([f"{k}={v}" for k, v in sorted_params]) - 拼接 client_secret 并 MD5 加密
sign_str += self.client_secret
return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
def call (self, method: str, params: Optional [Dict] = None) -> Optional [Dict]:
"""
通用 API 调用方法
:param method: 接口方法名
:param params: 接口参数
:return: 接口返回的业务数据
""" - 构建公共参数
common_params = {
"client_id": self.client_id,
"method": method,
"timestamp": str (int (time.time ())), # 秒级时间戳
"format": "json",
"v": "1.0"
} - 合并参数
all_params = {common_params, (params or {})} - 生成签名
sign = self._generate_sign(all_params)
all_params["sign"] = sign - 发送请求
try:
response = requests.get(
self.base_url,
params=all_params,
timeout=15
)
response.raise_for_status() - 解析响应
result = response.json()
logging.info(f"API 调用成功:{method},响应:{json.dumps (result, ensure_ascii=False)[:200]}...") - 处理错误(拼多多 API 错误在 error_response 节点)
if "error_response" in result:
error = result ["error_response"]
logging.error (f"业务错误:{error.get ('error_msg')}(错误码:{error.get ('error_code')})")
return None
return result.get ("goods_detail_response", {}) # 返回业务数据节点
except RequestException as e:
logging.error (f"请求异常:{str (e)},接口:{method}")
return None
except json.JSONDecodeError:
logging.error (f"响应格式错误:{response.text [:200]}...,接口:{method}")
return None
def get_item_final_price (self, goods_id: str, pid: Optional [str] = None) -> Optional [Dict]:
"""
获取商品到手价(包含优惠券、多多果园折扣等)
:param goods_id: 商品 ID(拼多多商品唯一标识)
:param pid: 推广位 ID(可选,用于获取专属优惠)
:return: 价格信息字典(含原价、到手价、优惠信息等)
"""
method = "pdd.ddk.goods.detail"
params = {
"goods_id_list": json.dumps ([goods_id]), # 商品 ID 列表(JSON 字符串)
"with_coupon": True # 包含优惠券信息
}
若有推广位 ID,添加参数以获取专属优惠
if pid:
params["pid"] = pid
调用接口
result = self.call(method, params)
if not result or not result.get("goods_details"):
return None
解析商品信息
goods = result["goods_details"][0]
到手价 = 优惠后价格(已包含优惠券、折扣等)
final_price = goods.get ("min_group_price") # 拼团最低价(单位:分,需转换为元)
original_price = goods.get ("original_price") # 原价(单位:分)
解析优惠券信息
coupons = []
if goods.get ("coupons"):
coupons = [
{
"discount": c.get ("discount") / 100, # 优惠金额(分→元)
"min_order_amount": c.get ("min_order_amount") / 100, # 门槛金额(分→元)
"coupon_desc": c.get ("coupon_desc") # 优惠券描述
} for c in goods ["coupons"]
]
return {
"goods_id": goods_id,
"title": goods.get ("goods_name"), # 商品标题
"original_price": original_price / 100 if original_price else None, # 原价(元)
"final_price": final_price / 100 if final_price else None, # 到手价(元)
"coupons": coupons, # 优惠券列表
"main_image": goods.get ("goods_image_url"), # 商品主图
"sales_count": goods.get ("sales_tip") # 销量信息(如 "已售 10 万 +")
}
示例调用
if name == "main":
替换为你的实际参数(从拼多多开放平台获取)
CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"
PID = "your_pid" # 推广位 ID(可选,若无则传 None)
初始化客户端
pdd_api = PDDAPI(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
获取商品到手价(替换为实际商品 ID)
goods_id = "1234567890" # 示例商品 ID
price_info = pdd_api.get_item_final_price (goods_id, pid=PID)
if price_info:
print (f"商品标题:{price_info ['title']}")
print (f"原价:{price_info ['original_price']:.2f} 元")
print (f"到手价(拼团最低):{price_info ['final_price']:.2f} 元")
print (f"销量:{price_info ['sales_count']}")
print ("可用优惠券:")
for coupon in price_info ["coupons"]:
print (f"- {coupon ['coupon_desc']}(满 {coupon ['min_order_amount']} 减 {coupon ['discount']})")
关键说明 - 接口与参数解析
核心接口:pdd.ddk.goods.detail是拼多多联盟获取商品详情的核心接口,支持返回基础价格、优惠券、拼团信息等;
goods_id:商品唯一标识,可从商品详情页 URL 提取;
pid:推广位 ID(可选),通过联盟后台创建,用于获取专属优惠券和佣金,若无则传None。 - 价格单位与计算
拼多多 API 返回的价格单位为 “分”,:
original_price:商品原价(分);
min_group_price:拼团最低价;
优惠券金额(discount)和门槛(min_order_amount)同样以 “分” 为单位。 - 签名规则
拼多多 API 签名生成步骤:
收集所有请求参数(含公共参数和业务参数);
按参数名 ASCII 码升序排序;
拼接为key=value&key=value格式;
末尾拼接client_secret,通过 MD5 加密并转为大写,即为sign参数。 - 权限与限流
权限申请:pdd.ddk.goods.detail接口需开通拼多多联盟权限(个人 / 企业均可申请);
限流策略:默认 QPS 为 10,超限返回429错误,需控制调用频率(如添加 1 秒间隔)。
扩展建议
批量查询:通过goods_id_list参数传入多个商品 ID(JSON 数组),一次获取多个商品价格;
优惠叠加:解析coupons字段,展示 “满减 + 折扣” 等叠加优惠详情;
推广位管理:结合pdd.ddk.pid.generate接口动态创建推广位,跟踪不同渠道的优惠效果。
通过上述脚本,可实现拼多多商品到手价的精准获取,适用于电商比价工具、导购平台、优惠监控系统等场景。实际使用时需参考拼多多开放平台调整参数。