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
相关产品推荐
相关产品推荐

