Bonjour,

Voila je rencontre un petit problème avec Stripe.

je souhaite gerer les IPN des paiements effectuer

traduction :

une fois le paiement effectué

ipn.php :

if( le payment a reussi ){
echo "super";
et j'incremente ma BDD 
}
else{
echo "paiement refusé";
je redirige vers page x
}

j'essaye ceci :
mais pas bon :

<?php
  require_once('./config.php');

  $token  = $_POST['stripeToken'];
  $email  = $_POST['stripeEmail'];

  //permet de recuperer les valeurs du client pour proceder au paiement 
  $customer = \Stripe\Customer::create(array(
      'email' => $email,
      'source'  => $token
  ));

  //demande le paiement 
  $charge = \Stripe\Charge::create(array(
      'customer' => $customer->id,
      'amount'   => 1000,
      'currency' => 'eur',
      'statement_descriptor' => 'Custom descriptor'
  ));

 $input = @file_get_contents("php://input");
$event_json = json_decode($input);

$event = \Stripe\Event::retrieve($event_json->id);

if(isset($event) && $event->type == "invoice.payment_failed") {
    $customer = \Stripe\Customer::retrieve($event->data->object->customer);
    $customerEmail = $customer->email;
    echo $customerEmail;

    //$stmt = $dbh->prepare("UPDATE users SET subscription = 1 WHERE email = :email");
    //$stmt->bindParam(':email', $customerEmail);
    //$stmt->execute();
}
else{echo "sa a reussi"; echo $event;}
echo "<br><br><br><br><br><br>";
echo $event;

sa ne me retourne que :
stripeToken=tok_1CjYaFHCThedxSR2sJVi6ZYf&stripeTokenType=card&stripeEmail=123@13.fr

9 réponses


Bonjour Néomega,
As-tu pensé à renvoyer un code retour http 200? Il me semble que c'est important pour les webhook stripe...

neomega
Auteur

merci digivia
apres avoir ajouter

http_response_code(200);

je me suis apperçu que le retour qui s'affichait n'etait pas " $event_json "

en faisan comme ceci :

<?php
  require_once('./config.php');

  $token  = $_POST['stripeToken'];
  $email  = $_POST['stripeEmail'];

  //permet de recuperer les valeurs du client pour proceder au paiement 
  $customer = \Stripe\Customer::create(array(
      'email' => $email,
      'source'  => $token
  ));

  //demande le paiement 
  $charge = \Stripe\Charge::create(array(
      'customer' => $customer->id,
      'amount'   => 1000,
      'currency' => 'eur',
      'statement_descriptor' => 'Custom descriptor'
  ));

$input = @file_get_contents("php://input");
$event_json = json_decode($input);

http_response_code(200); // PHP 5.4 or greater
/*
$event = \Stripe\Event::retrieve($event_json->id);

if(isset($event) && $event->type == "invoice.payment_failed") {
    $customer = \Stripe\Customer::retrieve($event->data->object->customer);
    $customerEmail = $customer->email;
    echo $customerEmail;

    //$stmt = $dbh->prepare("UPDATE users SET subscription = 1 WHERE email = :email");
    //$stmt->bindParam(':email', $customerEmail);
    //$stmt->execute();
}
else{echo "sa a reussi"; echo $event;}*/
echo 'la charge : '.$charge;
echo "<br><br><br><br><br><br>";
echo 'event json  : '.$event_json;
echo "<br><br><br><br><br><br>";
echo 'input  : '.$input;

j'ai ce retour :

