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

Django集成PayPal Standard Checkout遇TypeError问题求助

问题排查与解决

核心错误原因

TypeError: 'NoneType' object is not callable 出现在 order.create() 行,说明你创建的order不是有效的paypalrestsdk.Order实例——最关键的原因是SDK未完成初始化配置,导致paypalrestsdk.Order()无法生成具备create()方法的实例,反而返回了原始字典或None。此外你的支付捕获逻辑也不符合SDK规范,需要同步修正。


具体解决步骤

1. 完成PayPal SDK初始化

你只导入了SDK但未配置Client ID和Secret,这是遗漏的核心步骤。在视图文件开头添加配置代码:

import paypalrestsdk

# 配置SDK,mode根据环境选sandbox(测试)或live(生产)
paypalrestsdk.configure({
    "mode": "sandbox",
    "client_id": "你的PayPal Client ID",
    "client_secret": "你的PayPal Client Secret"
})

2. 修正Order创建的参数结构

添加items数组更符合PayPal V2 API规范,可避免SDK解析异常,调整create_order视图:

def create_order(request):
    transaction = json.loads(request.body)
    print('Transaction:', transaction)

    order = paypalrestsdk.Order({
        "intent": "CAPTURE",
        "purchase_units": [{
            "amount": {
                "currency_code": transaction['amount']['currency_code'],
                "value": transaction['amount']['value']
            },
            "description": transaction['description'],
            # 添加items数组,符合PayPal API要求
            "items": [
                {
                    "name": transaction['description'],
                    "quantity": "1",
                    "unit_amount": {
                        "currency_code": transaction['amount']['currency_code'],
                        "value": transaction['amount']['value']
                    }
                }
            ]
        }]
    })
    print('Order:', order)  # 现在应打印SDK实例,而非原始字典

    if order.create():
        return JsonResponse({"orderID": order.id})
    else:
        return JsonResponse({"error": str(order.error)}, status=400)

3. 修复支付捕获逻辑

你当前用paypalrestsdk.Capture单独创建捕获对象的方式错误,应通过已找到的Order实例调用capture()方法:

def capture_payment(request):
    order_id = json.loads(request.body)['orderID']
    order = paypalrestsdk.Order.find(order_id)
    
    if order and order.status == "CREATED":
        # 直接调用order的capture方法完成支付捕获
        capture_result = order.capture()
        if capture_result.success():
            return JsonResponse({"status": "Payment captured successfully."})
        else:
            return JsonResponse({"error": str(capture_result.error)}, status=400)
    else:
        return JsonResponse({"error": "Invalid order ID or order not ready for capture."}, status=400)

4. 额外验证项

  • 确认Client ID和Secret对应正确环境(沙箱ID不能用于生产环境,反之亦然)
  • 检查PayPal账号是否开启了Standard Checkout的API权限
  • 测试时确保服务器可正常访问PayPal API(无防火墙/代理拦截)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:42:37