33-5 Confirmation
Pour afficher la page de confirmation correctement, on doit récupérer la commande à partir du Id
de session Stripe plutôt qu'à partir du Id de la commande.
En effet, lorsque la commande est créée en mode ATTENTE
initialement, on y associe le Id de session Stripe. Lorsque le paiement est effectué, l'utilisateur est redirigé vers notre application avec le Id de session en paramètre.
Pour savoir quelle page de confirmation afficher, on doit donc récupérer l'achat correspondant au Id de session reçu.
De plus, on doit s'assurer d'être en mesure de récupérer ce Id de session via le Query String
sessionId
Modifier la signature et la route de l'action Confirmation
Afin de récupérer le paramètre d'URL (Query String) via la fonction Create
, on doit modifier légèrement sa signature:
[HttpGet("[Action]")]
[Authorize]
public async Task<IActionResult> Confirmation([FromQuery] string sessionId)
Cela permettra de répondre aux requêtes au format /Inscriptions/Confirmation?sessionId=cs_test_[...]
reçues de Stripe.
Il est normal quel votre fonction ait des erreurs maintenant puisque vous avez modifié la signature, en particulier le paramètre id
qui est devenu sessionId
.
Nous allons remédier à la situation.
Créer une nouvelle fonction de service/repository FindByStripeSessionId
Dans l'action de confirmation, une des premières lignes, si ce n'est pas la première, devrait être quelque chose comme ceci:
var achat = await _achatService.FindById(id);
Cependant, le paramètre reçu par l'URL est sessionId
et correspond à la colonne stripe_session_id
de la table inscriptions
.
Afin de récupérer le bon achat, vous devrez créer une nouvelle fonction FindByStripeSessionId
, autant au niveau du service que du repository.
public interface IAchatService
{
Task<Achat> Create(Achat achat);
Task<Achat?> FindById(string id);
public Task<Achat?> FindByStripeSessionId(string stripeSessionId);
}
public interface IAchatRepository
{
Task<Achat> Create(Achat achat);
Task<Achat?> FindById(string id);
Task<Achat?> FindByStripeSessionId(string stripeSessionId);
}
Vous devez faire l'implémentation vous-même des deux fonctions. Celle du repository doit essentiellement faire un SELECT
afin de récupéré l'achat pour lequel stripe_session_id
est celui passé à la fonction.
Le service ne fait qu'appeler le repository.
Récupérer l'achat via StripeSessionId
Finalement, la ligne dans la page de confirmation responsable de récupérer l'achat devient:
var achat = await _achatService.FindByStripeSessionId(sessionId);
Test
Vous pouvez procéder à un achat/paiement et maintenant la page de confirmation devrait s'afficher!