Django集成Razorpay支付网关触发Max retries exceeded错误处理
Razorpay HTTPS连接重试耗尽报错根因及解决方案
你遇到的HTTPSConnectionPool(host='api.razorpay.com', port=443): Max retries exceeded with url: /v1/orders报错,本质是Razorpay API请求多次失败后耗尽了内置重试次数,由于是新增TransactionDetails模型存储逻辑后才触发问题,核心原因及解决方法如下:
核心根因
你定义的TransactionDetails模型中renter字段为CharField类型,但代码中直接将post.author(User模型实例)赋值给该字段,保存时Django会隐式处理类型转换,若转换失败会抛出未捕获的异常,触发Django调试模式下的模块重载,重复发起Razorpay API请求,最终导致重试次数耗尽。
其次你的代码存在重复数据库查询:home视图中已经查询过一次对应主键的Post对象,createTransaction函数中又重复执行了一次查询,增加了请求整体耗时,放大了网络波动下API请求超时的概率。
另外你将Razorpay密钥直接传入前端上下文属于高危安全问题,虽然和本次报错无关但需要紧急修复。
解决步骤
- 修复模型字段类型不匹配问题
可选两种方案:- 将
renter字段修改为外键关联User模型,符合数据关联逻辑:# models.py修改 renter = models.ForeignKey(User, on_delete=models.CASCADE, related_name="renter_transactions") - 若坚持用字符串存储,赋值时显式转成字符串:
# createTransaction函数赋值时修改 transaction = TransactionDetails( rentee=request.user, product=product, renter=str(renter), subPeriod=subPeriod, monthlyCharge=montlycharge, deposite=order_amount, address=loc, order_id=payment_order_id )
- 将
- 优化重复查询逻辑
调用createTransaction时直接传递已经查询到的post对象,避免重复查询数据库:# home视图中调用修改为 createTransaction(request, rentee, post, payment_order_id) # createTransaction函数修改为 def createTransaction(request, rentee, post, payment_order_id): renter = post.author product = post.productName subPeriod = post.subscriptionPeriod montlycharge = post.productMonthlyCharge loc = rentee.location order_amount = post.deposite*100 # 后续保存逻辑不变 - 增加异常捕获和超时配置
给Razorpay请求增加超时设置,同时给模型保存逻辑加异常捕获,方便定位问题:# 初始化Razorpay客户端时设置超时 client = razorpay.Client(auth=(razorpay_id, razorpay_secret_key)) client.set_timeout(30) # 视图中请求和保存部分加异常捕获 try: payment_order = client.order.create(dict(amount=order_amount, currency=order_currency, payment_capture=1)) payment_order_id = payment_order['id'] except Exception as e: # 生产环境替换为日志打印 print(f"Razorpay请求异常: {str(e)}") raise try: createTransaction(request, rentee, post, payment_order_id) except Exception as e: print(f"交易记录保存异常: {str(e)}") raise - 修复安全隐患
从返回前端的context中删除razorpay_secret_key字段,密钥绝对不能暴露给客户端,否则会导致支付逻辑被恶意篡改。
内容的提问来源于stack exchange,提问作者Shubham Shejaval
相关产品推荐
相关产品推荐

