You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求不使用Flask的Xero API Python非Web应用示例代码

不依赖Flask的Xero API Python调用示例

可以直接使用xero-python库完成非Web场景的API调用,核心是通过私有应用或OAuth2离线模式获取凭证,以下是具体示例:

前提准备

  • 已在Xero开发者平台创建对应类型的应用(私有应用适合内部系统,公共/合作伙伴应用支持离线授权)
  • 安装依赖库:
pip install xero-python python-dotenv

私有应用示例(内部系统专用,无需用户授权)

私有应用通过RSA密钥对认证,适合长期运行的后台任务:

from xero_python.api_client import ApiClient, Configuration
from xero_python.api.accounting_api import AccountingApi
import os
from dotenv import load_dotenv

# 加载环境变量(敏感信息存于.env文件,避免硬编码)
load_dotenv()

# 配置API客户端
configuration = Configuration(
    debug=False,
    oauth2_token={
        "client_id": os.getenv("XERO_CLIENT_ID"),
        "client_secret": os.getenv("XERO_CLIENT_SECRET"),
        "private_key": open(os.getenv("XERO_PRIVATE_KEY_PATH")).read(),
        "token_type": "Bearer"
    }
)

with ApiClient(configuration) as api_client:
    accounting_api = AccountingApi(api_client)
    # 获取关联组织信息
    organizations = accounting_api.get_organizations()
    print(f"当前关联组织: {organizations[0].name}")
    
    # 获取账户列表
    accounts = accounting_api.get_accounts()
    print("账户列表:")
    for account in accounts[:5]:
        print(f"- {account.name} (类型: {account.type})")

OAuth2离线模式示例(单次授权后离线访问)

如果需要用户授权但无需持续Web交互,可先通过临时本地服务获取refresh token,后续用该令牌自动刷新访问权限:

from xero_python.api_client import ApiClient, Configuration
from xero_python.api.accounting_api import AccountingApi
from xero_python.oauth2 import OAuth2Credentials
import os
from dotenv import load_dotenv

load_dotenv()

# 初始化凭证(首次授权后保存refresh token,后续直接复用)
credentials = OAuth2Credentials(
    client_id=os.getenv("XERO_CLIENT_ID"),
    client_secret=os.getenv("XERO_CLIENT_SECRET"),
    refresh_token=os.getenv("XERO_REFRESH_TOKEN"),
    expires_at=int(os.getenv("XERO_EXPIRES_AT")) if os.getenv("XERO_EXPIRES_AT") else None
)

# 配置客户端并绑定令牌刷新回调
configuration = Configuration(debug=False, oauth2_token=credentials.token)
api_client = ApiClient(configuration)
api_client.oauth2_token = credentials

# 令牌刷新后自动保存(可替换为写入数据库等逻辑)
def token_saver(token):
    os.environ["XERO_REFRESH_TOKEN"] = token["refresh_token"]
    os.environ["XERO_EXPIRES_AT"] = str(token["expires_at"])

credentials.set_token_saver(token_saver)

# 调用API获取发票数据
with api_client:
    accounting_api = AccountingApi(api_client)
    invoices = accounting_api.get_invoices(statuses=["AUTHORISED"])
    print("已授权发票:")
    for invoice in invoices[:5]:
        print(f"- 编号: {invoice.invoice_number}, 总额: {invoice.total} {invoice.currency_code}")

注意事项

  • 私有应用需在Xero开发者平台上传公钥,且仅能关联单个组织
  • OAuth2离线模式的首次授权需临时搭建简单本地服务(比如用Python自带的http.server)完成,获取refresh token后即可脱离Web环境
  • 所有敏感凭证均需通过环境变量或加密配置文件管理,禁止硬编码到代码中

内容的提问来源于stack exchange,提问作者user21136557

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:00:54