33-6 Modification du statut de paiement
On peut maintenant payer une commande! 🎉
Cependant, en regardant dans la base de données, le statut de la commande reste à ATTENTE
. En effet, bien qu'on affiche la page de confirmation, aucune interaction n'est effectuée avec l'achat pour changer son statut.
De plus, une colonne stripe_payment_intent_id
devrait permettre de stocker le id
du paiement Stripe, mais cette dernière est à null
puisqu'on ne récupère pas le id
du paiement.
Ce qu'on doit faire sur la page de confirmation:
- Récupérer l'achat dans la base de données à partir du id de session Stripe (déjà fait normalement!)
- Récupérer le contenu la session Stripe à partir du Id de session et de l'API de Stripe
- Récupérer le Id de paiement à partir de la session
- Si le statut du paiement Stripe est
paid
, marquer le paiement dans la BD de notre côté comme payé, en plus d'associer le id de paiement.
Récupérer la session
Vous pouvez récupérer le contenu de la session Stripe à partir de la page confirmation en utilisant StripeSessionService
:
public async Task<IActionResult> Confirmation([FromQuery] string sessionId)
{
var achat = await _achatService.FindByStripeSessionId(sessionId);
if (achat == null) return NotFound();
Session session = _stripeSessionService.Get(sessionId);
return View(achat);
}
//...
Cela fait un appel à l'API de Stripe pour obtenir le détail et le contenu de la session associée au id
.
Vérifier le statut du paiement et obtenir ie id de paiement
Ensuite, on peut vérifier que Stripe a bien traité le paiement (paid
) et obtenir le id
de ce dernier via l'objet de session.
//...
Session session = _stripeSessionService.Get(sessionId);
if (session.PaymentStatus == "paid")
{
string paymentIntentId = session.PaymentIntentId;
}
//...
Marquer l'achat comme payé
L'étape finale est de marquer le paiement comme étant payé, en plus d'y associer le id de paiement.
//...
Session session = _stripeSessionService.Get(sessionId);
if (session.PaymentStatus == "paid")
{
string paymentIntentId = session.PaymentIntentId;
await _achatService.MarquerCommePaye(achat.Id, paymentIntentId);
}
//...
Cette fonction, MarquerCommePaye
n'existe pas. Vous devez la créer, autant au niveau du service que du repository.
La fonction du repository devra utiliser StatusPaiement
pour assigner le bon statut de paiement.
Test
Si le tout est implémenté correctement, le statut de votre commande devrait être PAYE
!
De plus, le Payment Intent Id
devrait correspondre à une entrée de paiement dans Stripe.
C'est ce qui permet de faire le lien entre les paiements de la BD locale et les paiements du côté Stripe.
Vider le panier et suite
N'oubliez pas de vider le panier!
HttpContext.Session.Remove("panier");
Vous voudrez déplacer la suite de la logique du contrôleur dans la condition if (session.PaymentStatus == "paid")
. Autrement, retourner BadRequest()
puisque l'achat n'est pas payé et on ne devrait pas être en mesure d'accéder à la confirmation.