【问题标题】:Why does my stripe webhook in .NET Core 5 API get a 500 ERR response only In azure production?为什么我在 .NET Core 5 API 中的条带 webhook 仅在 azure 生产中获得 500 ERR 响应?
【发布时间】:2022-07-23 07:53:01
【问题描述】:

当我的用户成功订阅后,我正在尝试从 Stripe 制作一个简单的网络挂钩来更新我的数据库。

我在条带开发者仪表板的 web-hooks 部分不断收到 500 ERR 响应。

image of 500 ERR in stripe dev dashboard

奇怪的是,只有在我在 Azure 上发布时才会发生这种情况。我假设连接字符串都很好,因为我的所有其他端点都在工作并且在生产中更新我的数据库就好了。我唯一的线索是在上图中,除非有某种方法可以在 Azure 中查看更多错误。

我尝试设置 Azure 以捕获更多错误,但 Azure 庞大且复杂。很难知道我什至应该从哪里开始寻找。如果设置正确,我似乎在错误日志中看不到任何内容。

在我的 PowerShell 中设置转发后,此网络挂钩可在我的本地计算机上运行

stripe listen --forward-to https://localhost:44321/api/payments/webhook

下面是我的 .net webhook。

[HttpPost("webhook")]
public async Task<IActionResult> WebHook([FromBody] HttpContext request)
{
    try
    {
        using (var stripStream = new StreamReader(HttpContext.Request.Body))
        {
            var json = (await stripStream.ReadToEndAsync()).Replace("\r", "");
            string header = Request.Headers["Stripe-Signature"];
            string signature = _stripeSettings.WHSecret.Trim(new char[] { ' ', '\n', '\r' });

            var stripeEvent = EventUtility.ConstructEvent(json, header, signature);

            if (stripeEvent.Type == Events.CustomerSubscriptionCreated)
            {
                var subscription = stripeEvent.Data.Object as Subscription;

                await addSubscriptionToDb(subscription);
            }
            if (stripeEvent.Type == Events.CustomerCreated)
            {
                var customer = stripeEvent.Data.Object as Customer;

                await addCustomerIdToUser(customer);
            }
            else
            {
                Console.WriteLine("Unhandled event type: {0}", stripeEvent.Type);
            }

            return Ok();
        }
    }
    catch (StripeException e)
    {
        return BadRequest();
    }
}

我发现很难知道从哪里以及如何开始解决这个问题,因为我是条带新手和 web-hook 新手。

有谁知道我是否需要调整 Azure 中的设置以不同方式接受 web-hook 或者这可能是我自己的代码?

=======================

我认为问题出在这些代码行之一...在删除这些行和所有 if else 语句后,我得到了 400/500 错误消失

var json = (await stripStream.ReadToEndAsync()).Replace("\r", "");

string header = Request.Headers["Stripe-Signature"];

string signature = _stripeSettings.WHSecret.Trim(new char[] { ' ', '\n', '\r' });

var stripeEvent = EventUtility.ConstructEvent(json, header, signature);

当将这些代码行作为 try 块中的唯一行时,我仍然会在对 Stripe 日志的响应中显示错误 500。

这是我在 azure 中找到的堆栈跟踪

“stackTrace”:“在 Stripe.EventUtility.ValidateSignature(String json, String stripeSignatureHeader, String secret, Int64 容差, Int64 utcNow)\r\n 在 Stripe.EventUtility.ConstructEvent(String json, String stripeSignatureHeader、String secret、Int64 容差、Int64 utcNow,布尔 throwOnApiVersionMismatch)\r\n at Stripe.EventUtility.ConstructEvent(字符串 json,字符串 stripeSignatureHeader,字符串机密,Int64 容差,布尔值 throwOnApiVersionMismatch)\r\n 在 MIP_Back.Controllers.PaymentsController.WebHook() 在 C:\Users\.....

还有一个错误

而且我还发现了以下消息

'System.IntPtr' 实例的序列化和反序列化不是 支持的。路径:$.TargetSite.MethodHandle.Value。序列化和 不支持“System.IntPtr”实例的反序列化。

感谢任何帮助或建议。 谢谢。

【问题讨论】:

  • 理想的答案是一个链接,显示某人如何在 GitHub 上的现有公共项目中使用 Stripe 克服此答案,并假设问题出在代码中,并已部署到 Azure。我希望 Stripe 在部署到实时服务器时能够提供更多关于此类潜在问题的文档。
  • 您的条带设置是否正确配置?这些是通过国际奥委会添加的吗?他们有可能返回null吗?
  • 我相信所有的条纹设置都很好。当我使用 EventUtility.ParseEvent(json); 时,我发现代码一切正常。而不是 ConstructEvent(...)。我还联系了 Stripe,他告诉我他们很快就会回来找我。

标签: .net azure stripe-payments


【解决方案1】:

显示名称。

我通过检查仪表板中的 API 版本和我的 csproj 文件中的包并将我的 nuget 版本升级到 39.124.0 解决了这个问题。

我的仪表板 API 使用版本 2020-08-27,这给了我您在帖子中看到的错误。 "throwOnApiVersionMismatch"

我发现它是 API 版本控制的方式是我将 ConstructEvent 方法的最后一个值设置为 false,这绕过了版本控制。

Event stripeEvent = EventUtility.ConstructEvent(json, Request.Headers["Stripe-Signature"], webhookSecret, 300, false);

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 2020-04-12
    • 2021-12-22
    • 2019-09-14
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多