la charge :
Stripe\Charge JSON: { "id": "ch_1CjqlmHCThedxSR2MqHxoQrd", "object": "charge", "amount": 1000, "amount_refunded": 0, "application": null, "application_fee": null, "balance_transaction": "txn_1CjqlmHCThedxSR2tccDg9Tr", "captured": true, "created": 1530633022, "currency": "eur", "customer": "cus_DAB8qbygWJpwZU", "description": null, "destination": null, "dispute": null, "failure_code": null, "failure_message": null, "fraud_details": [], "invoice": null, "livemode": false, "metadata": [], "on_behalf_of": null, "order": null, "outcome": { "network_status": "approved_by_network", "reason": null, "risk_level": "normal", "seller_message": "Payment complete.", "type": "authorized" }, "paid": true, "receipt_email": null, "receipt_number": null, "refunded": false, "refunds": { "object": "list", "data": [], "has_more": false, "total_count": 0, "url": "\/v1\/charges\/ch_1CjqlmHCThedxSR2MqHxoQrd\/refunds" }, "review": null, "shipping": null, "source": { "id": "card_1CjqlhHCThedxSR2XF2OFMDP", "object": "card", "address_city": null, "address_country": null, "address_line1": null, "address_line1_check": null, "address_line2": null, "address_state": null, "address_zip": null, "address_zip_check": null, "brand": "Visa", "country": "US", "customer": "cus_DAB8qbygWJpwZU", "cvc_check": "pass", "dynamic_last4": null, "exp_month": 10, "exp_year": 2019, "fingerprint": "HHYEBfAZ4l17L1G3", "funding": "credit", "last4": "4242", "metadata": [], "name": "123@13.fr", "tokenization_method": null }, "source_transfer": null, "statement_descriptor": "Custom descriptor", "status": "succeeded", "transfer_group": null }

event json :

input :
stripeToken=tok_1CjqlhHCThedxSR2l69WGwul&stripeTokenType=card&stripeEmail

Donc ça fonctionne comme tu veux?

neomega
Auteur

non je n'ai pas de retour event json pour le retour du paiement OK ou NOK

Pourtant dans ton $event_json on voit :

"seller_message": "Payment complete.", "type": "authorized" }, "paid": true,

et plus loin

"status": "succeeded"

Qu'attends-tu comme retour de Stripe?

neomega
Auteur

sa c'est la creation de la charge de paiement

Effectivement, je commence à comprendre, j'avais mal lu ta question.
En fait les webhook permettent de valider un process : par exemple un abonnement à un service. Du coup, au moment du déclenchement de cet événement chez Stripe (suivant ton paramétrage Stripe sur le dashboard), un événement va déclencher un appel à une page sur ton serveur. A toi ensuite d'envoyer un mail à ton client ou même de bloquer l'accès à ton service à l'utilisateur pour lequel le paiement a été refusé par exemple (ou toute autre action en fonction de tes besoins).

Pour le paiement, ça ne se passe pas via un webhook, mais dans ton interface via l'api, lorsque le client achète ton service (dans le cas d'un plan, via Stripe Billing par exemple).
Le webhook n'est pas fait pour enregistrer un nouveau paiement, il est là pour te prévenir qu'un évenement a été déclenché afin que tu prennes les mesures souhaitées... Ta page est alors appelée par Stripe pour un traitement.
Alors que lors du paiement, c'est toi qui fait appel à Stripe pour lancer et valider le paiement.

