Aceitar um pagamento OXXO
Veja como aceitar OXXO, uma forma de pagamento comum no México.
Cuidado
Esta seção trata de um produto herdado. Use o guia Aceitar um pagamento para ver o caminho de integração mais recente. Embora a Stripe ainda ofereça suporte a esse produto, ele pode terminar se o produto for descontinuado.
Usuários da Stripe no México podem aceitar pagamentos OXXO de clientes no México ao usar as APIs Payment Intents e Payment Methods. Os clientes pagam ao fornecer uma guia de pagamento OXXO com um número gerado e pagamento em espécie em uma loja de conveniência OXXO. Você é notificado pela Stripe após a conclusão do pagamento.
Configurar a StripeLado do servidor
Primeiro, você precisa de uma conta da Stripe. Inscreva-se aqui.
Use nossas bibliotecas oficiais para acessar a API da Stripe no seu aplicativo:
Crie um PaymentIntentLado do servidor
A Stripe usa um objeto PaymentIntent para representar sua intenção de coletar o pagamento de um cliente, acompanhando mudanças de estado desde a criação da guia OXXO até seu pagamento.
Crie um PaymentIntent no seu servidor com um valor e a moeda mxn (OXXO não aceita outras moedas). Se você já tiver uma integração usando a API Payment Intents, adicione oxxo à lista de tipos de forma de pagamento para o seu PaymentIntent.
Recuperar o segredo do cliente
O PaymentIntent inclui um segredo do cliente que o lado do cliente usa para concluir com segurança o processo de pagamento. Você pode usar abordagens diferentes para enviar a senha do cliente ao lado do cliente.
Outras opções da forma de pagamento
Você pode especificar um parâmetro opcional expires_ nas opções da forma de pagamento para o PaymentIntent, definindo os dias corridos até o vencimento de uma guia OXXO. Por exemplo, se você criar uma guia OXXO na segunda-feira e a configuração de expires_ for 2, a guia vencerá na quarta-feira, às 23h59, horário da América/Mexico_City (UTC-6). O parâmetro expires_ pode ser de 1 a 7 dias. O padrão é 3 dias.
Coletar dados da forma de pagamentoDo lado do cliente
Crie um formulário de pagamento no cliente para obter os dados necessários para a cobrança:
| Campo | Valor |
|---|---|
name | Nome completo (nome e sobrenome) do cliente. O nome e o sobrenome precisam ter pelo menos dois caracteres cada um. |
email | Endereço de e-mail completo do cliente. |
<form id="payment-form"> <div class="form-row"> <label for="name"> Name </label> <input id="name" name="name" required> </div> <div class="form-row"> <label for="email"> Email </label> <input id="email" name="email" required> </div> <!-- Used to display form errors. --> <div id="error-message" role="alert"></div> <button id="submit-button">Pay with OXXO</button> </form>
Enviar o pagamento para a StripeDo lado do cliente
Quando o cliente optar por pagar com OXXO, use Stripe.js para enviar o pagamento à Stripe. Stripe.js é a nossa biblioteca principal de JavaScript para criação de fluxos de pagamento.
Inclua Stripe.js na sua página de checkout, adicionando o script ao head do seu arquivo HTML.
<head> <title>Checkout</title> <script src="https://js.stripe.com/clover/stripe.js"></script> </head>
Crie uma instância de Stripe.js com o JavaScript a seguir em sua página de checkout.
// Set your publishable key. Remember to switch to your live publishable key in production! // See your keys here: https://dashboard.stripe.com/apikeys const stripe = Stripe();'pk_test_TYooMQauvdEDq54NiTphI7jx'
Use stripe.confirmOxxoPayment e o segredo do cliente do objeto PaymentIntent criado na etapa 2 para enviar os dados de cobrança do cliente.
Depois da confirmação, a Stripe abre automaticamente um modal que mostra a guia de pagamento OXXO ao cliente.
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const result = await stripe.confirmOxxoPayment( '{{PAYMENT_INTENT_CLIENT_SECRET}}', { payment_method: { billing_details: { name: document.getElementById('name').value, email: document.getElementById('email').value, }, }, }); // Stripe.js will open a modal to display the OXXO voucher to your customer // This async function finishes when the customer closes the modal if (result.error) { // Display error to your customer const errorMsg = document.getElementById('error-message'); errorMsg.innerText = result.error.message; } });
Nota
stripe. pode levar vários segundos para finalizar. Nesse período, previna que o formulário seja reenviado e apresente um indicador de espera, como um spinnner. Se receber um erro, mostre-o ao cliente, reative o formulário e oculte o spinner.
Quando a guia de pagamento OXXO é criada, o valor da propriedade status do PaymentIntent indica requires_. Verifique o status de um PaymentIntent no Dashboard ou inspecione a propriedade do status do objeto. Se a guia OXXO não for criada corretamente, inspecione o erro (error) recebido para entender o motivo (um e-mail com formato inválido, por exemplo).
Opcional: envie e-mail ao cliente com um link para a guia de pagamento
A Stripe envia um evento payment_intent.requires_action quando uma guia OXXO é criada. Se precisar enviar um e-mail ao cliente com o link para a guia, acesse o PaymentIntent para obter o link, após receber o evento. O campo hosted_ em payment_intent.next_action.oxxo_display_details contém o link para a guia.
Opcional: personalizar a guia
A Stripe permite personalizar as IUs exibidas para seus clientes na página Configurações da marca.
Estas configurações de marca podem ser aplicadas à guia:
- Ícone: a imagem de sua marca e nome fantasia da empresa
- Cor de destaque: usada no botão Copiar número
- Cor da marca: usada como cor de fundo
Gerenciar eventos pós-pagamentoLado do servidor
A OXXO é uma forma de pagamento com notificação posterior: os fundos não ficam disponíveis imediatamente. Os clientes podem não pagar a guia OXXO em uma loja de conveniência OXXO imediatamente após o checkout.
A Stripe envia um evento payment_intent.succeeded no dia útil seguinte (de segunda a sexta, exceto feriados do calendário mexicano) para todas as guias OXXO pagas. Use o Dashboard ou crie um gerenciador de webhooks para receber esses eventos e executar ações (por exemplo, enviar um e-mail de confirmação de pedido ao cliente, registrar a venda em um banco de dados ou iniciar um fluxo de entrega).
Após a data de validade, o status do PaymentIntent muda para processing e o cliente não pode mais pagar a guia OXXO vencida. Se a guia não for paga até 23:59 (horário da Mexico_City/UTC-6) da data de validade, a Stripe envia um evento payment_intent.payment_failed até 10 dias corridos após a data de validade (na maioria dos casos, o evento é enviado dentro de 7 dias corridos). Por exemplo, se a guia OXXO vencer em 1º de setembro, o evento será enviado no máximo até 10 de setembro.
| Evento | Descrição | Próximas etapas |
|---|---|---|
payment_ | A guia OXXO é criada. | Espere que o cliente pague a guia OXXO. |
payment_ | O cliente não pode mais pagar a guia OXXO. | Aguarde a confirmação ou falha do pagamento. |
payment_ | O cliente pagou a guia OXXO antes do vencimento. | Execute o pedido de mercadorias ou serviços do cliente. |
payment_ | O cliente não pagou a guia OXXO antes do vencimento. | Entre em contato com o cliente por e-mail ou notificação push e solicite outra forma de pagamento. |
Receber eventos e tomar providências comerciais
Manualmente
Use o Stripe Dashboard para ver todos os pagamentos da Stripe, enviar recibos por e-mail, lidar com repasses ou tentar novamente pagamentos com falha.
Código personalizado
Crie um gerenciador de webhooks para ouvir eventos e criar fluxos personalizados de pagamentos assíncronos. Teste e depure a integração do webhook localmente usando a CLI da Stripe.
Testar a integração
Em uma área restrita, defina payment_ de acordo com os valores a seguir ao chamar stripe.confirmOxxoPayment para testar diferentes cenários.
| Descrição | |
|---|---|
| Simula uma guia OXXO paga pelo cliente depois de 3 minutos, com o webhook Exemplo: fulano@test.com |
| Simula uma guia OXXO paga imediatamente pelo cliente, com o webhook Exemplo: succeed_immediately@test.com |
| Simula uma guia OXXO que vence sem ser paga pelo cliente, com o webhook O campo Exemplo: expire_immediately@test.com |
| Simula uma guia OXXO que vence sem ser paga pelo cliente, com o webhook O campo Exemplo: expire_with_delay@test.com |
| Simula uma guia OXXO que expira sem ser paga pelo cliente, com o webhook Exemplo: fill_never@test.com |
OpcionalExiba os dados do OXXO ao clienteDo lado do cliente
Recomendamos usar o Stripe.js para exibir a guia OXXO com confirmOxxoPayment. Mas você também pode exibir a guia aos clientes manualmente.
Para indicar que você vai gerenciar a próxima ação para exibir os dados da OXXO ao seu cliente, especifique handleActions: false ao chamar stripe. na etapa 4.
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const result = await stripe.confirmOxxoPayment( '{{PAYMENT_INTENT_CLIENT_SECRET}}', { payment_method: { billing_details: { name: document.getElementById('name').value, email: document.getElementById('email').value, }, }, }, {handleActions: false}, ); if (result.error) { // Display error to your customer const errorMsg = document.getElementById('error-message'); errorMsg.innerText = result.error.message; } else { // An OXXO voucher was successfully created const amount = result.paymentIntent.amount; const currency = result.paymentIntent.currency; const details = result.paymentIntent.next_action.oxxo_display_details; const number = details.number; const expires_after = details.expires_after; // Handle the next action by displaying the OXXO details to your customer // You can also use the generated hosted voucher const hosted_voucher_url = result.paymentIntent.next_action.oxxo_display_details.hosted_voucher_url; } });
Inclua, no mínimo, o seguinte:
| Detalhe | Descrição |
|---|---|
Logotipo OXXO | Insira o logo da OXXO na guia. Baixe o logo aqui. |
| Número | Localize o número no objeto PaymentIntent em next_action.oxxo_display_details.number. |
| Data de validade | Localize o carimbo de data e hora UNIX para vencimento da guia OXXO, no PaymentIntent em next_action.oxxo_display_details.expires_after. |
| Valor | O valor a ser cobrado. |
| Moeda | As guias OXXO sempre são cobradas em pesos mexicanos. |
| Código de barras | Gere o código de barras a partir do número, usando Code 128. O código de barras deve ter cerca de 7,5 cm de largura quando impresso. Para telas de celular, faça com que seja possível ampliar o código de barras, para que eles possam ser lidos nos caixas das lojas de conveniência OXXO. Você pode usar uma biblioteca externa, como JSBarcode. |
| Instruções de pagamento | Instruções de pagamento para o cliente. Veja as versões em português e espanhol, abaixo. |
Instruções de pagamento da OXXO
Geralmente, os clientes imprimem e levam a guia a uma loja de conveniência da OXXO. Você pode oferecer um botão para impressão fácil e/ou enviar um e-mail com a guia para o cliente. Faça um teste da impressão e confira o tamanho do código de barras (deve ter cerca de 7,5 cm de largura).
OpcionalEnviar e-mails de instruções de pagamento
Você pode habilitar e-mails com instruções de pagamento OXXO na página Configurações de e-mail no Dashboard. Após a habilitação, a Stripe envia e-mails com instruções de pagamento após a confirmação do PaymentIntent. Os e-mails contêm o número OXXO e um link para a página da guia hospedada na Stripe.
Nota
Em ambientes de teste, os e-mails de instruções só são enviados para endereços de e-mail vinculados à conta Stripe.
Validade e cancelamento
As guias do OXXO expiram após o carimbo de data e hora do UNIX expires_ e o cliente não pode pagá-lo após a expiração. As guias do OXXO não podem ser canceladas antes de expirar.
Depois do vencimento da guia OXXO, o status do PaymentIntent muda para requires_. Neste ponto, você pode confirmar o PaymentIntent com outra forma de pagamento ou cancelar.