将 Razorpay 支付网关与 Django 集成导致 CSRF 验证失败

Integrating Razorpay Payment Gateway with Django causing CSRF verification failure

这个问题之前有人问过here,但我没有 50 点声望来继续讨论这个答案本身。

短版

本质上,问题归结为 - 我有一个外部 URL 将 POST 数据发送到我的 Django 应用程序。我想访问此 POST 数据,但 Django 出现 403 错误(缺少 CSRF 令牌)。

详细版

我正在尝试将 Hosted Payment Gateway 的 Razorpay 添加到我的 Django 项目中。我已将 URL 传递给回调函数中的以下函数。

如前一个答案所述,我尝试使用 csrf_exempt 装饰器并在 settings.py 文件中添加 https://api.razorpay.com URL 作为 CSRF_TRUSTED_DOMAINS,但问题仍然存在。支付成功后仍然收到 Django 的 403 错误。

@csrf_exempt
def course_purchase_callback(request):
    payment_id = request.POST.get("razorpay_payment_id")
    order_id = request.POST.get("razorpay_order_id")
    signature = request.POST.get("razorpay_signature")
    client = razorpay.Client(auth=(os.getenv("RZP_ID"), os.getenv("RZP_SECRET")))
    verify = client.utility.verify_payment_signature({
        "razorpay_payment_id": payment_id,
        "razorpay_order_id": order_id,
        "razorpay_signature": signature,
    })

settings.py 文件

..
..
..
CSRF_TRUSTED_ORIGINS = ["https://api.razorpay.com"]
..
..

正在使用的版本:

我在这里缺少什么东西?

好吧,这个问题不久前就解决了。

解决方案是在向 Razorpay 网关发起请求的函数上添加 @csrf_exempt 标记,而不是在接受来自支付网关的请求的函数上。