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 em 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
.
Observação
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. Definido como
off_
para que a Stripe informe que você pretende usar este PaymentMethod para pagamentos fora da sessão, sem a presença do cliente. Esta configuração salva o PaymentMethod no Customer depois da confirmação do PaymentIntent e de todas as outras ações obrigatórias para o usuário. Veja o exemplo de código de salvar cartões depois de um pagamento para saber mais.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 } }
Observação
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.