无法使用Python检索Stripe收费

5
我有以下Python代码在Stripe中创建一个费用。
a_charge = stripe.Charge.create(
amount=cents, 
currency="usd",
source=token,
description="my_description",
application_fee=application_fee,
stripe_account=teacher_stripe_id
)

我觉得这个操作成功了,因为它在我的仪表板上显示有一个charge_id。但紧接着在代码中,以下操作失败:

stripe.Charge.retrieve(a_charge.id)

错误信息: 没有这样的收费:somelongstringhere

然而,somelongstringhere确实是我Stripe仪表板上收费详情下的ID。那么为什么Stripe无法检索此收费?这不是正确的ID吗?

3个回答

5

充值调用失败的原因是该充值是在不同账户上创建的。

当您创建充值时:

a_charge = stripe.Charge.create(
  amount=cents, 
  currency="usd",
  source=token,
  description="my_description",
  application_fee=application_fee,
  stripe_account=teacher_stripe_id
)

您需要使用stripe_account参数,该参数指示库在请求中使用Stripe-Account。这用于告诉Stripe的API,该请求是由您的平台代表其连接的帐户之一发出的。
因此,为了检索收费,您需要使用相同的stripe_account参数:
the_same_charge = stripe.Charge.retrieve(a_charge.id, stripe_account= teacher_stripe_id)

话虽如此,在实践中这样做没有什么用。您已经在 a_charge 中拥有了充电对象。如果执行上面的代码,您会发现 a_charge == the_same_charge

更普遍地说,当您已经拥有一个Stripe对象的实例并希望从API获取最新状态时,可以使用 refresh() 方法:

a_charge.refresh()

这将查询API(无需担心stripe_account参数——实例“记住”它,并在后台使用它),并使用从API检索到的值刷新实例的属性。


1
为什么在创建收费后,您需要立即执行stripe.Charge.retrieve(a.charge.id),而您已经在a_charge中拥有数据?
可能会缓存数据并/或广播到多个服务器/数据库。新创建的数据可能需要几秒钟才能读取。

我实际上不想直接这样做 - 最初我是在另一个函数中执行此操作,但它没有起作用,所以我将代码移到了更靠近的位置。然而,我认为这不是问题的原因,因为当我使用stripe.charge.list()时,我实际上看到的是不同的id,而不是返回的那个 - 这可能有什么原因吗? - wcai
返回的ID是什么?至少,前缀是什么? - Antoine Pinsard

1
在这里使用的代码是直接在连接的Stripe账户上创建一个收费。这在Stripe的文档这里中有所涵盖。
由于收费是在连接的账户上进行的,它不会存在于您自己的Stripe账户上,并且预计您无法直接检索它。要执行此操作,您需要再次传递Stripe-Account头,如此处所述。
您的代码应该改为
the_charge = stripe.Charge.retrieve(
    id=a_charge.id,
    stripe_account=teacher_stripe_id)

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