如何在代码中使用唯品会API?
在代码中使用唯品会 API 的流程与其他开放平台类似,核心包括参数准备、签名生成、发送请求和处理响应。以下是详细步骤及示例(以 Python 为例),需先确保已完成唯品会开放平台的入驻并获取相关密钥。
前提条件
- 注册并入驻唯品会开放平台(通常面向企业客户,需完成资质认证)。
- 创建应用,获取
appKey
、appSecret
(API 调用的核心凭证)。 - 申请目标 API 的调用权限(如商品查询、订单管理等),并查阅对应接口文档(参数、请求方式、签名规则等)。
核心步骤(以 “商品详情查询” 接口为例)
1. 了解唯品会 API 的签名规则
唯品会 API 通过签名验证请求合法性,核心规则如下(具体以官方文档为准):
- 收集所有请求参数(包括公共参数和接口私有参数)。
- 按参数名的 ASCII 码升序排序。
- 拼接为
key=value
格式的字符串,并用&
连接,最后拼接appSecret
。 - 对拼接后的字符串进行 MD5 加密(32 位小写),得到签名(
sign
)。
公共参数(通用必传):
参数名 | 说明 |
---|---|
appKey | 你的应用 appKey |
timestamp | 时间戳(毫秒级,如1729152000000 ) |
format | 返回格式(通常为json ) |
v | API 版本号(如1.0 ) |
sign | 签名(按上述规则生成) |
method | 接口名称(如商品详情接口为vip.industry.goods.get ) |
2. 代码实现(Python)
import requests
import hashlib
import time
import urllib.parse# 1. 配置基础信息(替换为你的实际信息)
APP_KEY = "你的appKey"
APP_SECRET = "你的appSecret"
API_DOMAIN = "https://api.vip.com" # 唯品会API网关域名(以官方文档为准)
API_PATH = "/industry/goods/get" # 接口路径(示例,需替换为实际接口)# 2. 生成签名
def generate_sign(params, app_secret):# 按参数名ASCII升序排序sorted_params = sorted(params.items(), key=lambda x: x[0])# 拼接为key=value&key=value格式,最后加appSecretsign_str = "&".join([f"{k}={v}" for k, v in sorted_params]) + app_secret# MD5加密(32位小写)sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest().lower()return sign# 3. 构造请求参数
def build_params(goods_id):# 公共参数public_params = {"appKey": APP_KEY,"timestamp": str(int(time.time() * 1000)), # 毫秒级时间戳"format": "json","v": "1.0","method": "vip.industry.goods.get" # 接口名称(示例)}# 接口私有参数(根据文档填写,如商品ID)private_params = {"goods_id": goods_id # 示例:商品ID}# 合并参数并生成签名all_params = {**public_params,** private_params}all_params["sign"] = generate_sign(all_params, APP_SECRET)return all_params# 4. 发送请求并处理响应
def call_vip_api(goods_id):params = build_params(goods_id)try:# 拼接完整URL(域名+路径)url = f"{API_DOMAIN}{API_PATH}"# 发送GET请求(部分接口可能需要POST,以文档为准)response = requests.get(url, params=params)result = response.json()# 处理响应(根据接口文档解析)if result.get("code") == 0: # 假设0为成功状态码(以实际为准)print("调用成功,商品信息:", result.get("data"))else:print(f"调用失败:code={result.get('code')}, msg={result.get('msg')}")except Exception as e:print(f"请求异常:{str(e)}")# 测试调用(替换为实际商品ID)
if __name__ == "__main__":call_vip_api(goods_id="987654321") # 示例商品ID,需替换为真实值
关键注意事项
- 签名细节:不同接口的签名规则可能略有差异(如是否包含
appSecret
的位置、加密方式),必须严格遵循官方文档,否则会返回 “签名错误”。 - 请求方式:唯品会 API 可能同时支持 GET 和 POST,需根据接口文档指定(例如,复杂参数的接口可能要求 POST)。
- 时间戳有效性:时间戳通常有有效期(如 5 分钟),需确保服务器时间与标准时间同步,避免因时间偏差导致签名失效。
- 频率限制:API 有调用频率限制(如每秒 5 次),高并发场景需添加限流逻辑(如
time.sleep()
)。 - 错误码处理:响应中的
code
字段标识请求状态(如400
参数错误、401
权限不足),需根据官方错误码表排查问题。
其他语言实现思路
- Java:用
TreeMap
排序参数,MessageDigest
生成 MD5,OkHttp
发送请求。 - Node.js:用
Object.keys().sort()
排序,crypto
模块生成 MD5,axios
发送请求。 - PHP:用
ksort()
排序数组,md5()
加密,curl
发送请求。
实际开发时,需以唯品会开放平台的官方文档为准(包括接口路径、参数名、签名规则等),不同接口(如订单、库存)的私有参数差异较大,需针对性调整代码。