Pular para o conteúdo principal
Version: v3

Wallets

Essa seção descreve todas as etapas necessárias para a integração do fluxo de pagamento com as wallets Apple Pay e o Google Pay.

Uma das mudanças significativas entre pagamentos via wallet e transações tradicionais (endpoint transactions) está no formato do response, que pode ser tanto síncrono quanto assíncrono. No caso das wallets, as transações introduzem um novo status síncrono SENT, enquanto a atualização do status final da transação ocorre de forma assíncrona via webhook, indicando se o pagamento foi concluído com sucesso ou não.

IMPORTANTE

Esta documentação, por enquanto, cobre apenas a integração do Google Pay e Apple Pay para web.

Integração Web

Para processar pagamentos com Google Pay e Apple Pay na web, é necessário integrar as APIs de cada plataforma entretanto ambas as plataformas seguem o mesmo padrão de implementação, que são:

* Incluir os scripts necessários no seu site para carregar os SDKs e inicializar os métodos de pagamento;
* Definir as configurações exigidas por cada plataforma, como métodos de pagamento aceitos, moeda e país;
* Validar e encaminhar os dados validados para a Marlim para processar e concluir o pagamento.

Google Pay

Etapa 1 - Importação do SDK

Para utilizar o Google Pay, é necessário carregar o SDK JavaScript. Isso permite inicializar o botão de pagamento e o processamento da transação. Inclua o código abaixo importanto o script SDK Javascript do Google Pay.

<script async src="https://pay.google.com/gp/p/js/pay.js"></script>

Etapa 2 - Inicializar o SDK

Após carregar o script do SDK, o próximo passo é inicializar a instância que permitirá interagir com a API do Google Pay e gerenciar o fluxo de pagamentos. Durante a realização de testes, defina a propriedade environment para o valor TEST. Para produção, altere o valor como PRODUCTION.

const paymentsClient = new google.payments.api.PaymentsClient({
environment: "TEST",
});

Etapa 3 - Exibir Botão de pagamento

Para exibir o botão do Google Pay na interface do usuário, primerio é necessário criar um elemento HTML onde ele será renderizado. Esse elemento servirá como um contêiner para o botão, permitindo que o SDK do Google Pay o insira dinamicamente na página. Inclua a seguinte div onde deseja na página.

<div id="gpay-button"></div>

O passo seguinte é repassar o elemento div para o SDK informando onde o botão deverá ser renderizado.

const processPayment(paymentsClient) = (paymentsClient) => { }

const button = paymentsClient.createButton({
onClick: () => processPayment(paymentsClient), // Iremos falar sobre o método processPayment na etapa 5
});

document.getElementById("gpay-button").appendChild(button);

Etapa 4 - Montar Request para o SDK

Após inicializar o SDK, o próximo passo é definir os detalhes da transação, especificando os campos que devem ser enviados na requisição para Google Pay.

AtributoTipoDescrição
apiVersionnumberVersão da API do Google Pay.
apiVersionMinornumberVersão menor da API do Google Pay.
allowedPaymentMethodsarrayMétodos de pagamento que habilita o uso de cartões de crédito.
allowedAuthMethodsarrayMétodos de autenticação permitidos para o pagamento. Utilize sempre CRYPTOGRAM_3DS e PAN_ONLY.
allowedCardNetworksArrayRedes de cartões permitidos. Utilize sempre MASTERCARD, VISA e AMEX.
allowCreditCardsbooleanDefine se cartões de crédito são permitidos. Use sempre como true.
allowPrepaidCardsbooleanDefine se cartões pré-pagos são permitidos. Use sempre como false
tokenizationSpecificationobjectEspecifica os detalhes de tokenização do pagamento, incluindo o gateway de pagamento e o ID do comerciante (Worldpay).
gatewaystringNome do gateway de pagamento utilizado. Utilize sempre como worldpay
gatewayMerchantIdstringID único fornecido pelo gateway de pagamento. Ambiente de teste use b3ee6508b9d95bd; de produção use ...
merchantIdstringID único usado para identificar a loja.
merchantNamestringNome do comerciante ou da loja. (ex: Mercado Bitcoin)
totalPriceStatusstringStatus do preço total da transação. Utilize sempre como FINAL
totalPriceLabelstringRótulo do preço total na interface de pagamento (ex: Total).
totalPricestringValor total da transação em formato string e permitido para apenas duas casas decimais. (ex: 100, 100.01, 100.99)
currencyCodestringCódigo da moeda para a transação. Utilize sempre BRL.
countryCodestringCódigo do país onde a transação será realizada. Utilize sempre BR.
checkoutOptionstringOpção de finalização de compra. Para o cliente ser cobrado imediatamente após a confirmação utilize COMPLETE_IMMEDIATE_PURCHASE.

Abaixo segue o formato de como deve ser o payload que será enviado no método de processamento do SDK.


const googlePaymentRequest = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [
{
type: "CARD",
parameters: {
allowedAuthMethods: ["CRYPTOGRAM_3DS", "PAN_ONLY"],
allowedCardNetworks: ["MASTERCARD", "VISA", "AMEX"],
allowCreditCards: true,
allowPrepaidCards: false,
},
tokenizationSpecification: {
type: "PAYMENT_GATEWAY",
parameters: {
gateway: "worldpay",
gatewayMerchantId: "b3ee6508b9d95bd",
},
},
},
],
merchantInfo: {
merchantId: "12345678910",
merchantName: "Mercado Bitcoin",
},
transactionInfo: {
totalPriceStatus: "FINAL",
totalPriceLabel: "Total",
totalPrice: "100.00",
currencyCode: "BRL",
countryCode: "BR",
checkoutOption: "COMPLETE_IMMEDIATE_PURCHASE",
},
};

