Как получить charge id после создания подписки с помощью Stripe?

Я использую 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.

5 ответов


это точно полоса это!--10--> для. После создания клиента с первоначальной подпиской вы получите шесть уведомлений 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, С деталями подписки клиента.

API Stripe, как и многие API и многие платежные решения, построен для использования с webhooks. Если вы не пользуетесь webhooks, вам будет не хватать функциональности, и вы, вероятно, слишком много работаете для того, что можно сделать без веб-крючков.

Stripe работает, чтобы доставить вам данные. Если вы пишете код для опроса полосы, вы работаете слишком усердно.


Я только что столкнулся с той же проблемой. Я использую библиотеку python, но ответ больше касается API Stripe, чем языка, на котором находится клиент.

в конечном счете, поскольку я создаю нового клиента с каждой подпиской, я смог найти счет-фактуру против customer_id и захватить его идентификатор заряда. Вот как выглядит код python для этого:

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

опять же, обратите внимание, что этот метод не будет работать, если вы повторно использовать клиентам, только при создании нового клиенты с каждой подпиской создают.

Это, конечно, не идеален. Было бы намного лучше, если бы идентификатор заряда был включен в возврат. Даже зная идентификатор счета-фактуры, по крайней мере, решит проблему повторного использования клиентов, хотя для получения счета все равно потребуется ненужный вызов API.


Ну, нет прямого способа сделать это. Однако есть хак, чтобы получить charge_id для этого subscription в ожидании invoice.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

структура ListObject на Invoices


столкнулся с этим вопросом при поиске способа извлечения идентификатора подписки в Java. Оказывается, новая версия API (1.7.1 для Java) имеет поле ID, встроенное прямо в объект подписки. То же самое, вероятно, верно и для PHP API.


Я застрял над той же проблемой, проведя некоторое время, оказывается, довольно просто.

Шаг 1: Вызов получить все счета API с идентификатор подписки в качестве параметра.

пример в PHP:

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

на $invoice вы получите идентификатор заряда, и, следовательно, вы можете получить все после этого.