淘宝订单接口接入指南:商家授权与数据获取

简介: 该代码实现了淘宝订单API客户端,涵盖授权流程、Token管理及订单数据获取功能。通过OAuth2.0机制确保数据安全,开发者需替换应用信息即可使用。

taobao_order_api.py

import requests
import time
import hashlib
import json
class TaobaoAPI:
    def __init__(self, app_key, app_secret, redirect_uri):
        """初始化淘宝API客户端"""
        self.app_key = app_key
        self.app_secret = app_secret
        self.redirect_uri = redirect_uri
        self.access_token = None
        self.refresh_token = None
        self.token_expire_time = 0
        
        # 淘宝开放平台API端点
        self.auth_url = "https://oauth.taobao.com/authorize"
        self.token_url = "https://oauth.taobao.com/token"
        self.api_url = "https://eco.taobao.com/router/rest"
    def get_authorize_url(self, state=None):
        """生成授权URL,引导商家登录授权"""
        params = {
            "response_type": "code",
            "client_id": self.app_key,
            "redirect_uri": self.redirect_uri,
            "view": "web"  # 可选值: web/wap,决定授权页面的样式
        }
        
        if state:
            params["state"] = state
            
        # 构建授权URL
        query_string = '&'.join([f"{k}={v}" for k, v in params.items()])
        return f"{self.auth_url}?{query_string}"
    def get_access_token(self, code):
        """通过授权码换取Access Token"""
        params = {
            "grant_type": "authorization_code",
            "client_id": self.app_key,
            "client_secret": self.app_secret,
            "code": code,
            "redirect_uri": self.redirect_uri
        }
        
        response = requests.post(self.token_url, data=params)
        result = response.json()
        
        if "access_token" in result:
            self.access_token = result["access_token"]
            self.refresh_token = result.get("refresh_token")
            self.token_expire_time = int(time.time()) + result.get("expires_in", 0)
            return result
        else:
            raise Exception(f"获取AccessToken失败: {result}")
    def refresh_access_token(self):
        """刷新Access Token"""
        if not self.refresh_token:
            raise Exception("没有刷新令牌,无法刷新AccessToken")
            
        if time.time() + 600 > self.token_expire_time:  # 提前10分钟刷新
            params = {
                "grant_type": "refresh_token",
                "client_id": self.app_key,
                "client_secret": self.app_secret,
                "refresh_token": self.refresh_token
            }
            
            response = requests.post(self.token_url, data=params)
            result = response.json()
            
            if "access_token" in result:
                self.access_token = result["access_token"]
                self.refresh_token = result.get("refresh_token", self.refresh_token)
                self.token_expire_time = int(time.time()) + result.get("expires_in", 0)
                return result
            else:
                raise Exception(f"刷新AccessToken失败: {result}")
        return {"message": "Token未过期,无需刷新"}
    def generate_sign(self, params):
        """生成API请求签名"""
        # 按参数名升序排序
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        
        # 拼接参数
        sign_str = self.app_secret
        for k, v in sorted_params:
            if k != "sign" and v is not None:
                sign_str += f"{k}{v}"
        sign_str += self.app_secret
        
        # MD5加密
        return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
    def call(self, method, params=None):
        """调用淘宝API"""
        if not self.access_token:
            raise Exception("请先获取Access Token")
            
        # 检查并刷新token
        self.refresh_access_token()
        
        # 构建公共参数
        public_params = {
            "method": method,
            "app_key": self.app_key,
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
            "format": "json",
            "v": "2.0",
            "sign_method": "md5",
            "session": self.access_token
        }
        
        # 合并参数
        all_params = {**public_params, **(params or {})}
        
        # 生成签名
        all_params["sign"] = self.generate_sign(all_params)
        
        # 发送请求
        response = requests.post(self.api_url, data=all_params)
        return response.json()
    def get_orders(self, start_time, end_time, status="WAIT_SELLER_SEND_GOODS", page_no=1, page_size=20):
        """获取淘宝订单列表
        :param start_time: 订单创建开始时间,格式: yyyy-MM-dd HH:mm:ss
        :param end_time: 订单创建结束时间,格式: yyyy-MM-dd HH:mm:ss
        :param status: 订单状态,默认等待发货
        :param page_no: 页码
        :param page_size: 每页数量
        """
        method = "taobao.trades.sold.get"
        params = {
            "fields": "tid,title,type,status,payment,discount_fee,adjust_fee,post_fee,total_fee,"
                      "pay_time,end_time,created,seller_nick,buyer_nick,buyer_message,"
                      "receiver_name,receiver_state,receiver_city,receiver_district,"
                      "receiver_address,receiver_zip,receiver_mobile,receiver_phone",
            "start_created": start_time,
            "end_created": end_time,
            "status": status,
            "page_no": page_no,
            "page_size": page_size,
            "use_has_next": True
        }
        return self.call(method, params)
