如何用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)
关键注意事项
- 沙箱环境测试:测试时需使用真实的沙箱买家账户,付款时手动填写备注,确保
custom字段有值;生产环境数据结构与沙箱一致,无需担心差异。 - Webhook可靠性:需在服务器端实现Webhook请求的校验(验证PayPal签名),避免伪造请求;同时添加重试机制,防止网络波动导致的同步失败。
- Odoo同步逻辑:可通过Odoo 16的REST API或RPC接口,根据客户邮箱匹配现有记录,创建或更新客户档案,并关联支付记录完成对账。
内容的提问来源于stack exchange,提问作者uli.james
相关产品推荐
相关产品推荐

