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

如何用Python通过PayPal API或Webhooks实时获取客户支付信息?

实时同步PayPal支付客户信息至Odoo 16的Python方案

核心解决方案

针对你直接收款到PayPal邮箱的场景,可通过优化Webhook事件订阅+补充API调用的方式,实时获取完整的客户姓名、邮箱、支付金额及备注/参考号,无需解析邮件。


步骤1:配置正确的Webhook事件

在PayPal开发者后台配置Webhook时,除了PAYMENT.CAPTURE.COMPLETED,还需订阅PAYMENT.SALE.COMPLETED事件——该事件会在客户直接转账到你的PayPal邮箱时触发,且返回的资源中直接包含部分付款人信息。

同时确保你的PayPal应用拥有payment.read和payer.read的权限,否则无法获取客户详情。


步骤2:通过API获取完整客户信息

场景A:处理PAYMENT.CAPTURE.COMPLETED事件

该事件返回的resource仅包含捕获ID和金额,需额外调用/v2/payments/captures/{capture_id}/payer接口获取付款人信息:

import requests

# PayPal API基础配置
PAYPAL_API_URL = "https://api-m.sandbox.paypal.com"  # 生产环境替换为https://api-m.paypal.com
CLIENT_ID = "你的PayPal客户端ID"
CLIENT_SECRET = "你的PayPal客户端密钥"

# 获取API访问令牌
def get_access_token():
    auth_res = requests.post(
        f"{PAYPAL_API_URL}/v1/oauth2/token",
        headers={"Content-Type": "application/x-www-form-urlencoded"},
        data={"grant_type": "client_credentials"},
        auth=(CLIENT_ID, CLIENT_SECRET)
    )
    auth_res.raise_for_status()
    return auth_res.json()["access_token"]

# 从捕获ID获取付款人信息
def get_payer_from_capture(capture_id):
    token = get_access_token()
    payer_res = requests.get(
        f"{PAYPAL_API_URL}/v2/payments/captures/{capture_id}/payer",
        headers={"Authorization": f"Bearer {token}"}
    )
    payer_res.raise_for_status()
    return payer_res.json()

# 处理Webhook请求示例
def handle_webhook(request_data):
    if request_data["event_type"] == "PAYMENT.CAPTURE.COMPLETED":
        capture = request_data["resource"]
        amount = capture["amount"]["value"]
        # 获取客户信息
        payer_data = get_payer_from_capture(capture["id"])
        customer_name = f"{payer_data['payer']['name']['given_name']} {payer_data['payer']['name']['surname']}"
        customer_email = payer_data["payer"]["email_address"]
        # 获取备注/参考号:优先取custom字段,无则取invoice_id
        reference = capture.get("custom") or capture.get("invoice_id")
        
        # 同步到Odoo的逻辑(需自行实现)
        sync_to_odoo(customer_name, customer_email, amount, reference)

场景B:处理PAYMENT.SALE.COMPLETED事件

该事件返回的resource直接包含付款人信息,无需额外调用API:

def handle_webhook(request_data):
    if request_data["event_type"] == "PAYMENT.SALE.COMPLETED":
        sale = request_data["resource"]
        amount = sale["amount"]["total"]
        # 直接提取客户信息
        customer_name = f"{sale['payer']['payer_info']['first_name']} {sale['payer']['payer_info']['last_name']}"
        customer_email = sale["payer"]["payer_info"]["email"]
        # 提取备注/参考号
        reference = sale.get("custom") or sale.get("invoice_number")
        
        # 同步到Odoo的逻辑
        sync_to_odoo(customer_name, customer_email, amount, reference)

关键注意事项

  1. 沙箱环境测试:测试时需使用真实的沙箱买家账户,付款时手动填写备注,确保custom字段有值;生产环境数据结构与沙箱一致,无需担心差异。
  2. Webhook可靠性:需在服务器端实现Webhook请求的校验(验证PayPal签名),避免伪造请求;同时添加重试机制,防止网络波动导致的同步失败。
  3. Odoo同步逻辑:可通过Odoo 16的REST API或RPC接口,根据客户邮箱匹配现有记录,创建或更新客户档案,并关联支付记录完成对账。

内容的提问来源于stack exchange,提问作者uli.james

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:05:03