将 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"]
..
..
正在使用的版本:
- Django = 4.0.3
- Razorpay API = 1.3.0
我在这里缺少什么东西?
好吧,这个问题不久前就解决了。
解决方案是在向 Razorpay 网关发起请求的函数上添加 @csrf_exempt
标记,而不是在接受来自支付网关的请求的函数上。
这个问题之前有人问过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"]
..
..
正在使用的版本:
- Django = 4.0.3
- Razorpay API = 1.3.0
我在这里缺少什么东西?
好吧,这个问题不久前就解决了。
解决方案是在向 Razorpay 网关发起请求的函数上添加 @csrf_exempt
标记,而不是在接受来自支付网关的请求的函数上。