Aller au contenu principal

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:

Snowfall.Web.Mvc/Controllers/InscriptionsController.cs
[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.

info

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.

Snowfall.Application/Services/IAchatService.cs
public interface IAchatService
{
Task<Achat> Create(Achat achat);
Task<Achat?> FindById(string id);
public Task<Achat?> FindByStripeSessionId(string stripeSessionId);
}
Snowfall.Data/Repositories/IAchatRepository.cs
public interface IAchatRepository
{
Task<Achat> Create(Achat achat);
Task<Achat?> FindById(string id);
Task<Achat?> FindByStripeSessionId(string stripeSessionId);
}
attention

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:

Snowfall.Web.Mvc/Controllers/AchatsController.cs
var achat = await _achatService.FindByStripeSessionId(sessionId);

Test

Vous pouvez procéder à un achat/paiement et maintenant la page de confirmation devrait s'afficher!

Imgur