2013-08-20 3 views
9

Я использую 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" => "[email protected]", 
)); 

Это прекрасно работает, но я не могу получить Charge ID от $customer, и я узнал, что нет никакого способа, в Stripe API, чтобы получить его.

Как его получить при создании подписки? Мне действительно нужно Charge ID.

+0

Вы получаете заряд ID в ответ на запрос создания заряда http://stackoverflow.com/questions/12031063/if-i-have -a-stripe-token-from-a-charge-how-do-i-get-its-charge-id – Anigel

+0

@ Анигель Я не понимаю. Код, который я вам предоставил, уже получил заряд, почему я должен сделать еще один запрос на оплату? – david30xie

+0

Вы не должны, но когда вы сделали это, было, когда вы получили charge_id – Anigel

ответ

17

Это именно то, для чего нужны 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, с деталями подписки клиента.

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

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

+0

Спасибо, @colinm. Я использую то же самое, что и вы, и я думаю, что это единственный способ сделать это. Благодаря! – david30xie

+4

похоже, что обратный вызов webhook для charge.succeeded не содержит подписки, как и другие уведомления. Как вы связываете обвинение. Полученный звонок с первоначальной подпиской, не делая попытки присоединиться к карте и клиенту, поскольку они не гарантированы уникальными? – thamster

+0

Использование 'invoice.payment_succeeded' для этого, кажется, намного лучший вариант. Он содержит идентификатор подписки, идентификатор клиента и идентификатор оплаты (если действительно была плата). AFAIK 'charge.succeeded' не будет запущен, если кто-то понизит подписку и получит достаточный остаток на счете, чтобы заплатить за следующий период. –

6

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

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

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

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

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

+1

Счета-фактуры гарантированно будут возвращены по порядку, новее в первую очередь. Вы можете заставить Stripe сделать тяжелый подъем на этом, передав 'count = 1' вместе с идентификатором клиента. – colinm

+0

Учитывая, что Strip создает плату перед счетом-фактурой (подпиской), тогда у них нет причин не включать chargeId при создании объекта подписки. Я тоже должен был использовать уникальный объект клиента на подписку, чтобы обойти эту проблему. –

+0

@ geo1701: почему это требование для использования уникального объекта клиента? Разве он не будет последним фактом для клиента, используемого в любом случае? – Ashe

0

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

+2

Фактический вопрос не касался идентификатора подписки, это был идентификатор заряда, поэтому ваш ответ не имеет значения. – KoichiSenada

1

Ну, нет прямого пути для этого. Однако есть хак, чтобы получить charge_id за это subscription с ожиданием invoice.payment_succeededcallback.

Это как я сделал в Ruby, вы можете рассматривать это как код pseudo. Может быть, вы можете сделать это с помощью PHPAPI s

# 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 

See structure of ListObject for Invoices

Смежные вопросы