订阅后的Stripe收费,从订阅中获取元数据。

8

当我创建一个订阅时,我会设置一些元数据来识别我的订单在数据库中的位置。当我接收到“charge.succeeded” webhook(网络钩子)时,来自订阅的元数据不会传递到此事件中,因此我无法识别与此付款相关的订单。我如何能够在每个与订阅相关的 webhook 中发送元数据。

1个回答

6
订阅的元数据存储在订阅对象上,而不是 Charge 对象上。如果有的话,Charge 与特定的发票相关联,而发票本身与订阅相关联。
无法设置订阅的元数据以便将其传输到相应的 Charge 上。
相反,您可以使用 API 检索 Charge,并使用 Expand 功能一次性获取关联的发票和订阅。
在 PHP 中,它看起来像这样:
$charge = \Stripe\Charge::retrieve(
  array(
    "id" => "ch_1CP95G2eZvKYlo2C4pcS2pxm",
    "expand" => array("invoice.subscription")
  )
);

你可以直接在代码中访问订阅的元数据。

如果有人想基于元数据应用雷达规则怎么办?当您创建订阅时,您会立即付款(这是我想要的,因为如果付款失败,我不想拥有无效的订阅),但这意味着没有时间更新费用以添加元数据。 - GACy20
@GACy20,至少目前来看,Stripe的API不支持这种操作。不幸的是,您必须根据其他标准构建自己的逻辑。 - koopajah
除了使用元数据之外,有没有其他方法能够区分“为什么”进行付款?基本上,我的应用程序可能由于任何数量的原因触发付款,我想根据付款的“类型”(从我的应用程序角度来看的类型!)应用不同的雷达规则。例如:仅接受预付卡进行一次性产品购买,而不是用于定期付款。 - GACy20
根据是否为重复交易、首次交易或自定义元数据,此处可能适用各种规则:https://stripe.com/docs/radar/rules/reference - koopajah
啊,终于发现有一个 is_recurring 字段了... 但是在处理带试用期的订阅时它并没有太大用处.. 我希望如果用户尝试使用预付卡支付,即使订阅在开始时有免费试用期,Subscription::create(...) 也会失败,但是雷达规则只适用于支付(对吗?)所以无法告诉 Stripe “禁止创建使用预付卡的 Subscription”,你只能拒绝支付,而不能拒绝订阅的创建。真遗憾。 - GACy20
如果您在此页面底部的仪表板设置中启用规则,则雷达规则也适用于SetupIntents:https://dashboard.stripe.com/settings/radar - koopajah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接