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
Bonjour Néomega,
As-tu pensé à renvoyer un code retour http 200? Il me semble que c'est important pour les webhook stripe...
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
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?
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).
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