You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Blazor Server应用中获取Stripe支付信息

实现方案

你不需要在客户端提前记录支付ID,Stripe Checkout的标准流程本身就支持支付完成后回传会话标识,按以下步骤修改即可:

  • 修正Checkout Session创建配置
    你当前代码里的SuccessUrl存在两个问题:一是缺少闭合引号的语法错误,二是没有配置Stripe的会话ID占位符。将对应行修改为以下内容即可:

    SuccessUrl = "https://localhost:44347/success?session_id={CHECKOUT_SESSION_ID}",
    CancelUrl = "https://localhost:44347/checkout",
    

    *注意:{CHECKOUT_SESSION_ID}是Stripe官方固定的占位符,不需要你提前赋值,支付成功跳转时Stripe会自动将当前会话的真实ID替换到URL参数中。
    额外说明:你当前写死的ClientReferenceId = "paymentid"没有实际作用,这个字段是用来传递你自有系统的业务订单ID的,后续可以通过这个字段关联Stripe支付记录和你自己的业务数据。

  • 在支付成功页提取会话ID并查询支付信息
    在你路由为/success的Blazor组件中,从URL查询参数中提取Stripe回传的session_id,再调用Stripe服务端接口拉取完整会话数据,即可拿到对应的支付ID、支付状态等全部信息,参考实现如下:

    @page "/success"
    @inject NavigationManager NavigationManager
    @using Stripe
    @using Stripe.Checkout
    
    <h3>支付结果</h3>
    <p>@_resultMsg</p>
    
    @code {
        private string _resultMsg;
    
        protected override async Task OnInitializedAsync()
        {
            // 配置Stripe密钥
            StripeConfiguration.ApiKey = Environment.GetEnvironmentVariable("stripe_key");
            
            // 从URL中提取session_id
            var uri = new Uri(NavigationManager.Uri);
            var queryCollection = System.Web.HttpUtility.ParseQueryString(uri.Query);
            var sessionId = queryCollection.Get("session_id");
    
            if (string.IsNullOrWhiteSpace(sessionId))
            {
                _resultMsg = "无效的支付访问请求";
                return;
            }
    
            // 向Stripe服务端查询会话详情
            var sessionService = new SessionService();
            var session = await sessionService.GetAsync(sessionId, new SessionGetOptions
            {
                // 配置展开字段,直接返回关联的支付意图、商品行数据,不需要二次查询
                Expand = new List<string> { "payment_intent", "line_items.data.price.product" }
            });
    
            // 校验支付状态,避免用户手动拼接URL伪造支付成功
            if (session.PaymentStatus == "paid")
            {
                // session.PaymentIntentId就是你需要的全局唯一支付ID
                var paymentId = session.PaymentIntentId;
                var payAmount = session.AmountTotal / 100.0; // Stripe金额单位为最小货币单位(如美分),这里转换为常用单位
                _resultMsg = $"支付成功,支付单号:{paymentId},支付金额:{payAmount} {session.Currency.ToUpper()}";
                
                // 此处编写后续业务逻辑:更新订单状态、发放商品/权益、记录支付流水等
            }
            else
            {
                _resultMsg = "支付未完成,状态:" + session.PaymentStatus;
            }
        }
    }
    
  • 可靠性补充(可选但生产环境建议配置)
    前端跳转的方式存在丢数风险——比如用户支付完成后直接关闭页面,没等跳转到成功页,你的业务逻辑就不会触发。建议配置Stripe Webhook,监听checkout.session.completed事件,Stripe会在支付完成后主动向你配置的服务端接口推送完整的支付数据,不管用户有没有跳转回你的站点,你都能收到支付成功的通知,是正式环境的标准做法。

内容的提问来源于stack exchange,提问作者Ben Junior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:18:15