Etapa 5 - Extrair o Token

Nesta etapa envie o payload da etapa anterior para o Google Pay e, ao receber a resposta, você irá extrair o token de resposta para enviá-lo à API de Transações da Marlim.
Complete a função processPayment criada na etapa 2, pois é nela que o token será extraído.

async function processPayment(googlePaymentsClient) {
try {
const response = await googlePaymentsClient.loadPaymentData(
googlePaymentRequest
);
const token = response.paymentMethodData.tokenizationData.token;

console.log("Payment data", {
token,
response
});
} catch (err) {
console.log("Load Payment error, err);
}
}

Apple Pay

IMPORTANTE

Esta documentação será descrita em breve...

Inicie uma transação

Depois de concluir as etapas descritas anteriormente, seja para Google Pay ou Apple Pay, há um novo campo dedicado para cada integração e que devera ser enviado na API de transações do tipo wallets: v3/transactions/wallets

IMPORTANTE

Só será aceito um campo por vez, não é permitido o envio de ambos os campos juntos!

AtributoDescrição
google_pay_tokenCampo dedicado para o envio do token do Google Pay.
apple_pay_tokenCampo dedicado para o envio do token da Apple Pay.
Request
curl -X POST "https://api.crypto.mb.marlim.co/v3/transactions" \
-H "Content-Type: application/json" \
-H "api_key: api_key_value" \
-d '{
"net_value": 1000000,
"amount": 1039501,
"installments": "1",
"item_id": "123456789",
"item_url": "https://seusite.com/pedido/123456789",
"card_holder_name": "Luke Skywalker",
"card_number": "5555444433332222",
"card_expiration_date": "1122",
"card_cvv": "123",
"customer[name]": "Luke Skywalker",
"customer[email]": "luke@jedimaster.sw",
"customer[document_number]": "00099988877",
"customer[phone][type]": "mobile",
"customer[phone][area]": "11",
"customer[phone][number]": "988887777",
"customer[address][zipcode]": "95351",
"customer[address][state]": "CA",
"customer[address][city]": "Modesto",
"customer[address][neighborhood]": "East Modesto",
"customer[address][street]": "Sunset Ave",
"customer[address][number]": "713",
"google_pay_token": "{\"signature\":\"MEUCIQC0UjNrPOwkpYgo1mFF/9O7U88iWeUxlosNk4E55KbBJwIgD/0G78NXW\\u003d\",\"protocolVersion\":\"ECv1\",\"signedMessage\":\"{\\\"encryptedMessage\\\":\\\"c30IFg4sq34/iW4MFpPcs84BM8f+r+...EZ9ssPJlVSm2zEIch0tgJP5hYkBlKHWCFNLtdMi4JAkOKzV+3p2vn7fDSqhwe3eTyLcvKEDNnfuY/tdXKjEc0CxThibkTiGibPfl9xQ5jPgEfXnU+y1+Oykx0kU14l06EBXUAXAcPFAtepipFB0fgXKlg+...Xvn5Ar1yNDfkn7E9jUBW9S/xw\\\\u003d\\\\u003d\\\",\\\"ephemeralPublicKey\\\":\\\"BDyWw95K1IVBKh7lmA4wXkFYmVESrkqed...W63WIIYIpGryXQi/FVrFA\\\\u003d\\\",\\\"tag\\\":\\\"QA5+UyDcQWlEpXBrzBiCdmK+...6Vw9c\\\\u003d\\\"}\"}",
"soft_descriptor": "Star Wars"
}'
Response200
{
"status": "sent",
"date_created": "2025-02-28T11:53:12.954Z",
"date_updated": "2025-02-28T11:53:12.954Z",
"net_value": 1000000,
"authorized_amount": 103950,
"paid_amount": 0,
"refunded_amount": 0,
"installments": "1",
"transaction_id": "11122233"
}

Webhooks

Após o usuário finalizar o pagamento, a Wallet emite uma atualização para o nosso Adquirente, informando se a transação foi bem sucedida ou não. A Marlim, por sua vez, emite o Webhook com os dados transacionais.

Request
curl -X POST "https://seusite.com/pedido/123456789/callback" \
-H "Content-Type: application/json" \
-H "User-Agent: Marlim/1.0.0" \
-H "Marlim-Api-Signature: Star98765Wars43210ANewHope1977" \
-d '{
"transaction_id": "98765432",
"event": "transaction_status_changed",
"old_status": "processing",
"current_status": "paid",
"nsu": "98765432",
"date_created": "2025-02-28T11:53:12.954Z",
"date_updated": "2025-02-28T11:53:12.954Z",
"net_value": 1000000,
"authorized_amount": 103950,
"paid_amount": 103950,
"refunded_amount": 0,
"installments": "1",
"card_holder_name": "Luke Skywalker",
"card_brand": "visa",
"card_first_digits": "555544",
"card_last_digits": "2222",
"acquirer_status_code": "0000"
}'