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

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密钥直接传入前端上下文属于高危安全问题,虽然和本次报错无关但需要紧急修复。

解决步骤

  1. 修复模型字段类型不匹配问题
    可选两种方案:
    • 将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
      )
      
  2. 优化重复查询逻辑
    调用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
        # 后续保存逻辑不变
    
  3. 增加异常捕获和超时配置
    给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
    
  4. 修复安全隐患
    从返回前端的context中删除razorpay_secret_key字段,密钥绝对不能暴露给客户端,否则会导致支付逻辑被恶意篡改。

内容的提问来源于stack exchange,提问作者Shubham Shejaval

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:57:03