如何在使用Stripe创建订阅后获取费用?

时间:2013-08-20 15:22:27

标签: php stripe-payments

我使用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

6 个答案:

答案 0 :(得分:20)

这正是Stripe's webhooks的用途。创建初始订阅的客户后,您将收到六个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,其中包含客户订阅的详细信息。
  7. Stripe的API与许多API和许多支付解决方案一样,可以与webhooks一起使用。如果你没有利用webhooks,那么你将失去功能,而且如果没有webhooks你可能会做得太辛苦了。

    Stripe可以为您提供数据。如果您正在编写代码来轮询Stripe,那么您的工作方式太难了。

答案 1 :(得分:7)

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

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

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

再次注意,如果您重新使用客户,只有在创建每个订阅的新客户时,此方法才会起作用。

这当然不太理想。如果收费标识包含在回报中会好得多。即使知道发票ID也至少可以解决重新使用客户的问题,尽管它仍然需要不必要的API调用才能获取发票。

答案 2 :(得分:1)

没有直截了当的方法来做到这一点。但是,如果charge_id subscription等待invoice.payment_succeeded callback,则会有Ruby

我在pseudo中的做法,您可以将其视为PHP代码。您可以使用API # 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 s

执行此操作
"{sales_order_details.order_no}>=5  and 
{sales_order_details.order_no}<=10 and 
{sales_order_details.client_no}='535'"

See structure of ListObject for Invoices

答案 3 :(得分:1)

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

一个python示例:

inv_id = subscription.latest_invoice
inv = stripe.Invoice.retrieve(inv_id)
charge_id = inv.charge

答案 4 :(得分:0)

在搜索如何在Java中提取订阅ID时遇到了这个问题。事实证明,新版本的API(适用于Java的1.7.1)具有内置于订阅对象中的ID字段。对于PHP API也是如此。

答案 5 :(得分:0)

花了一些时间后,我因同样的问题而陷入困境,事实证明这很简单。

第1步:使用订阅ID 作为参数,调用检索所有发票 API。

PHP示例:

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

$invoice中,您将获得费用ID,因此,您可以在此之后获得所有信息。