# 使用示例
if __name__ == "__main__":
    # 替换为你的应用信息
    APP_KEY = "your_app_key"
    APP_SECRET = "your_app_secret"
    REDIRECT_URI = "https://yourdomain.com/callback"
    
    # 初始化API客户端
    taobao = TaobaoAPI(APP_KEY, APP_SECRET, REDIRECT_URI)
    
    # 1. 生成授权URL,引导商家授权
    auth_url = taobao.get_authorize_url()
    print(f"请访问以下URL进行授权: {auth_url}")
    
    # 2. 用户授权后,会跳转至REDIRECT_URI,并携带code参数
    # 这里需要开发者自己实现接收code的逻辑
    code = input("请输入授权码: ")
    
    # 3. 获取Access Token
    token_result = taobao.get_access_token(code)
    print(f"获取Token成功: {json.dumps(token_result, indent=2)}")
    
    # 4. 获取订单数据
    start_time = "2023-01-01 00:00:00"
    end_time = "2023-01-31 23:59:59"
    orders_result = taobao.get_orders(start_time, end_time)
    
    if "trades_sold_get_response" in orders_result:
        trades = orders_result["trades_sold_get_response"].get("trades", {}).get("trade", [])
        print(f"成功获取{len(trades)}个订单")
        for trade in trades:
            print(f"订单号: {trade['tid']}, 状态: {trade['status']}, 金额: {trade['payment']}")
    else:
        print(f"获取订单失败: {json.dumps(orders_result, indent=2)}")

image.gif

image.png

上述代码实现了一个完整的淘宝订单接口客户端,包括授权流程、Token 管理和订单数据获取。使用时需要替换为自己的应用信息。商家首先需要访问生成的授权 URL 进行登录授权,授权通过后可以获取订单数据。接口使用接口使用OAuth2.0 授权机制,保证了数据的安全性和用户隐私。

相关文章
|
9月前
|
NoSQL API 双11
淘宝订单 API 实战:90% 开发者会踩的 “漏单坑”,我用这 3 招彻底解决
本文深入解析了淘宝订单 API 对接中常见的“漏单”问题,结合实战案例拆解了同步逻辑、漏单原因及解决方案。重点分析了“主动轮询”与“回调通知”两种方式的优缺点,指出高频漏单的三大原因:回调丢包、时间窗口设置错误、订单状态判断不全,并提供对应的解决策略。最后分享了一套“回调 + 轮询”双保险方案,帮助彻底杜绝漏单问题。
|
7月前
|
JSON 监控 数据挖掘
从零到一:淘宝店铺订单API接入全流程指南
淘宝订单API通过订单号获取完整交易数据,支持实时查询买家信息、商品明细及物流状态,适用于订单同步、物流监控与数据分析。采用RESTful设计,JSON格式响应,安全高效,助力电商自动化运营。
|
11月前
|
移动开发 安全 API
VMware vCenter Server 8.0U3g 发布 - 集中管理 vSphere 环境
VMware vCenter Server 8.0U3g 发布 - 集中管理 vSphere 环境
809 0
VMware vCenter Server 8.0U3g 发布 - 集中管理 vSphere 环境
|
11月前
|
人工智能 Kubernetes Devops
VMware vSphere 8.0 Update 3g 下载 - 企业级工作负载平台
VMware vSphere 8.0 Update 3g 下载 - 企业级工作负载平台
838 0
VMware vSphere 8.0 Update 3g 下载 - 企业级工作负载平台
|
10月前
|
人工智能 JSON 监控
从零开始构建AI Agent评估体系:12种LangSmith评估方法详解
AI Agent的评估需覆盖其整个生命周期,从开发到部署,综合考量事实准确性、推理路径、工具选择、结构化输出、多轮对话及实时性能等维度。LangSmith作为主流评估平台,提供了一套全面的评估框架,支持12种评估技术,包括基于标准答案、程序性分析及观察性评估。这些技术可有效监控Agent各组件表现,确保其在真实场景中的稳定性和可靠性。
3907 0
从零开始构建AI Agent评估体系:12种LangSmith评估方法详解
|
11月前
|
XML JSON 缓存
|
11月前
|
人工智能 自然语言处理 监控
怎么推广引流客户句子???技巧分享
用Python构建自动化引流系统的5个核心技术 ▲ 流量转化漏斗模型(配图建议
|
11月前
|
人工智能 算法 数据可视化
怎么推广自己的店铺,方法和技巧
如何用数据驱动思维推广实体店铺 各位技术同仁好
|
11月前
|
缓存 监控 NoSQL
西域平台商品详情接口技术解析:从设计到实现
本文深入探讨了西域平台商品详情接口的设计与实现,涵盖高内聚低耦合、可扩展性、高性能等设计原则,介绍了数据模型设计、RESTful API 实现、缓存策略、异步处理及接口优化等方面内容,旨在提升电商平台接口的稳定性与效率。

热门文章

最新文章