Asp.net 如何在使用Stripe SDK时检索签出信息

Asp.net 如何在使用Stripe SDK时检索签出信息,asp.net,asp.net-mvc-5,stripe-payments,payment-gateway,Asp.net,Asp.net Mvc 5,Stripe Payments,Payment Gateway,这是我的购物车和结帐流程在我的web应用程序中 我的目的是在结帐后,检索交易Id或付款参考等付款信息 在我的ASP.NETMVC5应用程序中,我在购物车视图中有以下代码 <div> @using (Html.BeginForm("", "Cart", FormMethod.Post)) { ... here I show products in cart ... ... NOTE that I don't have any

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

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

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

<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>

@使用(Html.BeginForm(“,”Cart“,FormMethod.Post))
{
…我在这里展示购物车中的产品。。。
…请注意,我的表格中没有任何动作。。。
}
var stripe=stripe('@ViewBag.StripePublishKey');
var checkoutatton=document.getElementById('stripe-checkout-button');
CheckExutton.addEventListener('click',函数(){
取('https://localhost:44323/Cart/CreateCheckoutSession', {
方法:“发布”
})
.然后(功能(响应){
返回response.json();
})
.然后(功能(会话){
返回stripe.redirectToCheckout({sessionId:session.id});
})
.然后(函数(结果){
if(result.error){
警报(结果、错误、消息);
}
})
.catch(函数(错误){
console.error('error:',error);
});
});
在购物车控制器中,我有以下操作

[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");
}
[HttpPost]
公共操作结果CreateCheckoutSession()
{
var cart=(ShoppingCart)会话[“cart”];
var options=newsessioncreateoptions
{
PaymentMethodTypes=新列表{“卡”},
Mode=“付款”,
SuccessUrl=Url.Action(“CheckoutSuccessful”、“Cart”、null、Request.Url.Scheme),
CancelUrl=Url.Action(“签出取消”,“购物车”,null,Request.Url.Scheme),
PaymentIntentData=新会话PaymentIntentData选项
{
CaptureMethod=“手动”
},
LineItems=新列表()
};
foreach(购物车项目中的可变项目)
{
//这里我添加了购买的产品。为了简化,我删除了代码
}
var service=newsessionservice();
会话=service.Create(选项);
ViewBag.SessionId=session.Id;
返回Json(新的{id=session.id});
}
public ActionResult CheckoutSuccessful(字符串sessionId)
{
//sessionId在这里为空。我甚至不确定是否需要这个参数
ShoppingCart购物车=(ShoppingCart)会话[“购物车”];
返回重定向操作(“索引”、“签出”);
}
公共操作结果签出已取消()
{
返回重定向操作(“索引”、“购物车”);
}
当我点击结帐按钮时,应用程序重定向到条带支付页面,我可以输入电子邮件和账单信息,然后点击支付。它运作良好,付款顺利

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

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


感谢您的帮助。

您可以通过在成功URL中添加
{Checkout\u Session\u ID
来确保新创建的签出会话ID包含在成功URL中:


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

经过几天的研究和尝试,我找到了答案

创建
session
后,我需要将
session.Id
存储在Http session和
CheckoutSuccessful
方法(不需要任何参数)中,我需要调用两个API来检索会话和支付信息,如下所示:

var service = new SessionService();
var session = service.Get(the stored session.Id);

var custService = new CustomerService();
var customer = custService.Get(session.CustomerId);

var paymentService = new PaymentIntentService();
var payment = paymentService.Get(session.PaymentIntentId);

然后,我将在
session
customer
payment
对象中拥有所有必需的信息。

当我这样做时,我将CheckoutSuccessful参数更改为(string session\u id),我将session\u id获取为{CHECKOUT\u session id},而不是实际值