Je développe une application qui permettra aux membres de réserver / payer des cours en utilisant Stripe. Cependant, j'ai du mal à mettre à jour l'application pour dire que l'utilisateur a payé avec succès ou non.

L'objectif est que lorsqu'un utilisateur paie, le paiement lui soit attribué et qu'il puisse obtenir une liste des paiements dans son compte. Voici le code que j'ai dans mon contrôleur:

[HttpPost]
public IActionResult PaymentSuccess(Event obj, int memberId, int eventId)
{
    // add member to event attendees? if so just call BookEvent above
    var eventBook = BookEvent(memberId, eventId);
    var result = new { eventBook }; //service.UpdateEventAfterPayment(obj);
    return Json(result);
}

public IActionResult Charge(string stripeEmail, string stripeToken, Event obj)
{
    //var json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();
     var customers = new Stripe.CustomerService();
     var charges = new Stripe.ChargeService();

     var customer = customers.Create(new Stripe.CustomerCreateOptions
     {
       Email = stripeEmail,
       Source = stripeToken
      }) ;

      var charge = charges.Create(new Stripe.ChargeCreateOptions
      {
        Amount = 300,
        Description = "Class Payment",
        Currency="gbp",
        Customer= customer.Id,
        ReceiptEmail= stripeEmail,
        Metadata = new Dictionary<string, string>()
        {
            {"OrderId", "123" },
            {"PostCode", "BT480GY" }
        }
        });

        if(charge.Status == "succeeded")
        {
          string BalanceTransactionId = charge.BalanceTransactionId;
          var email = User.FindFirst("sub")?.Value;
          var customerPaid = charge.Paid;
          customerPaid = true;
          return RedirectToAction(nameof(Index));
        }
          return RedirectToAction(nameof(Index));
        }
    }

Et ci-dessous, ce qu'il y a dans mon fichier html:

<div id="eventBook" class="text-center">
                        <form asp-action="Charge" asp-controller="Timetable" method="post">
                            <article>
                                <label>Amount: £3.00</label>
                            </article>
                            <script src="//checkout.stripe.com/v2/checkout.js"
                                    class="stripe-button"
                                    data-key="@Stripe.Value.PublishableKey"
                                    data.locale="auto"
                                    data-description="Class Charge">
                            </script>
                        </form>
                    </div>

Je ne suis pas sûr si je transmets les données correctes de Stripe pour attribuer le paiement à un utilisateur spécifique, qu'ils peuvent ensuite continuer et voir une liste de transactions.

0
pabs095 21 avril 2020 à 14:13

2 réponses

Meilleure réponse

Tant que charges.Create () ne lève pas d'exception, vous pouvez supposer que la charge a réussi. Plus d'informations sur la gestion des erreurs ici:

https://stripe.com/docs/api/errors/handling

Après avoir créé le client, je vous recommande d'enregistrer l'ID client Stripe dans votre base de données ou votre session. Plus tard, lorsque vous souhaitez répertorier les frais facturés par ce client, vous pouvez effectuer l'appel API "lister les frais" et transmettre cet identifiant client pour obtenir uniquement des frais pour ce client: https://stripe.com/docs/api/charges/list#list_charges- client

var customerID = "cus_1234xxx..."; // Retrieved from session or DB

var options = new ChargeListOptions { Limit = 3, Customer = customerID };
var service = new ChargeService();
StripeList<Charge> charges = service.List(
  options
);

J'espère que ça clarifie les choses!

0
hpar 21 avril 2020 à 15:31

Idéalement, vous ne devriez pas vous fier à une corrélation 1-1 entre un client Stripe et un utilisateur de votre système. Il n'y a pas besoin d'un client Stripe, sauf si vous avez des sources de paiement persistantes. Même si vous faites cela, cela ne devrait pas nécessairement être une exigence qu'il y ait un client Stripe pour chaque utilisateur.

La meilleure approche ici consiste à enregistrer l'identifiant de facturation de votre côté et à associer cela à l'utilisateur. Ensuite, vous devriez avoir un point de terminaison webhook pour que Stripe vous avertisse lorsqu'une charge passe. Lorsque le webhook est touché, vous pouvez rechercher le paiement / l'utilisateur de votre côté avec cet identifiant de facturation associé et mettre à jour tout en conséquence.

0
Chris Pratt 21 avril 2020 à 15:34