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

使用Stripe Python库时,如何向变更订阅的客户发送邮件?

Stripe订阅修改后自动收费邮件未触发的排查与解决方案

看起来你在处理Stripe订阅修改和自动邮件触发的问题,我来帮你梳理下可能的问题和解决方案:

1. 代码中的拼写与变量引用错误

你的代码里有个明显的拼写错误:定义的变量是susbcriptionID(多了一个字母b),但后续引用时用的是subscription["items"],这会直接触发变量未定义的错误,导致订阅修改操作根本无法执行。另外,stripe.Subscription.retrieve()返回的是完整的订阅对象,不是ID,正确的写法应该把检索到的对象存为subscription,再用它的ID调用修改接口:

修正后的基础代码:

# 正确检索订阅对象,修正变量名拼写
subscription = stripe.Subscription.retrieve("subID")
stripe.Subscription.modify(
    subscription.id,  # 使用订阅对象的ID
    items=[{
        "id": subscription["items"]["data"][0].id,  # 正确引用订阅对象的订阅项
        "plan": "planID",
    }]
)

2. Stripe自动邮件触发的核心条件

根据Stripe的逻辑,成功收费的收据邮件只有在实际完成付款且发票状态为paid时才会自动发送,你可以从这几个维度排查:

  • 确认订阅修改后的收费是否成功:
    默认情况下,订阅修改会立即生效并生成 prorated 发票尝试收费。如果付款方式无效、触发3D验证失败,甚至部分地区网关对极小金额的限制,都会导致收费失败,自然不会触发邮件。你可以在Stripe Dashboard的「订阅列表」里查看对应订阅的latest_invoice状态,也可以在代码里添加校验(示例见下文)。
  • 检查Stripe邮件设置:
    登录Stripe Dashboard,进入「设置 > 电子邮件」,确认「成功付款」的邮件模板处于启用状态,且模板内容未被误修改为不发送。
  • 生产模式下的邮箱限制:
    生产模式中,Stripe不会向未验证的测试邮箱(比如test@example.com这类通用测试邮箱)发送邮件,确保你测试用的客户邮箱是真实有效的,且未被标记为垃圾邮箱。

3. 完善的代码示例(带错误处理与状态校验)

给你一个更健壮的版本,包含错误处理和收费状态校验,方便你排查问题:

import stripe
from django.conf import settings

# 初始化Stripe API密钥
stripe.api_key = settings.STRIPE_SECRET_KEY

try:
    # 检索目标订阅
    subscription = stripe.Subscription.retrieve("sub_your_real_sub_id")
    
    # 获取第一个订阅项的ID(多订阅项场景需调整索引)
    sub_item_id = subscription["items"]["data"][0].id
    
    # 修改订阅计划,配置付款与 prorate 规则
    updated_sub = stripe.Subscription.modify(
        subscription.id,
        items=[{
            "id": sub_item_id,
            "plan": "plan_your_target_plan_id",
        }],
        # 启用 prorate 收费,立即生成发票
        proration_behavior="create_prorations",
        # 处理付款失败,避免订阅直接被取消
        payment_behavior="default_incomplete"
    )
    
    # 检查最新发票的付款状态
    latest_invoice = updated_sub.latest_invoice
    if latest_invoice:
        if latest_invoice.paid:
            print("✅ 收费成功,Stripe会自动向客户发送收据邮件")
        elif latest_invoice.status == "open":
            print("⚠️ 发票已生成但未付款,客户完成付款后才会发送邮件")
        else:
            print(f"❌ 发票状态异常: {latest_invoice.status}")
            
except stripe.error.StripeError as e:
    # 捕获Stripe专属错误(如无效ID、付款失败)
    print(f"Stripe操作失败: {e.user_message}")
except Exception as e:
    # 捕获其他通用错误
    print(f"系统错误: {str(e)}")

额外提示

如果需要在修改订阅时强制发送邮件(哪怕是prorated收费场景),可以在确认发票存在后手动调用发送接口:

# 确认发票存在且未发送时执行
stripe.Invoice.send_invoice(latest_invoice.id)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:20:44