Stripe webhook 测试在控制器中引发错误
Posted
技术标签:
【中文标题】Stripe webhook 测试在控制器中引发错误【英文标题】:Stripe webhook test throws error in controller 【发布时间】:2022-01-17 14:15:26 【问题描述】:System.NullReferenceException:对象引用未设置为对象的实例
在 D:\Projects\xxxxxxx\Controllers\ApiController.cs:line 60 中的 xxxxx.Controllers.ApiController.Index() 处
我正在使用条带向端点发送测试 api 请求,结果为 500 任何帮助表示赞赏。
如果您有任何进一步的信息,请不要犹豫。
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using System.IO;
using Stripe;
using xxxxx.Services.Interfaces;
using Microsoft.Extensions.Configuration;
using System.Diagnostics;
using xxxxxx.Models;
namespace xxxxxxx.Controllers
[ApiController]
[Route("api/webhook")]
public class ApiController : ControllerBase
private readonly IConfiguration _config;
private readonly IWebhookEventRepository _webhookEventRepository;
public ApiController(IConfiguration config,
IWebhookEventRepository webhookEventRepository)
_config = config;
_webhookEventRepository = webhookEventRepository;
[BindProperty]
public WebhookEvent WebhookEvent get; set;
[HttpPost]
public async Task<IActionResult> Index()
var json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();
Event stripeEvent;
var KeyValue = _config.GetValue<string>("Stripe:WebhookSecret");
try
stripeEvent = EventUtility.ParseEvent(json);
var signatureHeader = Request.Headers["Stripe-Signature"];
stripeEvent = EventUtility.ConstructEvent(json,
signatureHeader, KeyValue);
Console.WriteLine($"Webhook notification with type: stripeEvent.Type found
for stripeEvent.Id");
catch (Exception e)
Console.WriteLine($"Something failed e");
return BadRequest();
try
switch (stripeEvent.Type)
case Events.CustomerSubscriptionCreated:
var subscription = stripeEvent.Data.Object as Subscription;
*LINE 60* WebhookEvent = new WebhookEvent()
EventType = subscription.Object,
Customer = subscription.Customer.ToString(),
CustomerId = subscription.CustomerId,
Created = subscription.Created,
Cancelled = subscription.CancelAt
;
await _webhookEventRepository.Add(WebhookEvent);
break;
case Events.CustomerSubscriptionUpdated:
var update = stripeEvent.Data.Object as Subscription;
break;
case Events.CustomerCreated:
var customer = stripeEvent.Data.Object as Stripe.Customer;
break;
default:
Debug.WriteLine("Default case");
break;
return Ok();
catch (StripeException e)
Console.WriteLine("Error: 0", e.Message);
return BadRequest();
【问题讨论】:
这是第 60 行 WebhookEvent = new WebhookEvent() 【参考方案1】:您确定这是您遇到错误的那一行吗?哪个对象意外为空?
在看到你的行标签之前,我怀疑这可能是与签名验证相关的问题的根源:
stripeEvent = EventUtility.ConstructEvent(json, signatureHeader, KeyValue);
ConstructEvent
必须提供原始请求正文,并且调用 ParseEvent
的前一行可能会改变阅读器,因此您无法在此处使用它。
我建议:
-
尝试删除对
ParseEvent
的多余调用——你不应该这样做
两者都需要
准确调试错误的来源并添加
如果这不允许您弄清楚,请详细说明您的问题
出去。
【讨论】:
谢谢,我今天会检查一下,我认为您可能是正确的。抱歉,我看到的问题质量已被否决。未来我会努力做得更好。以上是关于Stripe webhook 测试在控制器中引发错误的主要内容,如果未能解决你的问题,请参考以下文章
Stripe webhook 测试在执行时返回空表,但适用于 stripe 的 webhook 测试器
如何延迟 Rails 控制器操作,直到 Stripe 的 webhook 成功?
测试 Stripe 的 trial_will_end webhook