首页 > 解决方案 > 使用 Stripe SDK 时如何检索结帐信息

问题描述

这是我的 Web 应用程序中的购物车和结帐流程

我的目的是在结帐后,检索付款信息,例如交易 ID 或付款参考

在我的 ASP.NET MVC 5 应用程序中,我在购物车视图中有以下代码

<div>
@using (Html.BeginForm("", "Cart", FormMethod.Post))
{
     ... here I show products in cart ...

     ... NOTE that I don't have any action in my form ...

     <input type="submit" id="stripe-checkout-button" value="Checkout" />
}
</div>

<script type="text/javascript">
    var stripe = Stripe('@ViewBag.StripePublishKey');
    var checkoutButton = document.getElementById('stripe-checkout-button');

    checkoutButton.addEventListener('click', function () {
        fetch('https://localhost:44323/Cart/CreateCheckoutSession', {
            method: 'POST'
            })
            .then(function(response) {
                return response.json();
            })
            .then(function(session) {
                return stripe.redirectToCheckout({ sessionId: session.id });
            })
            .then(function(result) {
                if (result.error) {
                    alert(result.error.message);
                }
            })
            .catch(function(error) {
                console.error('Error:', error);
            });
    });
</script>

在购物车控制器中,我有以下操作

[HttpPost]
public ActionResult CreateCheckoutSession()
{
    var cart = (ShoppingCart)Session["cart"];
    var options = new SessionCreateOptions
    {
        PaymentMethodTypes = new List<string> { "card" },
        Mode = "payment",
        SuccessUrl = Url.Action("CheckoutSuccessful", "Cart", null, Request.Url.Scheme),
        CancelUrl = Url.Action("CheckoutCancelled", "Cart", null, Request.Url.Scheme),
        PaymentIntentData = new SessionPaymentIntentDataOptions
        {
            CaptureMethod = "manual"
        },
        LineItems = new List<SessionLineItemOptions>()
    };

    foreach (var item in cart.Items)
    {
        // here I add the purchased product. I remove the code for simplification
    }

    var service = new SessionService();
    Session session = service.Create(options);

    ViewBag.SessionId = session.Id;

    return Json(new { id = session.Id });
}

public ActionResult CheckoutSuccessful(string sessionId)
{
    // sessionId is null here. I'm even not sure if I need this parameter

    ShoppingCart cart = (ShoppingCart)Session["cart"];
    return RedirectToAction("Index", "Checkout");
}

public ActionResult CheckoutCancelled()
{
    return RedirectToAction("Index", "Cart");
}

当我点击 Checkout 按钮时,应用程序重定向到 Stripe 支付页面,我可以输入电子邮件和账单信息并点击支付。它运作良好,付款通过。

根据我的设置,应用程序会在此之后重定向到 CheckoutSuccessful 操作。

我在这里缺少的是,在 CheckoutSuccessful 操作中,我需要检索电子邮件地址和帐单地址以及付款或交易 ID。我不知道该怎么做。在 CheckoutSuccessful 中,参数sessionId为空。我不知道我在这里做错了什么或我错过了什么。

感谢帮助。

标签: asp.netasp.net-mvc-5stripe-paymentspayment-gateway

解决方案


{CHECKOUT_SESSION_ID您可以通过附加到成功 URL来确保新创建的结帐会话 ID 包含在成功 URL 中: https ://stripe.com/docs/payments/checkout/custom-success-page#modify-success-url

然后在您的成功 URL 上,您可以从查询参数中获取会话 ID 并检索结帐会话。


推荐阅读