深度分析微店API接口,用Python脚本实现

微店(Weidian)作为国内知名的移动端电商平台,其开放平台提供了一系列 API 接口,支持商家通过编程方式管理商品、订单、客户等核心业务。以下将先分析微店 API 的核心特性,再提供基于 Python 的调用示例。

一、微店 API 接口核心特性分析

1. 接口类型与功能范围

微店 API 主要覆盖四大类业务场景:

  • 商品管理 :创建 / 更新商品、获取商品列表、上下架操作等(如item/get接口获取商品详情);
  • 订单管理 :查询订单、更新订单状态、发货操作等(如order/get接口查询订单详情);
  • 客户管理 :获取客户列表、会员信息等(如user/get接口);
  • 营销工具 :优惠券、秒杀活动等接口(如coupon/create接口)。

2. 认证方式

微店 API 采用OAuth 2.0 授权机制,调用前需完成:

  1. 开发者在微店开放平台注册账号,创建应用,获取AppKeyAppSecret
  2. 通过授权流程获取access_token(访问令牌,有效期 2 小时),用于后续接口调用;
  3. 每次请求需在 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. 准备工作

  • 注册微店开发者账号,创建应用,获取AppKeyAppSecret
  • 完成授权流程获取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']} 元")

三、关键注意事项

  1. access_token的获取与刷新

    示例中直接使用了access_token,实际开发中需通过 OAuth 2.0 流程获取(调用/oauth2/access_token接口),并在过期前(2 小时)通过refresh_token刷新。

  2. 签名验证

    部分高权限接口(如支付、退款)需对请求参数签名,签名算法为:

    • 按参数名 ASCII 升序排序;
    • 拼接为key1=value1&key2=value2格式;
    • 拼接appsecret后用 MD5 加密,结果转为大写作为sign参数。
  3. 限流处理

    若触发限流(429错误),需在脚本中添加重试机制(如间隔 1 秒后重试,最多 3 次)。

  4. 数据解析

    微店 API 返回的data字段包含实际业务数据,需根据具体接口文档解析(如商品详情的titleprice,订单的order_nostatus等)。

  5. 合规性

    调用 API 需遵守《微店开放平台服务协议》,禁止高频爬取或滥用数据,敏感操作(如订单修改)需申请对应权限。

四、扩展方向

  • 封装更多接口(如商品上下架、订单发货);
  • 实现access_token自动刷新机制;
  • 集成数据库存储,定期同步商品 / 订单数据;
  • 添加监控告警(如接口错误率过高时通知开发者)。 通过以上脚本和分析,可快速实现微店 API 的调用与业务集成,适用于商家 ERP 系统、数据分析工具等场景
相关推荐
自由的疯12 分钟前
java程序员怎么从Python小白变成Python大拿?(七)
java·后端·trae
张风捷特烈2 小时前
匠心千游 | AI 从零开发 · 一笔画
前端·游戏开发·trae
前端卧龙人13 小时前
trae太强了,帮我生成了动态数据报告页面
trae
前端卧龙人13 小时前
太厉害了,又是不到十分钟,Trae帮我完成了可视化看板的分析页面
trae
堆栈future16 小时前
豆包新模型+PromptPilot体验测评
chatgpt·claude·trae
Goboy18 小时前
超级玛丽:一句话生成的“童年冒险”
trae
Goboy18 小时前
贪食蛇吃果实:一句话生成的“升级版经典”
trae
RustFS1 天前
如何用 Trae + RustFS MCP 实现自然语言对对象存储的操作?
rust·trae
惜鸟1 天前
使用 Trae 2.0 开发初体验
trae