Je t'invites à voir/revoir la vidéo de @Grafikart à ce sujet, même si la version a évoluée, les grands principes sont toujours valables, et c'est très bien expliqué (comme d'hab).

neomega
Auteur

ok ok
j'ai deja regarder sa video comme toutes ses autres mais c'est dommage il survole seulement le sujet stripe

par exemple ma page index.php :

<?php require_once('./config.php'); 
$ttc = 19;
$ttc_stripe = $ttc * 100;
?>

<form action="ipn.php" method="post">
  <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
          data-key="<?php echo $stripe['publishable_key']; ?>"
          data-description="payer votre commande id: 123"
          data-amount="<?php echo $ttc_stripe;?>"
          data-locale="auto"
          data-currency="eur"
          data-allow-remember-me=false
          data-email="123@13.fr"
          data-name="le nom du site"

          ></script>
          <input type="hidden" name="montant" value="<?php echo $ttc_stripe;?>">
</form>

la page que je nome ipn.php

  require_once('./config.php');

  $token  = $_POST['stripeToken'];
  $email  = $_POST['stripeEmail'];
  $montant = $_POST['montant'];
  //permet de recuperer les valeurs du client pour proceder au paiement 
  $customer = \Stripe\Customer::create(array(
      'email' => $email,
      'source'  => $token
  ));

  //demande le paiement 
  $charge = \Stripe\Charge::create(array(
      'customer' => $customer->id,
      'amount'   => $montant,
      'currency' => 'eur',
      'statement_descriptor' => 'Custom descriptor'
  ));

$input = @file_get_contents("php://input");
    $nombre_caract_a_suppr=20; //on supprime les 23 premier caractere qui empeche le jsondecode
    $charge1=substr($charge,-strlen($charge)+$nombre_caract_a_suppr); 
    $event_json = json_decode($charge1);
    http_response_code(200); // PHP 5.4 or greater

//je recupere les valeur du JSON    
$id_req = $event_json->id; // OK l'id est recuperer
$status = $event_json->status;// OK le statut est recuperer
$amount = $event_json->amount;// OK le montant est recuperer
$outcome=$event_json->outcome->network_status;// OK network_status est recuperer
//je les affiche pour verifier
echo "le client paye :";
echo $amount / 100;
echo " €<br> la transaction a : ";
echo $status;
echo "<br> ou en centime : ";
echo $amount;
echo " €<br>";
echo $outcome;
echo "<br>";
echo "<br><br><br>";
echo $charge1;

sa fonctionne pour presque tout les paiements

mais quant je choisi la carte de test 3Dsecure :

numero de carte : 4000000000003063 required 3D Secure doit être complété pour une charge pour réussir.

j'ai cette erreur :


Erreur fatale: Exception non interceptée 'Stripe \ Error \ Card' avec le message 'Votre carte a été refusée'. dans C: \ Program Files (x86) \ EasyPHP-DevServer-14.1VC9 \ data \ localweb \ mon_stripe \ stripe-php \ lib \ ApiRequestor.php: 185 à partir de la requête API 'req_rYKZF2fCYWEqqP' Stack trace: # 0 C: \ Program Files (x86) \ EasyPHP-DevServer-14.1VC9 \ data \ localweb \ monstrip \ stripe-php \ lib \ ApiRequestor.php (144): Stripe \ ApiRequestor :: specificAPIError ('{? "erreur": {? ...' , 402, Array, Array, Array) # 1 C: \ Program Files (x86) \ EasyPHP-DevServer-14.1VC9 \ données \ localweb \ mon_strip \ stripe-php \ lib \ ApiRequestor.php (430): Stripe \ ApiRequestor- > handleErrorResponse ('{? "erreur": {? ...', 402, Tableau, tableau) # 2 C: \ Fichiers programme (x86) \ EasyPHP-DevServer-14.1VC9 \ data \ localweb \ mon_stripe \ stripe-php \ lib \ ApiRequestor.php (97): Stripe \ ApiRequestor->C: \ Fichiers de programme (x86) \ EasyPHP-DevServer-14.1VC9 \ données \ localweb \ mon_stripe \ stripe-php \ lib \ ApiRequestor.php à la ligne 185

apparement la carte a ete refusé !!!!!! ?

et je n'arrive pas à ajouter dans ma charge :

stripeBillingName

stripeBillingAddressLine1

stripeBillingAddressZip

stripeBillingAddressState

stripeBillingAddressCity

stripeBillingAddressCountry

stripeShippingName

stripeShippingAddressLine1

stripeShippingAddressZip

rayureExpéditionAddressState

stripeExpéditionAddressCity

stripeExpéditionAddressCountry

Je ne connais pas très bien Stripe, mais la doc semble assez claire à ce sujet : https://stripe.com/docs/sources/three-d-secure