Pular para o conteúdo
Criar conta
ou
Entrar
O logotipo da documentação da Stripe
/
Pergunte à IA
Criar conta
Login
Comece já
Pagamentos
Receita
Plataformas e marketplaces
Gestão de valores
Recursos para desenvolvedores

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:

Estou migrando

Se você estiver migrando uma integração Stripe existente da API Charges, use o guia de migração.

  • 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:

Command Line
Ruby
# Available as a gem sudo gem install stripe
Gemfile
Ruby
# If you use bundler, you can add this line to your Gemfile gem 'stripe'

Coletar dados do cartão
Lado 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.

Inclua o script Stripe.js no cabeçalho de todas as páginas do seu site. O Elements fica automaticamente disponível como recurso do Stripe.js.

<script src="https://js.stripe.com/basil/stripe.js"></script>

Incluir o script em todas as páginas do site permite aproveitar as funções antifraude avançadas da Stripe e a detecção de comportamentos anormais de navegação.

Montar o formulário de pagamentos

Para coletar com segurança dados dos cartões dos clientes, o Elements cria componentes de IU para você hospedados pela Stripe. Eles são colocados no seu formulário de pagamento como um iframe. Para determinar onde os componentes serão inseridos, crie elementos DOM vazios (contêineres) com IDs exclusivos no formulário de pagamento.

index.html
HTML
<form id='payment-form'> <label> Card details <!-- placeholder for Elements --> <div id="card-element"></div> </label> <button type="submit">Submit Payment</button> </form>

Em seguida, crie uma instância do objeto Stripe, fornecendo sua chave de API publicável como o primeiro parâmetro. Em seguida, crie uma instância do objeto Elements e use-a para montar um elemento Card no espaço reservado correspondente da página.

script.js
Visualizar exemplo completo
const stripe = Stripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
); const elements = stripe.elements(); // Set up Stripe.js and Elements to use in checkout form const style = { base: { color: "#32325d", fontFamily: '"Helvetica Neue", Helvetica, sans-serif', fontSmoothing: "antialiased", fontSize: "16px", "::placeholder": { color: "#aab7c4" } }, invalid: { color: "#fa755a", iconColor: "#fa755a" }, }; const cardElement = elements.create('card', {style}); cardElement.mount('#card-element');

O elemento card simplifica o formulário e minimiza o número de campos necessários, inserindo um único campo de entrada flexível que coleta com segurança todos os dados necessários do cartão.

Do contrário, combine os elementos cardNumber, cardExpiry e cardCvc para criar um formulário de cartão flexível, com vários campos.

Observação

Sempre colete um código postal para aumentar as taxas de aceitação de cartão e reduzir fraudes.

O Card Element de uma única linha coleta e envia automaticamente o código postal do cliente à Stripe. Se você criar um formulário de pagamento com Elements divididos (Card Number, Expiry, CVC), adicione um campo de entrada separado para o código postal do cliente.

Criar um PaymentMethod

Por último, use stripe.createPaymentMethod no cliente para obter os dados do cartão e criar um PaymentMethod quando o usuário clicar no botão Enviar.

script.js
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { // We don't want to let default form submission happen here, // which would refresh the page. event.preventDefault(); const result = await stripe.createPaymentMethod({ type: 'card', card: cardElement, billing_details: { // Include any additional collected billing details. name: 'Jenny Rosen', }, }) stripePaymentMethodHandler(result); });

Envie o PaymentMethod ao seu servidor
Lado do cliente

Se o PaymentMethod for criado corretamente, envie o ID dele para o seu servidor.

script.js
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 PaymentIntent
Lado 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_action. Se o pagamento falhar, o status será definido novamente como requires_payment_method 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_payment_method aparece como requires_source e requires_action aparece como requires_source_action.

Command Line
curl
curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d "payment_method"="{{PAYMENT_METHOD_ID}}" \ -d "amount"=1099 \ -d "currency"="usd" \ -d "confirmation_method"="manual" \ -d "confirm"="true"

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_session 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.

Gerenciar outras ações
Lado 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_confirmation. 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.

script.js
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.handleCardAction 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 novamente
Lado 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_payment_method.

Command Line
curl
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -X "POST"

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úmeroDescriçã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_funds.

Veja a lista completa de cartões de teste em nosso guia de testes.

OpcionalColetar novamente um CVC

Esta página foi útil?
SimNão
  • Precisa de ajuda? Fale com o suporte.
  • Participe do nosso programa de acesso antecipado.
  • Confira nosso changelog.
  • Dúvidas? Fale com a equipe de vendas.
  • LLM? Read llms.txt.
  • Powered by Markdoc