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ública
{
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!
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:
_stripeConfig.WebhookEndpointSecret
contém o segredo "whsec_..."
como uma string, sem espaço em branco ou caracteres de nova linhaRequest.Headers["Stripe-Signature"]
contém o valor do cabeçalho "t=...,v1=...,v0=..."
, sem espaços em branco ou caracteres de nova linhajson
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 temt=, 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
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