Crie uma integração de assinaturas
Crie e gerencie assinaturas para aceitar pagamentos recorrentes.

Customize com a API Appearance.
Use o Payment Element para criar um formulário de pagamento personalizado que você incorpora à sua inscrição para recolher pagamentos.
See the Embedded components quickstart to learn how to use the Checkout API to create and manage your overall payment flow.
Use este guia para saber como vender assinaturas de preço fixo . você usará o Payment Element para criar um formulário de pagamento personalizado que será incorporado à sua inscrição.
Se não quiser criar um formulário de pagamento personalizado, você pode integrar com o Checkout. Para obter uma versão imersiva desse guia de integração de ponta a ponta, consulte o início rápido do Billing.
Se você não estiver pronto para codificar uma integração, pode configurar assinaturas básicas manualmente no Dashboard. Você também pode usar o Payment Links para configurar assinaturas sem precisar escrever nenhum código. Saiba mais sobre como projetar uma integração para entender as decisões que você precisa tomar e os recursos necessários.
O que você vai criar
Este guia ensina a:
- Criar um catálogo dos produtos.
- Construir um processo de registro que cria um cliente.
- Criar assinaturas e coletar dados de pagamento.
- Testar e monitorar o status do pagamento e da assinatura.
- Permitir que os clientes alterem o plano ou cancelem a assinatura.
- Saiba como usar o modo de faturamento flexível para acessar o comportamento de faturamento aprimorado e recursos adicionais.
Como construir na Stripe
As Assinaturas simplificam o faturamento criando automaticamente Invoices e PaymentIntents para você. Para criar e ativar uma assinatura, você precisa primeiro criar um Product para definir o que está vendendo e um Price, que determina o valor a ser cobrado e a frequência. você também precisa de um Customer para armazenar os PaymentMethods usados para fazer cada pagamento recorrente.
Definições de objetos de API
Recurso | Definição |
---|---|
Cliente | Representa um cliente que compra uma assinatura. Use o objeto Customer associado a uma assinatura para fazer e rastrear cobranças recorrentes e para gerenciar os produtos dos quais têm assinatura. |
Direito | Representa o acesso de um cliente a um recurso incluído em um produto de serviço que assina. Quando você cria uma assinatura para a compra recorrente de um produto por um cliente, um direito ativo é automaticamente criado para cada recurso associado a esse produto. Quando um cliente acessa seus serviços, use os direitos ativos para habilitar os recursos incluídos na assinatura. |
Recurso | Representa uma função ou capacidade que seus clientes podem acessar quando assinam um produto de serviço. Você pode incluir recursos em um produto criando ProductFeatures. |
Fatura | Uma declaração de valores devidos por um cliente que acompanha os status de pagamento desde o esboço até o pagamento (ou outro tipo de finalização). As assinaturas geram faturas automaticamente. |
PaymentIntent | Uma maneira de criar fluxos de pagamentos dinâmicos. Um PaymentIntent acompanha o ciclo de vida do fluxo de checkout de um cliente e aciona etapas adicionais de autenticação quando for exigido por mandatos regulatórios, regras personalizadas contra fraudes do Radar ou formas de pagamento baseadas em redirecionamento. As faturas criam PaymentIntents automaticamente. |
PaymentMethod | As formas de pagamento que um cliente usa para pagar seus produtos. Por exemplo, você pode armazenar um cartão de crédito em um objeto Customer e usá-lo para fazer pagamentos recorrentes para esse cliente. Normalmente usado com as APIs Payment Intents ou Setup Intents. |
Price | Define o preço unitário, a moeda e o ciclo de faturamento de um produto. |
Product | Um produto ou serviço que sua empresa vende. Um produto de serviço pode incluir um ou mais recursos. |
ProductFeature | Representa a inclusão de um único recurso em um único produto. Cada produto está associado a um ProductFeature para cada recurso que é incluído, e cada recurso é associado a um ProductFeature para cada produto que o inclui. |
Subscription | Representa a compra recorrente agendada de um produto por um cliente. Use uma assinatura para coletar pagamentos e fornecer entregas repetidas ou acesso contínuo a um produto. |
Aqui está um exemplo de como produtos, recursos e direitos funcionam juntos. Imagine que você deseja configurar um serviço de assinatura que oferece dois níveis: um produto padrão com funções básicas e um produto avançado que adiciona funções estendidas.
- Você cria dois recursos:
basic_
efeatures extended_
.features - Você cria dois produtos:
standard_
eproduct advanced_
.product - Para o produto padrão, você cria uma ProductFeature que associa
basic_
comfeatures standard_
.product - Para o produto avançado, você cria duas ProductFeatures: uma que associa
basic_
comfeatures advanced_
e outra que associaproduct extended_
comfeatures advanced_
.product
Um cliente, first_
, assina o produto padrão. Quando você cria a assinatura, a Stripe cria automaticamente um Entitlement que associa first_
com basic_
.
Outro cliente, second_
, assina o produto avançado. Quando você cria a assinatura, a Stripe cria automaticamente dois Entitlements: um que associa second_
a basic_
e outro que associa second_
com extended_
.
É possível determinar quais recursos fornecer para um cliente recuperando seus direitos ativos ou escutando o evento Active Entitlement Summary. Você não precisa buscar as assinaturas, os produtos e os recursos dele.
Configurar a Stripe
Instale o cliente Stripe de sua escolha:
Em seguida, instale a Stripe CLI. A CLI fornece testes de webhooks, e você pode executá-la para fazer chamadas de API para a Stripe. Este guia mostra a você como usar a CLI para configurar um modelo de preços em uma seção posterior.
Para obter opções de instalação adicionais, consulte Comece a usar o Stripe CLI.
Criar o modelo de preçosStripe CLI ou Dashboard
Crie seus produtos e preços usando o Dashboard ou a Stripe CLI.
Este exemplo usa um serviço de preço fixo com duas opções diferentes de nível de serviço: Básico e Premium. Para cada opção de nível de serviço, você precisa criar um produto e um preço recorrente. (Se quiser adicionar uma cobrança avulsa para um item como tarifa de configuração, crie um terceiro produto com um preço avulso. Para simplificar, este exemplo não inclui uma cobrança avulsa.)
Neste exemplo, o faturamento de cada produto é mensal. O produto básico custa 5 USD e o produto Premium custa 15 USD.
Criar o clienteCliente e servidor
A Stripe exige um Customer para cada assinatura criada. No front-end da aplicação, colete todas as informações necessárias dos usuários e envie ao servidor.
Se for necessário coletar informações de endereço, o Address Element permite que você colete endereço de entrega ou de cobrança dos seus clientes. Para mais detalhes sobre esse componente, veja a página do Address Element.
<form id="signup-form"> <label> Email <input id="email" type="email" placeholder="Email address" value="test@example.com" required /> </label> <button type="submit"> Register </button> </form>
const emailInput = document.querySelector('#email'); fetch('/create-customer', { method: 'post', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email: emailInput.value, }), }).then(r => r.json());
No servidor, crie o objeto Customer da Stripe.
Observação
Certifique-se de armazenar o ID do cliente para utilizá-lo ao iniciar uma sessão de checkout.
Criar a assinaturaCliente e servidor
Observação
Se você quiser renderizar o Element Payment sem antes criar uma assinatura, consulte Recolher detalhes de pagamento antes de criar uma Intenção.
Permita que o cliente escolha um plano e, em seguida, crie a assinatura. No exemplo deste guia, o cliente escolhe entre o plano Básico e o plano Premium.
No front-end, passe o ID do preço selecionado e o ID do registro do cliente para o back-end.
fetch('/create-subscription', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ priceId: priceId, customerId: customerId, }), })
No back end, crie a assinatura com um status incomplete
usando payment_
. Em seguida, retorne o client_
do primeiro PaymentIntent da assinatura para o front end para concluir o pagamento. Para fazer isso, expanda o confirmation_secret na última fatura da assinatura.
Para ativar o comportamento aprimorado de assinatura , defina billing_
como flexível
. você deve usar a versão da API do Stripe 2025-06-30.basil ou posterior.
Defina save_default_payment_method para on_
para salvar a forma de pagamento como padrão para uma assinatura quando o pagamento for bem-sucedido. Salvar um método de pagamento padrão aumenta a taxa de sucesso de futuros pagamentos de assinatura.
Observação
Se você estiver usando um multi-currency price, use o parâmetro currency para informar à assinatura qual das moedas aceitas deve ser usada. Se você omitir o parâmetro currency
, a assinatura usará a moeda padrão.
A assinatura agora está inativa
e está aguardando pagamento. O exemplo de resposta abaixo destaca os campos mínimos a serem armazenados, mas você pode armazenar os campos que a sua inscrição acessa com frequência.
{ "id": "sub_JgRjFjhKbtD2qz", "object": "subscription", "application_fee_percent": null, "automatic_tax": { "disabled_reason": null, "enabled": false, "liability": "null" }, "billing_cycle_anchor": 1623873347,
Colete dados de pagamentoCliente
Use o Stripe Elements para recolher os detalhes do pagamento e ativar a assinatura. você pode personalizar o Elements para que corresponda à aparência de sua inscrição.
O Payment Element aceita Link, cartões de crédito, débito automático SEPA e débito automático BECS para assinaturas. você pode exibir as formas de pagamento habilitadas e recolher com segurança os detalhes do pagamento com base na seleção do cliente.
Configurar o Stripe Elements
O Payment Element está automaticamente disponível como um recurso do Stripe.js. Inclua o script Stripe.js em sua página de pagamento adicionando-o ao head
do arquivo HTML. Sempre carregue o Stripe.js diretamente de js.stripe.com para manter a conformidade com PCI. Não inclua o script em um pacote nem hospede pessoalmente uma cópia dele.
<head> <title>Checkout</title> <script src="https://js.stripe.com/clover/stripe.js"></script> </head> <body> <!-- content here --> </body>
Crie uma instância da Stripe com o seguinte JavaScript na página de pagamentos:
// Set your publishable key: remember to change this to your live publishable key in production // See your keys here: https://dashboard.stripe.com/apikeys const stripe = Stripe(
);'pk_test_TYooMQauvdEDq54NiTphI7jx'
Adicione o Payment Element à sua página
O Payment Element precisa de um lugar para residir na sua página de pagamentos. Crie um node DOM vazio (contêiner) com um ID único no seu formulário de pagamento.
<form id="payment-form"> <div id="payment-element"> <!-- Elements will create form elements here --> </div> <button id="submit">Subscribe</button> <div id="error-message"> <!-- Display error message to your customers here --> </div> </form>
Depois que o formulário for carregado, crie uma instância do Payment Element e monte-o no nódulo DOM do contêiner. Quando criou a assinatura, você passou o valor client_
para o front end. Passe esse valor como uma opção quando você criar uma instância de Elements.
const options = { clientSecret: '{{CLIENT_SECRET}}', // Fully customizable with appearance API. appearance: {/*...*/}, }; // Set up Stripe.js and Elements to use in the payment form, passing the client secret obtained in step 5 const elements = stripe.elements(options); const paymentElementOptions = { layout: "tabs", }; // Create and mount the Payment Element const paymentElement = elements.create('payment', paymentElementOptions); paymentElement.mount('#payment-element');
O Payment Element renderiza um formulário dinâmico que permite que o cliente selecione uma forma de pagamento. O formulário recolhe automaticamente todos os detalhes de pagamento necessários para a forma de pagamento selecionada.
Configurações opcionais do Payment Element
Como opção, você pode fazer o seguinte:
- Customize o Payment Element para que corresponda ao design de seu site, passando o objeto de aparência para as
opções
ao criar uma instância de Elements. - Configure a interface do Apple Pay para retornar um token de comerciante para aceitar pagamentos recorrentes, recarga automática e diferidos.
Finalizar pagamento
Use stripe.
para concluir o pagamento usando os detalhes do Stripe Elements e ativar a assinatura. Isso cria um PaymentMethod, confirma o primeiro PaymentIntent da assinatura incompleta e faz uma cobrança. Se Strong Customer Authentication (SCA) for necessária para o pagamento, o Payment Element tratará o processo de autenticação antes de confirmar o PaymentIntent.
Forneça um return_url para indicar para onde o Stripe redireciona o usuário depois que ele conclui o pagamento. O usuário pode ser redirecionado primeiro para um site intermediário, como uma página de autorização bancária, antes de ser redirecionado para o return_
. Os pagamentos com cartão redirecionam imediatamente para o return_
quando o pagamento é bem-sucedido.
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const {error} = await stripe.confirmPayment({ //`Elements` instance that was used to create the Payment Element elements, confirmParams: { return_url: "https://example.com/order/123/complete", } }); if (error) { // This point is reached only if there's an immediate error when // confirming the payment. Show an error to your customer (for example, payment // details incomplete) const messageContainer = document.querySelector('#error-message'); messageContainer.textContent = error.message; } else { // Your customer redirects to your `return_url`. For some payment // methods, such as iDEAL, your customer redirects to an intermediate // site first to authorize the payment, and then redirects to the `return_url`. } });
Quando o cliente envia um pagamento, a Stripe o redireciona para o return_
e inclui os parâmetros de consulta de URL a seguir. A página de retorno pode usá-los para obter o status do PaymentIntent e exibir o status do pagamento para o cliente.
Ao especificar o return_
, você também pode anexar seus próprios parâmetros de consulta para uso na página de retorno.
Parâmetro | Descrição |
---|---|
payment_ | O identificador único do PaymentIntent . |
payment_ | O segredo do cliente do objeto PaymentIntent . Para integrações de assinaturas, esse client_secret também é exposto no objeto Invoice por meio de confirmation_ |
Quando o cliente é redirecionado para o seu site, você pode usar o payment_
para consultar o PaymentIntent e exibir o status da transação ao cliente.
Cuidado
Se você tiver ferramentas que monitoram a sessão do navegador do cliente, pode precisar adicionar o domínio stripe.
à lista de exclusão dos indicadores. Os redirecionamentos fazem com que algumas ferramentas criem sessões, o que evita que você acompanhe a sessão completa.
Use um dos parâmetros da consulta para recuperar o PaymentIntent. Inspecione o status do PaymentIntent para decidir o que mostrar aos seus clientes. você também pode anexar seus próprios parâmetros de consulta ao fornecer o return_
, que persiste durante o processo de redirecionamento.
// Initialize Stripe.js using your publishable key const stripe = Stripe(
); // Retrieve the "payment_intent_client_secret" query parameter appended to // your return_url by Stripe.js const clientSecret = new URLSearchParams(window.location.search).get( 'payment_intent_client_secret' ); // Retrieve the PaymentIntent stripe.retrievePaymentIntent(clientSecret).then(({paymentIntent}) => { const message = document.querySelector('#message') // Inspect the PaymentIntent `status` to indicate the status of the payment // to your customer. // // Some payment methods [immediately succeed or fail][0] upon // confirmation, while others first enter a `processing` status. // // [0]: https://stripe.com/docs/payments/payment-methods#payment-notification switch (paymentIntent.status) { case 'succeeded': message.innerText = 'Success! Payment received.'; break; case 'processing': message.innerText = "Payment processing. We'll update you when payment is received."; break; case 'requires_payment_method': message.innerText = 'Payment failed. Please try another payment method.'; // Redirect your user back to your payment page to attempt collecting // payment again break; default: message.innerText = 'Something went wrong.'; break; } });'pk_test_TYooMQauvdEDq54NiTphI7jx'
Procuro por webhooksServidor
Para concluir a integração, você precisa processar os webhooks enviados pela Stripe. Esses eventos são acionados sempre que o status na Stripe muda, como assinaturas que criam novas faturas. No seu aplicativo, configure um manipulador HTTP para aceitar uma solicitação POST contendo o evento webhook e verifique a assinatura do evento:
Durante o desenvolvimento, use a CLI da Stripe para observar Webhooks e encaminhá-los para sua inscrição. Execute o seguinte em um novo terminal enquanto seu aplicativo de desenvolvimento estiver em execução:
stripe listen --forward-to localhost:4242/webhook
Para produção, configure um endpoint de Webhook no Workbench, ou use o Webhook Endpoints API.
Ouça alguns eventos para concluir as etapas restantes deste guia. Consulte Eventos de assinatura para obter mais detalhes sobre Webhooks específicos de assinatura.
Providenciar acesso ao seu serviçoCliente e servidor
Agora que a assinatura está ativa, dê ao usuário acesso ao seu serviço. Para fazer isso, ouça os eventos customer.
, customer.
e customer.
. Esses eventos passam um objeto Subscriptions
que contém um campo status
indicando se a assinatura está ativa, vencida ou cancelada. Consulte o ciclo de vida da assinatura para obter uma lista completa de status.
No seu gerenciador de webhooks:
- Verifique o status da assinatura. Se estiver
ativa
, o usuário pagou pelo seu produto. - Confira o produto que o cliente assinou e conceda acesso ao serviço. Verificar o produto em vez do preço proporciona mais flexibilidade, caso seja necessário alterar os preços ou o período de faturamento.
- Armazene o
product.
,id subscription.
eid subscription.
no seu banco de dados junto com ostatus customer.
que já salvou. Verifique esse registro quando determinar quais recursos precisam ser ativados para o usuário no seu aplicativo.id
O status de uma assinatura pode mudar a qualquer momento durante sua existência, mesmo que seu aplicativo não faça chamadas diretas para a Stripe. Por exemplo, uma renovação pode falhar devido a um cartão de crédito expirado, o que coloca a assinatura em um status de vencida
. Ou, se você implementar o portal do cliente, um usuário pode cancelar a assinatura sem acessar diretamente seu aplicativo. A implementação correta do manipulador mantém o status do seu aplicativo sincronizado com a Stripe.
Cancelar a assinaturaCliente e servidor
Você pode permitir que os clientes cancelem suas assinaturas. O exemplo abaixo adiciona uma opção de cancelamento à página de configurações da conta.

Configurações da conta com a capacidade de cancelar a assinatura
function cancelSubscription(subscriptionId) { return fetch('/cancel-subscription', { method: 'post', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ subscriptionId: subscriptionId, }), }) .then(response => { return response.json(); }) .then(cancelSubscriptionResponse => { // Display to the user that the subscription has been canceled. }); }
No back-end, configure um endpoint para ser chamado pelo front-end.
Seu aplicativo recebe um evento customer.
.
Após o cancelamento da assinatura, remova do banco de dados o ID de assinatura da Stripe que você armazenou anteriormente e limite o acesso ao seu serviço.
Depois de serem canceladas, as assinaturas não podem ser reativadas. Obtenha dados de faturamento atualizados do seu cliente, atualize a forma de pagamento padrão e crie uma nova assinatura com o registro de cliente existente.
Teste a integração
Testar formas de pagamento
Use a tabela a seguir para testar diferentes formas de pagamento e cenários.
Forma de pagamento | Cenário | Como testar |
---|---|---|
Débito automático BECS | O cliente paga com débito automático BECS. | Preencha o formulário usando o número da conta 900123456 e BSB 000000 . O PaymentIntent confirmado inicialmente passa para o status processing , depois passa para succeeded três minutos depois. |
Débito automático BECS | O pagamento do cliente falha com um código de erro account_ . | Preencha o formulário usando o número da conta 111111113 e BSB 000000 . |
Cartão de crédito | O pagamento com cartão é bem-sucedido e não precisa de autenticação. | Preencha o formulário do cartão de crédito usando o número de cartão de crédito 4242 4242 4242 4242 com qualquer validade, CVC e código postal. |
Cartão de crédito | O pagamento com cartão precisa de autenticação. | Preencha o formulário do cartão de crédito usando o número 4000 0025 0000 3155 com qualquer validade, CVC e código postal. |
Cartão de crédito | O cartão é recusado com um código de recusa como insufficient_ . | Preencha o formulário do cartão de crédito usando o número 4000 0000 0000 9995 com qualquer validade, CVC e código postal. |
Débito automático SEPA | O cliente paga com débito automático SEPA. | Preencha o formulário usando o número de conta AT321904300235473204 . Inicialmente, o status do PaymentIntent muda para processing e, três minutos depois, para succeeded. |
Débito automático SEPA | O status do PaymentIntent do cliente muda de processing para requires_ . | Preencha o formulário usando o número de conta AT861904300235473202 . |
Monitorar eventos
Configure Webhooks para ouvir os eventos de alteração de assinatura, como upgrades e cancelamentos. Saiba mais sobre os Webhooks de assinatura . você pode visualizar eventos no Dashboard ou com o Stripe CLI.
Para obter mais detalhes, consulte testando sua integração com o Billing.
OpcionalPermita que os clientes alterem seus planosCliente e servidor
Para permitir que seus clientes alterem a assinatura, recolha a ID de preço da opção para a qual desejam mudar. Em seguida, envie o novo ID de preço do front-end para um endpoint de back-end. O exemplo abaixo também passa o ID da assinatura, mas você pode recuperá-lo do seu banco de dados para o usuário logado.
function updateSubscription(priceId, subscriptionId) { return fetch('/update-subscription', { method: 'post', headers: { 'Content-type': 'application/json', }, body: JSON.stringify({ subscriptionId: subscriptionId, newPriceId: priceId, }), }) .then(response => { return response.json(); }) .then(response => { return response; }); }
No back-end, defina o endpoint para o front-end chamar, passando o ID da assinatura e o novo ID do preço. A assinatura agora é Premium a 15 USD por mês, em vez de Basic a 5 USD por mês.
Seu aplicativo recebe um evento customer.
.
OpcionalPrévia de uma alteração de preçoCliente e servidor
Quando o cliente altera sua assinatura, geralmente há um ajuste no valor devido, conhecido como pro rata. Você pode usar o endpoint create preview invoice para exibir o valor ajustado aos seus clientes.
On the front end, pass the create preview invoice
details to a back-end endpoint.
function createPreviewInvoice( customerId, subscriptionId, newPriceId, trialEndDate ) { return fetch('/create-preview-invoice', { method: 'post', headers: { 'Content-type': 'application/json', }, body: JSON.stringify({ customerId: customerId, subscriptionId: subscriptionId, newPriceId: newPriceId, }), }) .then(response => { return response.json(); }) .then((invoice) => { return invoice; }); }
No back-end, configure um endpoint para ser chamado pelo front-end.
OpcionalExibir a forma de pagamento do clienteCliente e servidor
Exibir a bandeira e os últimos quatro dígitos do cartão do seu cliente informa qual cartão está sendo cobrado ou se é preciso atualizar a forma de pagamento.
No front-end, envie o ID do método de pagamento para um endpoint de back-end que recupera os detalhes do método de pagamento.
function retrieveCustomerPaymentMethod(paymentMethodId) { return fetch('/retrieve-customer-payment-method', { method: 'post', headers: { 'Content-type': 'application/json', }, body: JSON.stringify({ paymentMethodId: paymentMethodId, }), }) .then((response) => { return response.json(); }) .then((response) => { return response; }); }
No back-end, configure um endpoint para ser chamado pelo front-end.
Exemplo de resposta:
{ "id": "pm_1GcbHY2eZvKYlo2CoqlVxo42", "object": "payment_method", "billing_details": { "address": { "city": null, "country": null, "line1": null, "line2": null, "postal_code": null,
Observação
Recomendamos que você salve paymentMethod.
e last4
no banco de dados (por exemplo, paymentMethod.
como stripeCustomerPaymentMethodId
na coleção ou tabela users
). Você também pode armazenar exp_
, exp_
, fingerprint
e billing_
conforme necessário. Assim, você reduz o número de chamadas à Stripe para melhorar o desempenho e evitar possíveis limitações de fluxo.
Divulgue a Stripe para seus clientes
A Stripe coleta informações sobre interações do cliente com o Elements para fornecer serviços a você, evitar fraudes e melhorar os serviços. Isso inclui o uso de cookies e endereços IP para identificar quais Elements o cliente visualizou durante uma única sessão de checkout. Você é responsável por divulgar e obter todos os direitos e consentimentos necessários para que a Stripe use os dados dessas maneiras. Para saber mais, acesse nossa central de privacidade.