Django接收RazorpayX Webhook时获取空QueryDict求助
Django对接RazorpayX Webhook获取空QueryDict的解决办法
问题核心原因:RazorpayX Webhook发送的是JSON格式请求体,而非表单编码数据,Django的request.POST仅能解析application/x-www-form-urlencoded类型的请求,所以会得到空的QueryDict。
解决步骤
1. 正确解析JSON请求体
直接读取request.body并解析为JSON字典,替换原来的request.POST用法:
import json from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def RazorWebhook(request): if request.method == 'POST': # 解码并解析JSON请求体 payload = json.loads(request.body.decode('utf-8')) print('webhook payload=============', payload) # 这里添加你的业务逻辑,比如更新订单状态等 # Webhook只需返回200状态码,无需返回页面 return HttpResponse(status=200)
2. 必须验证Webhook签名(关键)
为了防止伪造请求,一定要验证Razorpay发送的签名,步骤如下:
- 先安装razorpay官方库:
pip install razorpay - 替换代码为带签名验证的版本:
import json import razorpay from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def RazorWebhook(request): if request.method == 'POST': # 替换为你的Razorpay密钥和Webhook密钥 client = razorpay.Client(auth=("你的KEY_ID", "你的KEY_SECRET")) webhook_secret = "你的WEBHOOK_SECRET" try: # 验证签名合法性 client.utility.verify_webhook_signature( request.body, request.headers.get('X-Razorpay-Signature'), webhook_secret ) # 验证通过后解析payload payload = json.loads(request.body.decode('utf-8')) print('合法的Webhook数据:', payload) # 处理业务逻辑 except razorpay.errors.SignatureVerificationError: print('签名验证失败,请求非法') return HttpResponse(status=403) return HttpResponse(status=200)
3. 额外检查项
- 确认Razorpay后台配置的Webhook URL和你的ngrok地址完全一致,且勾选了需要监听的事件(如付款成功、失败等);
- 确保视图返回
200状态码,Razorpay若未收到成功响应会重复发送请求; - 不要使用
render返回页面,Webhook不需要前端页面,返回空的成功响应即可。
内容的提问来源于stack exchange,提问作者Love dazzell
相关产品推荐
相关产品推荐

