Aceite pagamentos com cartão sem webhooks
Saiba como confirmar um pagamento com cartão no servidor e processar solicitações de autenticação de cartão.
Cuidado
A Stripe recomenda usar o Payment Element mais recente em vez do Card Element. Ele permite aceitar várias formas de pagamento com um único Element. Saiba mais sobre quando usar o Card Element e o Payment Element.
Para ter mais opções de suporte e preparo para o futuro, use a integração padrão para pagamentos assíncronos.
Esta integração aguarda a resposta retornada do cliente e finaliza um pagamento no servidor, sem usar webhooks nem processar eventos offline. Apesar de parecer mais simples, ela é difícil de expandir para acompanhar o crescimento da sua empresa e tem várias limitações:
- Só aceita cartões: será preciso programar seu código separadamente para aceitar ACH e formas de pagamento regionais populares.
- Risco de cobrança dupla: ao criar um novo PaymentIntent de forma sincronizada sempre que o cliente tenta pagar, você corre o risco de cobrar o cliente duas vezes. Siga as práticas recomendadas.
- Ações adicionais do cliente: cartões com 3D Secure ou sujeitos a normas como a Autenticação Forte de Cliente exigem mais ações do cliente.
Se decidir usar esta integração, considere essas limitações. Caso contrário, use a integração padrão.
Configurar a Stripe
Primeiro, você precisa de uma conta Stripe. Inscreva-se aqui.
Use nossas bibliotecas oficiais para acessar a API Stripe no seu aplicativo:
Coletar dados do cartãoLado do cliente
Obtenha os dados do cartão do cliente com o Stripe.js e o Stripe Elements. O Elements é um conjunto de componentes de IU pré-configurados para coleta e validação de número de cartão, código postal e data de validade.
Um Stripe Element contém um iframe que envia com segurança os dados de pagamento para a Stripe por uma conexão HTTPS. O endereço da página de checkout também deve iniciar com https://, e não http://, para que sua integração funcione.
Você pode testar sua integração sem usar HTTPS. Habilite-o quando estiver pronto para aceitar pagamentos no modo de produção.
Envie o PaymentMethod ao seu servidorLado do cliente
Se o PaymentMethod for criado corretamente, envie o ID dele para o seu servidor.
const stripePaymentMethodHandler = async (result) => { if (result.error) { // Show error in payment form } else { // Otherwise send paymentMethod.id to your server (see Step 4) const res = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_method_id: result.paymentMethod.id, }), }) const paymentResponse = await res.json(); // Handle server response (see Step 4) handleServerResponse(paymentResponse); } }
Criar um PaymentIntentLado do servidor
Configure um endpoint no seu servidor para receber a solicitação. Esse endpoint também será usado mais à frente, para gerenciar cartões que exijam mais uma etapa de autenticação.
Crie um novo PaymentIntent com o ID do PaymentMethod criado no cliente. Você pode confirmar o PaymentIntent definindo a propriedade confirm como verdadeira quando o PaymentIntent for criado ou invocando confirm após a criação. Também permitimos autorização e captura separadas para pagamentos com cartão.
Se o pagamento exigir ações adicionais, como autenticação do 3D Secure, o status do PaymentIntent será definido como requires_. Se o pagamento falhar, o status será definido novamente como requires_ e você deverá mostrar um erro ao usuário. Se o pagamento não exigir autenticação adicional, uma cobrança será criada e o status do PaymentIntent será definido como succeeded.
Nota
Nas versões do API anteriores a 2019-02-11, requires_ aparece como requires_ e requires_ aparece como requires_.
Para salvar o cartão e poder reutilizá-lo depois, crie um Customer para armazenar o PaymentMethod e insira os seguintes parâmetros ao criar o PaymentIntent:
- cliente. Configurado com o ID do Cliente.
- setup_future_usage. Set to
off_to tell Stripe that you plan to reuse this PaymentMethod for off-session payments when your customer isn’t present. Setting this property saves the PaymentMethod to the Customer after the PaymentIntent is confirmed and any required actions from the user are complete. See the code sample on saving cards after a payment for more details.session
Gerenciar outras açõesLado do cliente
Programe o gerenciamento de situações em que o cliente precisa intervir. Um pagamento normalmente é finalizado após a confirmação no servidor, na etapa 4. No entanto, se o PaymentIntent exigir mais alguma ação do cliente, como autenticação com 3D Secure, este código é acionado.
Use stripe.handleCardAction para acionar a IU para gerenciar a ação do cliente. Se a autenticação for bem-sucedida, o status do PaymentIntent será requires_. Confirme o PaymentIntent novamente no servidor para finalizar o pagamento.
Durante os testes, use um número de cartão para testes com autenticação obrigatória (por exemplo, ) para testar esse fluxo. Se você usar um cartão que não exige autenticação (por exemplo, ), esta parte do fluxo será ignorada, e ela será concluída na etapa 4.
const handleServerResponse = async (response) => { if (response.error) { // Show error from server on payment form } else if (response.requires_action) { // Use Stripe.js to handle the required card action const { error: errorAction, paymentIntent } = await stripe.handleCardAction(response.payment_intent_client_secret); if (errorAction) { // Show error from Stripe.js in payment form } else { // The card action has been handled // The PaymentIntent can be confirmed again on the server const serverResponse = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_intent_id: paymentIntent.id }) }); handleServerResponse(await serverResponse.json()); } } else { // Show success message } }
Nota
stripe. pode levar vários segundos para finalizar. Durante esse período, desative o formulário para impedir que seja reenviado e apresente um indicador de espera, como uma ampulheta. Se receber um erro, mostre-o ao cliente, reative o formulário e oculte o indicador de espera. Se o cliente precisar executar outras ações para finalizar o pagamento, como autenticação, o Stripe.js orienta o cliente durante a execução.
Confirmar o PaymentIntent novamenteLado do servidor
Esse código só é executado quando um pagamento exige autenticação adicional, assim como no gerenciamento da etapa anterior. O código em si não é opcional, porque qualquer pagamento pode exigir essa etapa extra.
Com o mesmo endpoint que você configurou acima, confirme o PaymentIntent mais uma vez para finalizar o pagamento e executar o pedido. Esta confirmação precisa acontecer no máximo uma hora após a tentativa de pagamento. Do contrário, o pagamento falha e volta ao status requires_.
Testar a integração
Vários cartões de teste estão disponíveis para você usar em uma área restrita para assegurar que essa integração esteja pronta. Use-os com qualquer CVC e uma data de validade no futuro.
| Número | Descrição |
|---|---|
| Finaliza e processa o pagamento imediatamente. | |
| Requer autenticação. A Stripe abre uma janela solicitando que o cliente faça a autenticação. | |
Sempre falha, com o código de recusa insufficient_. |
Veja a lista completa de cartões de teste em nosso guia de testes.
OpcionalColetar novamente um CVC
Ao criar pagamentos subsequentes com um cartão salvo, é importante coletar novamente o CVC do cartão para verificar o usuário recorrente e melhorar a proteção antifraude.
Comece relacionando as formas de pagamento associadas ao cliente para determinar qual delas será exibida para nova coleta de CVC. No cliente, use o elemento cardCvc para coletar novamente um valor de CVC de uma das formas de pagamento do usuário e, em seguida, tokenize os dados do CVC usando stripe.createToken.
Depois de enviar o token de CVC para seu servidor, crie um PaymentIntent no servidor com o valor, a moeda e o token de CVC no parâmetro payment_. Assim como os outros tokens, você não pode usar tokens de CVC mais de uma vez, então cada PaymentIntent deve usar seu próprio token de CVC exclusivo.
O pagamento pode ser aprovado mesmo que a verificação CVC seja malsucedida. Para evitar isso, configure suas regras do Radar para bloquear pagamentos quando a verificação CVC falhar.