微店(Weidian)作为国内知名的移动端电商平台,其开放平台提供了一系列 API 接口,支持商家通过编程方式管理商品、订单、客户等核心业务。以下将先分析微店 API 的核心特性,再提供基于 Python 的调用示例。
一、微店 API 接口核心特性分析
- 接口类型与功能范围
微店 API 主要覆盖四大类业务场景(参考微店开放平台文档):
商品管理:创建 / 更新商品、获取商品列表、上下架操作等(如item/get接口获取商品详情);
订单管理:查询订单、更新订单状态、发货操作等(如order/get接口查询订单详情);
客户管理:获取客户列表、会员信息等(如user/get接口);
营销工具:优惠券、秒杀活动等接口(如coupon/create接口)。 - 认证方式
微店 API 采用OAuth 2.0 授权机制,调用前需完成:
开发者在微店开放平台注册账号,创建应用,获取AppKey和AppSecret;
通过授权流程获取access_token(访问令牌,有效期 2 小时),用于后续接口调用;
每次请求需在 HTTP 头部携带access_token,格式为:Authorization: Bearer {access_token}。 - 接口格式与规范
请求协议:HTTPS(确保传输安全);
数据格式:请求 / 响应均为 JSON;
请求方法:RESTful 风格(GET 查询、POST 创建、PUT 更新等);
公共参数:所有接口需携带appkey(应用标识)、timestamp(时间戳,秒级)、version(API 版本,如1.0);
签名机制:部分敏感接口(如支付相关)需通过AppSecret对参数签名,防止篡改。 - 限流与报错机制
限流:默认单应用 QPS 限制为 10 次 / 秒,超出返回429 Too Many Requests;
错误码:通过响应体errcode字段标识错误(如40001表示access_token无效,40002表示权限不足)。
二、Python 脚本实现:调用微店 API 示例
以下以 “获取商品详情” 和 “查询订单列表” 为例,演示微店 API 的调用流程,包含认证、请求构造、响应处理及异常处理。 - 准备工作
注册微店开发者账号,创建应用,获取AppKey和AppSecret;
完成授权流程获取access_token(可通过开放平台的 “测试工具” 临时获取,正式环境需通过代码实现授权)。 - 脚本实现
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 系统、数据分析工具等场景