2013-08-20 1 views
9

J'utilise Stripe comme passerelle de paiement. Maintenant, il y a un gros problème qui me dérange.Comment obtenir un identifiant de compte après avoir créé un abonnement avec Stripe?

J'utilise le code ci-dessous pour créer un abonnement:

<?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]", 
)); 

Cela fonctionne très bien, mais je ne peux pas Charge ID de $customer, et j'ai découvert il n'y a aucun moyen Stripe API pour l'obtenir.

Comment l'obtenir lors de la création d'un abonnement? J'ai vraiment besoin de Charge ID.

+0

Vous obtenez l'ID de charge en réponse à une demande de création de charge http://stackoverflow.com/questions/12031063/if-i-have -a-stripe-jeton-d'-un-charger-comment-je-ob-son-charge-id – Anigel

+0

@Anigel Je ne comprends pas. Le code que j'ai fourni a déjà été facturé, pourquoi devrais-je faire une autre demande? – david30xie

+0

Vous ne devriez pas, mais quand vous avez fait la charge était quand vous avez obtenu le charge_id – Anigel

Répondre

17

C'est exactement pour cela que sont Stripe's webhooks. Après avoir créé un client avec une souscription initiale, vous aurez six notifications de webhook:

  1. customer.created, avec les données clients (que vous avez déjà si vous enregistrez ce que le rendement de l'API)
  2. charge.succeeded (ou charge.failed), qui contient les données de charge initiale que vous cherchez
  3. invoice.created, qui est la facture associée
  4. invoice.payment_succeeded (ou invoice.payment_failed), vous indiquant également l'état de la charge
  5. customer.card.created, avec les détails de la nouvelle carte
  6. customer.subscription.created, avec les détails de l'abonnement du client.

L'API de Stripe, comme de nombreuses API et de nombreuses solutions de paiement, est conçue pour être utilisée avec les webhooks. Si vous ne profitez pas des webhooks, il vous manquera des fonctionnalités, et vous travaillerez probablement trop dur pour ce qui peut être fait sans webhooks.

Stripe fonctionne pour vous fournir les données. Si vous écrivez du code pour interroger Stripe, vous travaillez beaucoup trop fort.

+0

Merci, @colinm. J'utilise la même méthode que vous avez suggérée, et je pense que c'est la seule façon de le faire. Merci! – david30xie

+4

semble que le rappel de webhook pour charge.succeeded ne contient pas de subscription_id comme le font les autres notifications. Comment reliez-vous l'appel de charge.succeeded avec l'abonnement d'origine sans avoir à faire une jointure sur la carte et le client car ceux-ci ne sont pas garantis uniques? – thamster

+0

L'utilisation de 'invoice.payment_succeeded' pour cela semble être une bien meilleure option. Il contient un identifiant d'abonnement, un identifiant client et un identifiant de charge (s'il y avait effectivement une charge). AFAIK 'charge.succeeded' ne sera pas renvoyé si quelqu'un a rétrogradé l'abonnement et dispose d'un solde de compte suffisant pour payer la période suivante. –

6

Je viens de rencontrer moi-même le même problème. J'utilise la bibliothèque python mais la réponse est plus sur l'API de Stripe que sur la langue du client.

Finalement, comme je crée un nouveau client à chaque abonnement, j'ai pu consulter la facture par rapport à le customer_id et saisissez son identifiant de charge. Voici ce que le code python pour qui ressemble à:

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

Encore une fois, notez que cette méthode ne fonctionnerait pas si vous êtes à usage des clients, que si la création de nouveaux clients chaque abonnement créer.

Ce n'est certainement pas idéal. Ce serait bien mieux si l'identifiant de charge était inclus dans le retour. Même le fait de connaître l'identifiant de la facture permettrait au moins de résoudre le problème de la réutilisation des clients, bien qu'il nécessiterait toujours un appel d'API inutile pour récupérer la facture.

+1

Les factures sont garanties pour être retournées dans l'ordre, le plus récent en premier. Vous pouvez faire en sorte que Stripe fasse le gros du travail en passant 'count = 1' avec l'identifiant client. – colinm

+0

Considérant que Strip crée la Charge avant la Facture (abonnement) alors ils n'ont aucune raison de ne pas inclure l'ID de charge lors de la création de l'objet de souscription. Moi aussi, j'ai dû utiliser un objet client unique par abonnement pour contourner ce problème. –

+0

@ geo1701: pourquoi est-il nécessaire d'utiliser un objet client unique? Ne sera-t-il pas toujours la facture la plus récente pour le client? – Ashe

0

J'ai rencontré cette question en cherchant comment extraire l'ID d'abonnement en Java. Il s'avère que la nouvelle version de l'API (1.7.1 for Java) a un champ ID intégré directement dans l'objet d'abonnement. La même chose est probablement vraie pour l'API PHP.

+2

La question ne portait pas sur l'identifiant de l'abonnement, mais sur l'identifiant de facturation, votre réponse n'est donc pas pertinente. – KoichiSenada

1

Eh bien, il n'y a pas de moyen simple de le faire. Il y a cependant un hack pour obtenir charge_id pour ce subscription sans attendre invoice.payment_succeededcallback.

Ce que je l'ai fait dans Ruby, vous pouvez traiter cela comme un code pseudo. Peut-être que vous pouvez le faire en utilisant 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

Questions connexes