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

Django集成Razorpay支付完成后无法显示成功页,handlerequest返回505错误排查

handlerequest视图错误排查及修复方案

1. 核心触发错误:字段名拼写错误

Order模型中存储订单总价的字段名为total_price,但handlerequest视图中计算支付金额时错误调用了不存在的字段total_amount,直接触发异常返回505:

# 错误代码
amount = order_db.total_amount * 100   #we have to pass in paisa
# 修复为
amount = order_db.total_price * 100

2. Order模型save方法逻辑缺陷

你重写的Order.save方法仅在order_id为空且存在datetime_of_payment的场景下才会调用父类save方法执行数据库写入,支付完成更新订单支付ID、支付状态时,order_id已经生成,不会执行实际的保存操作,会引发后续逻辑异常:

# 原错误save逻辑
def save(self, *args, **kwargs):
        if self.order_id is None and self.datetime_of_payment:
            self.order_id = self.datetime_of_payment.strftime('ORDER%Y%m%dODR') 
            return super(Order,self).save(*args, **kwargs)
# 修复后逻辑,所有场景都执行save,仅在order_id为空时生成编号
def save(self, *args, **kwargs):
        if self.order_id is None and self.datetime_of_payment:
            self.order_id = self.datetime_of_payment.strftime('ORDER%Y%m%dODR') 
        super(Order,self).save(*args, **kwargs)

3. 支付签名校验逻辑错误

Razorpay官方SDK的verify_payment_signature方法校验通过时无返回值,校验失败会直接抛出SignatureVerificationError异常,你当前的if result==None判断逻辑不符合SDK规则:

# 原错误逻辑
result = razorpay_client.utility.verify_payment_signature(params_dict)
if result==None:
    # 后续支付捕获逻辑
# 修复后逻辑
try:
    razorpay_client.utility.verify_payment_signature(params_dict)
    # 校验通过走原有支付捕获、状态修改逻辑
    amount = order_db.total_price * 100
    razorpay_client.payment.capture(payment_id, amount)
    order_db.payment_status = 1
    order_db.save()
    return render(request, 'firstapp/payment/paymentsuccess.html',{'id':order_db.id})
except razorpay.errors.SignatureVerificationError:
    # 校验失败走支付失败逻辑
    order_db.payment_status = 2
    order_db.save()
    return render(request, 'firstapp/payment/paymentfailed.html')

4. 异常捕获优化建议

你当前视图外层用一个大try-except捕获所有异常,直接返回无细节的505提示,不利于排查问题,可临时修改异常捕获逻辑打印具体错误:

# 把最外层的except改为:
except Exception as e:
    print(f"回调错误详情:{str(e)}")
    return HttpResponse(f"505 错误:{str(e)}") 

其他注意点

  • 你生成的order_id存在重复风险,同一日期生成的订单编号前缀完全一致,建议补充随机后缀或毫秒数避免唯一键冲突
  • 本地测试时Razorpay无法回调localhost地址,建议用内网穿透工具把本地服务映射到公网,再将回调地址替换为公网地址

内容的提问来源于stack exchange,提问作者Shreyash mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 23:21:02