12

Stripe用作支付网关。现在有个大问题困扰着我。

我使用下面的代码来创建订阅:

<?php
require_once('lib/Stripe.php');

Stripe::setApiKey(API_KEY);

$token = $_POST['stripeToken'];

$customer = Stripe_Customer::create(array(
    "card"  => $token,
    "plan"  => $_POST['plan'],
    "email" => "fakeuser@gmail.com",
));

这很好用,但我无法从中获取Charge ID$customer并且我发现无法Stripe API获取它。

创建订阅时如何获取?我真的需要Charge ID

4

6 回答 6

22

这正是Stripe 的 webhook的用途。创建具有初始订阅的客户后,您将收到六个 webhook 通知:

  1. customer.created,以及客户数据(如果您要保存 API 返回的内容,您已经拥有这些数据)
  2. charge.succeeded(或charge.failed),其中包含您要查找的初始费用数据
  3. invoice.created,这是关联的发票
  4. invoice.payment_succeeded(或invoice.payment_failed),也告诉你收费的状态
  5. customer.card.created,以及新卡的详细信息
  6. customer.subscription.created,以及客户订阅的详细信息。

Stripe 的 API 与许多 API 和许多支付解决方案一样,是为与 webhook 一起使用而构建的。如果您没有利用 webhook,那么您将缺少功能,并且您可能正在为没有 webhook 可以完成的工作而努力工作。

Stripe 致力于为您提供数据。如果您正在编写代码来轮询 Stripe,那么您的工作方式太辛苦了。

于 2013-09-07T22:00:02.787 回答
7

我自己也遇到了同样的问题。我正在使用 python 库,但答案更多的是关于 Stripe 的 API,而不是客户端使用的语言。

最终,由于我为每个订阅创建了一个新客户,因此我能够根据 customer_id 查找发票并获取其费用 ID。这是python代码的样子:

stripe_api.Invoice.all(customer=subscribe_result['customer'])['data'][0]['charge']

同样,请注意,如果您重复使用客户,则此方法将不起作用,只有在每次订阅创建时都创建新客户。

这当然不理想。如果在退货中包含费用 ID,那就更好了。即使知道发票 ID 至少可以解决重用客户的问题,尽管它仍然需要不必要的 API 调用来获取发票。

于 2013-08-24T01:36:22.780 回答
4

如果您立即需要费用 ID 并且不能等待 webhook,您可以使用的另一个选项是使用latest_invoice返回的订阅对象上的字段。

一个python示例:

inv_id = subscription.latest_invoice
inv = stripe.Invoice.retrieve(inv_id)
charge_id = inv.charge
于 2019-02-28T23:38:09.080 回答
1

好吧,没有直接的方法可以做到这一点。然而,无需charge_id等待.subscriptioninvoice.payment_succeeded callback

这就是我在 中所做的Ruby,您可以将其视为pseudo代码。也许你可以使用PHP APIs来做到这一点

  # Lets not retrieve all the invoices
  #  use filter
  lower_limit_date = DateTime.strptime(that_subscription.start.to_s, '%s') - 1.hour
  upper_limit_date = 2.hours.from_now

  list_object_of_all_invoices_in_range = Stripe::Invoice.all(
      {
          customer: customer_id,
          date: {
              gt: lower_limit_date.to_i, # Start TimeStamp
              lt: upper_limit_date.to_i # End TimeStamp
          }
      })

  particular_invoice = list_object_of_all_invoices_in_range.data.
      keep_if { |s| s[:subscription] == that_subscription.id }.first

  stripe_charge_id = particular_invoice.charge # gives charge_id

参见ListObjectfor 的结构Invoices

于 2016-04-24T10:07:33.743 回答
0

在搜索如何在 Java 中提取订阅 ID 时遇到了这个问题。原来 API 的新版本(Java 为 1.7.1)在订阅对象中内置了 ID 字段。PHP API 可能也是如此。

于 2014-03-04T18:32:23.110 回答
0

在花了一些时间后,我被同样的问题困住了,事实证明这很简单。

第一步:调用retrieve all invoice API,订阅ID为参数。

PHP 中的示例:

$invoice = \Stripe\Invoice::all(array("subscription" => your_subscription_id)); 

您将获得 Charge ID,因此您可以在$invoice此之后获得所有内容。

于 2018-09-27T12:59:05.690 回答