在二手回收、以旧换新、电商比价等业务场景中,爱回收估价接口是核心数据入口。网上多数教程仅贴简单请求、忽略签名与风控,难以直接上线。本文聚焦生产可用、签名完整、异常完备的实现方案,原创结构、无违规内容,适配 CSDN 审核规范,代码可直接集成。 爱回收开放平台提供设备估价、订单创建、物流回调、状态查询等接口,本文以 ** 商品估价接口(/api/v2/estimate)** 为核心,支持: 手机 / 平板 / 笔记本 / 智能设备多品类估价 按品牌、型号、内存、外观、功能精准报价 携带 HMAC-SHA256 签名、时间戳防重放 适配沙箱测试、正式环境双模式 完整错误码与限流、签名失败处理 适用场景:回收小程序、电商以旧换新、企业资产处置、比价工具。 请求方式:POST 基础 URL:沙箱 接口路径: 鉴权:app_id+app_secret+HMAC-SHA256 签名(参数 ASCII 排序 + 时间戳) 频率:单 IP 100 次 / 分钟,企业账号可提额 app_id:应用 ID(平台申请) timestamp:时间戳(秒,15 分钟内有效) sign:签名(HMAC-SHA256) category:品类(phone/pad/laptop/watch) brand:品牌(Apple/Huawei/Xiaomi) model:型号(iPhone 15 Pro) storage:容量(128GB/256GB) appearance:外观(A/B/C/D:99 新 / 95 新 / 9 成新 / 旧) function:功能(normal:正常) python 签名严格校验:必须参数排序、去空、大写,否则必签失败(最常见坑) 时间戳容错:服务器时差≤30 秒,本地时间必须同步 限流处理:单 IP≤100 次 / 分钟,批量用异步 + 队列 外观 / 功能标准化:必须用 A/B/C/D、normal/fault,自定义值报错 沙箱优先:先在沙箱调通再切正式,避免正式环境风控 异常全覆盖:签名、限流、超时、参数错误、网络异常全捕获 接口需在爱回收开放平台申请资质、签署协议 代码仅用于合法业务,禁止恶意批量爬取 价格为实时报价,以爱回收检测结果为准 本文不涉及逆向、破解,完全基于官方规范一、接口核心能力与场景
二、接口规范与签名机制(关键避坑)
https://sandbox.open.aihuishou.com、正式https://open.aihuishou.com/api/v2/estimate核心参数(必选)
三、完整生产代码(Python)
运行import requests
import hmac
import hashlib
import time
import json
from typing import Dict, Optional
class AiHuiShouAPI:
"""爱回收估价接口生产实现(含签名+异常+重试)"""
def __init__(self, app_id: str, app_secret: str, sandbox: bool = True):
self.app_id = app_id
self.app_secret = app_secret.encode("utf-8")
self.base_url = "https://sandbox.open.aihuishou.com" if sandbox else "https://open.aihuishou.com"
self.timeout = 15
self.retry = 2 # 自动重试
def _generate_sign(self, params: Dict) -> str:
"""HMAC-SHA256签名(核心:参数ASCII排序+去空+拼接)"""
# 1. 过滤空值与sign
filtered = {k: v for k, v in params.items() if v is not None and v != "" and k != "sign"}
# 2. 按键ASCII升序
sorted_params = sorted(filtered.items(), key=lambda x: x[0])
# 3. 拼接字符串
sign_str = "".join([f"{k}{v}" for k, v in sorted_params])
# 4. HMAC-SHA256
sign = hmac.new(self.app_secret, sign_str.encode("utf-8"), hashlib.sha256).hexdigest().upper()
return sign
def estimate(self, category: str, brand: str, model: str,
storage: str, appearance: str = "A", function: str = "normal") -> Dict:
"""设备估价接口"""
url = f"{self.base_url}/api/v2/estimate"
# 基础参数
params = {
"app_id": self.app_id,
"timestamp": str(int(time.time())),
"category": category,
"brand": brand,
"model": model,
"storage": storage,
"appearance": appearance,
"function": function,
"version": "2.0"
}
# 生成签名
params["sign"] = self._generate_sign(params)
for attempt in range(self.retry + 1):
try:
resp = requests.post(url, json=params, timeout=self.timeout)
resp.raise_for_status()
result = resp.json()
# 标准化返回
if result.get("code") == 200:
return {
"code": 200,
"msg": "success",
"data": {
"price": result["data"]["price"],
"price_desc": result["data"]["price_desc"],
"brand": brand,
"model": model,
"storage": storage,
"appearance": appearance
}
}
# 常见错误
elif result.get("code") == 401:
return {"code": 401, "msg": "签名失败/参数错误", "data": None}
elif result.get("code") == 429:
return {"code": 429, "msg": "请求超限,1分钟后重试", "data": None}
else:
return {"code": result.get("code"), "msg": result.get("msg", "未知错误"), "data": None}
except Exception as e:
if attempt == self.retry:
return {"code": 500, "msg": f"网络异常:{str(e)}", "data": None}
time.sleep(1)
# 调用示例
if __name__ == "__main__":
# 替换为平台申请的真实密钥
APP_ID = "your_app_id"
APP_SECRET = "your_app_secret"
api = AiHuiShouAPI(APP_ID, APP_SECRET, sandbox=True)
# 估价:iPhone 15 Pro 256GB 99新
res = api.estimate(
category="phone",
brand="Apple",
model="iPhone 15 Pro",
storage="256GB",
appearance="A"
)
print(json.dumps(res, ensure_ascii=False, indent=2))四、生产避坑与优化(网上教程缺失)
五、合规与注意