Stripe SessionCreateOptions设置的client_reference_id未在Webhook返回
问题排查与解决方案
针对你遇到的checkout.session.completed事件中client_reference_id为null的问题,可按以下步骤排查:
1. 验证创建Session时ClientReferenceId的实际值
你的Action标记了[AllowAnonymous],这可能导致User.Identity.GetUserId()返回null——如果用户未登录,这个值本身就是空的,自然无法传到Stripe事件中。
在创建Session后添加日志,确认ClientReferenceId是否被正确赋值:
var session = service.Create(options); // 打印或记录该值,验证是否为预期的用户ID Console.WriteLine($"Session ClientReferenceId: {session.ClientReferenceId}");
如果这里输出null,说明用户未登录,GetUserId()无法获取有效ID。此时需移除[AllowAnonymous],确保仅登录用户可调用该接口:
[HttpPost] // 移除[AllowAnonymous],限制登录用户访问 public ActionResult SendToCheckout(ProcessPaymentViewModel model) { if (!User.Identity.IsAuthenticated) { return RedirectToAction("Login", "Account"); } // 剩余代码不变 }
2. 检查Stripe .NET SDK版本
旧版本的Stripe.NET可能存在字段映射问题,导致ClientReferenceId无法正确同步到Stripe后台。通过NuGet将SDK更新至最新稳定版:
Install-Package Stripe.net -Version [最新版本号]
3. 确认Webhook的API版本
Stripe Webhook事件的API版本需支持返回client_reference_id(2020-08-27及以后的版本均支持):
- 登录Stripe Dashboard,进入Developers > Webhooks
- 找到你的Webhook端点,点击"Edit"
- 在"API version"下拉框中选择最新稳定版本,保存更改
4. 检查Webhook事件原始Payload
在Stripe Dashboard的Webhook日志中,查看checkout.session.completed事件的原始JSON:
- 如果Payload中没有
client_reference_id,说明创建Session时该字段未正确传入,回到第一步排查 - 如果Payload中有该值但代码解析为null,需检查Webhook处理代码的模型映射是否正确
内容的提问来源于stack exchange,提问作者arrrrWallace
相关产品推荐
相关产品推荐

