【发布时间】: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