Stripe-dotnet: Sempre obtenha "A assinatura do webhook não está presente no cabeçalho Stripe-Signature"

Criado em 13 dez. 2019  ·  8Comentários  ·  Fonte: stripe/stripe-dotnet

Estou usando a faixa de teste para finalizar uma compra via webhook

O webook envia as seguintes informações para mim
json:

{
  "id": "evt_1Fp8QCHONLOCX93ZtvM6ZfBJ",
  "object": "event",
  "api_version": "2019-11-05",
  "created": 1576221524,
  "data": {
    "object": {
      "id": "cs_test_sIivnmE97W8f01Gd9sKZWcHq0d4dtZorGKxo5rCRPn6qrRtkzd5Lu2Ux",
      "object": "checkout.session",
      "billing_address_collection": null,
      "cancel_url": "https://yushuhometest.azurewebsites.net/stripesuccess",
      "client_reference_id": null,
      "customer": "cus_GLq6B0RztXkLmK",
      "customer_email": "[email protected]",
      "display_items": [
        {
          "amount": 360000,
          "currency": "usd",
          "custom": {
            "description": "Annual Individual Sponsor VIP",
            "images": null,
            "name": "Annual Individual Sponsor VIP"
          },
          "quantity": 1,
          "type": "custom"
        }
      ],
      "livemode": false,
      "locale": "en",
      "mode": "payment",
      "payment_intent": "pi_1Fp8Q0HONLOCX93ZB2PHU7ZE",
      "payment_method_types": [
        "card"
      ],
      "setup_intent": null,
      "submit_type": null,
      "subscription": null,
      "success_url": "https://yushuhometest.azurewebsites.net/stripesuccess"
    }
  },
  "livemode": false,
  "pending_webhooks": 2,
  "request": {
    "id": null,
    "idempotency_key": null
  },
  "type": "checkout.session.completed"
}

assinatura de faixa:

["t=1576221525,v1=da12e2b3870f0a97f8c9c22cc33991d716f0a1f9b1a5525fc9e2156cf14c901b,v0=88237c4455f8b2ab2bda2d90f88d215c7969bd10812a677d118ec3af662c2886"]

Stripe Webhook EndpointSecret que usei para a conta de teste atual:


Mas ainda recebo a exceção do Stripe: "A assinatura do webhook não está presente no cabeçalho do Stripe-Signature."

Usei o asp.net core 2.2 para escrever o seguinte código:
`` `c #
[HttpPost ("[ação]")]
tarefa assíncrona públicaGancho()
{
string json = esperar novo StreamReader (HttpContext.Request.Body) .ReadToEndAsync ();
Stripe.Event stripeEvent = stripeEvent = Stripe.EventUtility.ConstructEvent (json, Request.Headers ["Stripe-Signature"], _stripeConfig.WebhookEndpointSecret);
...
}

`` `

Eu me pergunto o que há de errado com o código? Cheguei até a depurar o código de comparação de assinaturas em stripe.net, mas ainda não vejo o problema. Eu falhei na máquina dev (usando CLI com seu próprio segredo) e no servidor de teste em nuvem (usando get secreto do webhook).

Obrigado!

Comentários muito úteis

Na verdade, eu descobri isso; Eu estava usando o segredo do painel, mas o stripe cli fornece um temporário. Não houve necessidade de fazer nenhum corte

Todos 8 comentários

Olá @xqiu. Seu código parece correto e eu recalculei manualmente a assinatura para verificar novamente se é o correto para aquela carga útil.

Eu recomendaria verificar o seguinte:

  • certifique-se de que _stripeConfig.WebhookEndpointSecret contém o segredo "whsec_..." como uma string, sem espaço em branco ou caracteres de nova linha
  • certifique-se de que Request.Headers["Stripe-Signature"] contém o valor do cabeçalho "t=...,v1=...,v0=..." , sem espaços em branco ou caracteres de nova linha
  • certifique-se de que json contém a carga JSON do evento, sem caractere de nova linha à direita após o último caractere }

Obrigado, garantindo o corte das strings que fazem meu código funcionar.

            string jsonOri = await new StreamReader(Request.Body).ReadToEndAsync();
            string json = jsonOri.Trim(new char[] { ' ', '\n', '\r' });
            string header = Request.Headers["Stripe-Signature"];
            string signature = header.Trim(new char[] { ' ', '\n', '\r' });
            try
            {
                Stripe.Event stripeEvent = Stripe.EventUtility.ConstructEvent(json, signature, _stripeConfig.WebhookEndpointSecret, 300, false);

Tentei fazer isso e ainda recebo o erro e posso verificar se ele contém todas as etapas que você mencionou (o segredo do endpoint começa com "whsec_" , o cabeçalho tem t=, v1, v1 sem espaços, etc. e a string json termina com \"payment_intent.created\"\n}" )

Tentei fazer isso e ainda recebo o erro e posso verificar se ele contém todas as etapas que você mencionou (o segredo do endpoint começa com "whsec_" , o cabeçalho tem t=, v1, v1 sem espaços, etc. e a string json termina com \"payment_intent.created\"\n}" )

Você tentou o código que mostrei acima com o corte de json e cabeçalho? Funciona para mim.

Na verdade, eu descobri isso; Eu estava usando o segredo do painel, mas o stripe cli fornece um temporário. Não houve necessidade de fazer nenhum corte

Este problema é inacreditável, muito bem @xqiu !

Estou usando stripe checkout direto para pagamento e webhook configurado, obtendo "A assinatura do webhook não está presente no cabeçalho Stripe-Signature". erro no código abaixo.

string jsonOri = aguardar novo StreamReader (Request.Body) .ReadToEndAsync ();
string json = jsonOri.Trim (novo char [] {'', 'n', 'r'});
string header = Request.Headers ["Stripe-Signature"];
assinatura de string = cabeçalho.Trim (novo char [] {'', 'n', 'r'});

            if (Request.Headers["Stripe-Signature"].Count() > 0)
            {
                // validate webhook called by stripe only
            Stripe.Event stripeEvent  = Stripe.EventUtility.ConstructEvent(json,signature,"whsec_QpG30JY8XXXXXXXXX",300,false);

Eu também atualizei a versão da API para a última 2020-08-27.

@xqiu Por favor,

@ Sonam2020 Entre em contato com nossa equipe de suporte para obter ajuda: https://support.stripe.com/contact

Esta página foi útil?
0 / 5 - 0 avaliações