如何在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

