微店(Weidian)作为国内知名的移动端电商平台,其开放平台提供了一系列 API 接口,支持商家通过编程方式管理商品、订单、客户等核心业务。以下将先分析微店 API 的核心特性,再提供基于 Python 的调用示例。
一、微店 API 接口核心特性分析
1. 接口类型与功能范围
微店 API 主要覆盖四大类业务场景:
- 商品管理 :创建 / 更新商品、获取商品列表、上下架操作等(如
item/get
接口获取商品详情); - 订单管理 :查询订单、更新订单状态、发货操作等(如
order/get
接口查询订单详情); - 客户管理 :获取客户列表、会员信息等(如
user/get
接口); - 营销工具 :优惠券、秒杀活动等接口(如
coupon/create
接口)。
2. 认证方式
微店 API 采用OAuth 2.0 授权机制,调用前需完成:
- 开发者在微店开放平台注册账号,创建应用,获取
AppKey
和AppSecret
; - 通过授权流程获取
access_token
(访问令牌,有效期 2 小时),用于后续接口调用; - 每次请求需在 HTTP 头部携带
access_token
,格式为:Authorization: Bearer {access_token}
。
3. 接口格式与规范
- 请求协议:HTTPS(确保传输安全);
- 数据格式:请求 / 响应均为 JSON;
- 请求方法:RESTful 风格(GET 查询、POST 创建、PUT 更新等);
- 公共参数 :所有接口需携带
appkey
(应用标识)、timestamp
(时间戳,秒级)、version
(API 版本,如1.0
); - 签名机制 :部分敏感接口(如支付相关)需通过
AppSecret
对参数签名,防止篡改。
4. 限流与报错机制
- 限流 :默认单应用 QPS 限制为 10 次 / 秒,超出返回
429 Too Many Requests
; - 错误码 :通过响应体
errcode
字段标识错误(如40001
表示access_token
无效,40002
表示权限不足)。
二、Python 脚本实现:调用微店 API 示例
以下以 "获取商品详情" 和 "查询订单列表" 为例,演示微店 API 的调用流程,包含认证、请求构造、响应处理及异常处理。
1. 准备工作
- 注册微店开发者账号,创建应用,获取
AppKey
和AppSecret
; - 完成授权流程获取
access_token
(可通过开放平台的 "测试工具" 临时获取,正式环境需通过代码实现授权)。
2. 脚本实现
python
import requests
import json
import time
import logging
from requests.exceptions import RequestException
# 配置日志(记录请求详情和错误)
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
class WeidianAPI:
def __init__(self, app_key, app_secret, access_token):
self.app_key = app_key
self.app_secret = app_secret
self.access_token = access_token
self.base_url = "https://api.weidian.com" # 微店API基础域名
self.headers = {
"Authorization": f"Bearer {self.access_token}",
"Content-Type": "application/json",
"User-Agent": "WeidianAPI-Python/1.0"
}
def _get_common_params(self):
"""生成公共参数(所有接口必填)"""
return {
"appkey": self.app_key,
"timestamp": int(time.time()), # 秒级时间戳
"version": "1.0"
}
def _request(self, method, path, params=None, data=None):
"""通用请求方法,处理参数拼接、异常捕获"""
url = f"{self.base_url}{path}"
# 合并公共参数与接口私有参数
common_params = self._get_common_params()
request_params = {**common_params,** (params or {})}
try:
if method.upper() == "GET":
response = requests.get(
url,
params=request_params,
headers=self.headers,
timeout=10
)
elif method.upper() == "POST":
response = requests.post(
url,
params=request_params,
json=data,
headers=self.headers,
timeout=10
)
else:
logging.error(f"不支持的请求方法:{method}")
return None
# 检查HTTP状态码
response.raise_for_status()
# 解析JSON响应
result = response.json()
logging.info(f"接口调用成功:{path},响应:{json.dumps(result, ensure_ascii=False)}")
# 检查业务错误(微店API的errcode=0表示成功)
if result.get("errcode") != 0:
logging.error(f"业务错误:{result.get('errmsg')}(错误码:{result.get('errcode')})")
return None
return result
except RequestException as e:
logging.error(f"请求异常:{str(e)},URL:{url}")
return None
except json.JSONDecodeError:
logging.error(f"响应不是JSON格式:{response.text},URL:{url}")
return None
def get_product_detail(self, product_id):
"""
获取商品详情(示例接口:item/get)
:param product_id: 商品ID(微店商品的唯一标识)
:return: 商品详情字典或None
"""
path = "/item/get"
params = {"item_id": product_id} # 接口私有参数
return self._request("GET", path, params=params)
def get_order_list(self, start_time, end_time, page=1, page_size=20):
"""
查询订单列表(示例接口:order/list)
:param start_time: 开始时间(Unix时间戳,秒级)
:param end_time: 结束时间(Unix时间戳,秒级)
:param page: 页码(默认1)
:param page_size: 每页条数(默认20,最大100)
:return: 订单列表字典或None
"""
path = "/order/list"
params = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size
}
return self._request("GET", path, params=params)
# 示例调用
if __name__ == "__main__":
# 替换为你的实际参数(从微店开放平台获取)
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
ACCESS_TOKEN = "your_access_token"
# 初始化API客户端
weidian_api = WeidianAPI(APP_KEY, APP_SECRET, ACCESS_TOKEN)
# 1. 获取商品详情(替换为实际商品ID)
product_id = "12345678" # 示例商品ID
product_detail = weidian_api.get_product_detail(product_id)
if product_detail:
print(f"商品名称:{product_detail['data']['title']}")
print(f"商品价格:{product_detail['data']['price']} 元")
# 2. 查询订单列表(查询最近1天的订单)
end_time = int(time.time())
start_time = end_time - 86400 # 24小时前
order_list = weidian_api.get_order_list(start_time, end_time, page=1)
if order_list:
print(f"订单总数:{order_list['data']['total']}")
for order in order_list['data']['orders'][:3]: # 打印前3条订单
print(f"订单号:{order['order_no']},金额:{order['total_fee']} 元")
三、关键注意事项
-
access_token
的获取与刷新 :示例中直接使用了
access_token
,实际开发中需通过 OAuth 2.0 流程获取(调用/oauth2/access_token
接口),并在过期前(2 小时)通过refresh_token
刷新。 -
签名验证 :
部分高权限接口(如支付、退款)需对请求参数签名,签名算法为:
- 按参数名 ASCII 升序排序;
- 拼接为
key1=value1&key2=value2
格式; - 拼接
appsecret
后用 MD5 加密,结果转为大写作为sign
参数。
-
限流处理 :
若触发限流(
429
错误),需在脚本中添加重试机制(如间隔 1 秒后重试,最多 3 次)。 -
数据解析 :
微店 API 返回的
data
字段包含实际业务数据,需根据具体接口文档解析(如商品详情的title
、price
,订单的order_no
、status
等)。 -
合规性 :
调用 API 需遵守《微店开放平台服务协议》,禁止高频爬取或滥用数据,敏感操作(如订单修改)需申请对应权限。
四、扩展方向
- 封装更多接口(如商品上下架、订单发货);
- 实现
access_token
自动刷新机制; - 集成数据库存储,定期同步商品 / 订单数据;
- 添加监控告警(如接口错误率过高时通知开发者)。 通过以上脚本和分析,可快速实现微店 API 的调用与业务集成,适用于商家 ERP 系统、数据分析工具等场景