【问题标题】:Stripe webhook signature is not present条纹 webhook 签名不存在
【发布时间】:2021-01-07 16:06:53
【问题描述】:

我正在尝试在我的网站上集成条带 webhook。最初应用程序仅使用基本条带,然后我将其更改为 Stripe Connect,当我使用基本条带时,所有 webhook 都运行良好,但在将使用更改为 Stripe Connect 之后(实际上只将连接的用户 ID 添加到付款)webhook 通过返回以下错误停止工作:

Stripe.StripeException: The signature for the webhook is not present in the Stripe-Signature header.
   at Stripe.EventUtility.ValidateSignature(String json, String stripeSignatureHeader, String secret, Int64 tolerance, Int64 utcNow)
   at Stripe.EventUtility.ConstructEvent(String json, String stripeSignatureHeader, String secret, Int64 tolerance, Int64 utcNow, Boolean throwOnApiVersionMismatch)
   at Stripe.EventUtility.ConstructEvent(String json, String stripeSignatureHeader, String secret, Int64 tolerance, Boolean throwOnApiVersionMismatch)
   at VisualOrder.Controllers.WebhookController.Stripe() in E:\VS2019\ccc\Controllers\WebhookController.cs:line 22
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

我尚未将 webhook 键更改为 Connect one,但所有发送的 webhook 都返回相同的错误...

这是我的 webhook 的 c# 代码

const string secret = "whsec_kgyb....";
    [HttpPost]
    public async Task<IActionResult> Stripe()
    {
        
        var json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();


        var stripeEvent = EventUtility.ConstructEvent(json,
            Request.Headers["Stripe-Signature"], secret);

        try
        {
            if (stripeEvent.Type == Events.ChargeSucceeded)
            {
                var charge = (Charge)stripeEvent.Data.Object;
                charge.Metadata.TryGetValue("Piva", out string piva);
                charge.Metadata.TryGetValue("OrderId", out string orderID);
                charge.Metadata.TryGetValue("PaymentId", out string paymentID);
                OrdineHelper.ConfirmOrder(piva, orderID, (double)charge.Amount / 100, charge.PaymentIntentId, paymentID);
                return Ok();
            }
            else
            {
                return BadRequest();
            }
        }
        catch (Exception)
        {
            // Invalid Signature
            return BadRequest();
        }
    }

【问题讨论】:

    标签: c# stripe-payments webhooks


    【解决方案1】:

    This error其实是在告诉你expected签名没有找到,而不是no签名找到了。

    请注意,Account and Connect webhooks 是两个不同的 Webhook 端点,因此具有不同的签名机密。您要么需要单独的处理程序,要么需要仔细管理用于每个接收到的事件的秘密。如果您使用的是混合处理程序,则与连接相关的事件将具有 account attribute

    【讨论】:

    • 我知道 Account 和 Connect 是两个不同的 webhook 端点,我还设置了“来自连接的应用程序的端点事件”中的 webhook 密钥,我刚刚在 localhost 中测试了相同的请求通过使用带有 cli 给出的 whsec 的条带 CLI,一切正常,但是当使用从仪表板获取的密钥托管到服务器时,我得到“找不到预期的签名”
    • 实际上在生成一个新的 webhook secret 并将 var stripeEvent = EventUtility.ConstructEvent(json, Request.Headers["Stripe-Signature"], secret); 放入 try catch 之后现在可以工作了
    猜你喜欢
    • 2015-10-07
    • 2016-03-07
    • 2016-09-12
    • 1970-01-01
    • 2012-03-26
    • 2013-12-02
    • 2016-09-17
    • 2013-11-06
    • 1970-01-01
    相关资源
    最近更新 更多