Pular para o conteúdo principal

Criar uma transação Pix

import { Client } from "@pagouai/api-sdk";

const client = new Client({
	apiKey: process.env.PAGOU_API_KEY!,
	environment: "sandbox",
});

const response = await client.transactions.create({
	external_ref: "order_1001",
	amount: 1500,
	currency: "BRL",
	method: "pix",
	buyer: {
		name: "Ada Lovelace",
		email: "ada@example.com",
		document: {
			type: "CPF",
			number: "12345678901",
		},
	},
	products: [{ name: "Pedido inicial", price: 1500, quantity: 1 }],
});

console.log(response.data.id, response.data.status, response.meta.requestId);

Criar uma cobrança Pix a partir do serviço de pedidos

type Order = {
	id: string;
	total: number;
	customerName: string;
	customerEmail: string;
	customerDocument: string;
};

export async function createPixForOrder(order: Order) {
	return client.transactions.create(
		{
			external_ref: order.id,
			amount: order.total,
			currency: "BRL",
			method: "pix",
			buyer: {
				name: order.customerName,
				email: order.customerEmail,
				document: { type: "CPF", number: order.customerDocument },
			},
			products: [{ name: `Pedido ${order.id}`, price: order.total, quantity: 1 }],
		},
		{ idempotencyKey: `tx_${order.id}` },
	);
}

Criar uma transação de cartão com token do front-end

const cardTransaction = await client.transactions.create(
	{
		external_ref: "order_1002",
		amount: 2490,
		currency: "BRL",
		method: "credit_card",
		token: "pgct_token_recebido_do_payment_element",
		installments: 1,
		buyer: {
			name: "Ada Lovelace",
			email: "ada@example.com",
			document: {
				type: "CPF",
				number: "12345678901",
			},
		},
		products: [{ name: "Atualização de plano", price: 2490, quantity: 1 }],
	},
	{ idempotencyKey: "idem_create_order_1002" },
);

console.log(cardTransaction.data.status);

Persistir o resultado da criação

const created = await client.transactions.create(
	{
		external_ref: "order_1003",
		amount: 990,
		currency: "BRL",
		method: "pix",
		buyer: {
			name: "Grace Hopper",
			email: "grace@example.com",
			document: { type: "CPF", number: "12345678901" },
		},
		products: [{ name: "Addon", price: 990, quantity: 1 }],
	},
	{ idempotencyKey: "idem_order_1003" },
);

await saveOrderPayment({
	orderId: "order_1003",
	transactionId: String(created.data.id),
	status: created.data.status,
	requestId: created.meta.requestId,
});

Consultar por ID

const transaction = await client.transactions.retrieve("tr_123");

console.log(transaction.data.status, transaction.data.amount);

Listar transações com filtros

const page = await client.transactions.list({
	page: 1,
	limit: 20,
	status: ["pending", "paid"],
	paymentMethods: ["pix"],
	email: "ada@example.com",
});

console.log(page.data.metadata.total);

for (const item of page.data.data) {
	console.log(item.id, item.status, item.payment.method);
}

Buscar apenas cobranças Pix em aberto para a operação

const openPixPage = await client.transactions.list({
	page: 1,
	limit: 50,
	status: ["pending"],
	paymentMethods: ["pix"],
});

const rows = openPixPage.data.data.map((item) => ({
	id: item.id,
	status: item.status,
	amount: item.amount,
	method: item.payment.method,
}));

console.table(rows);

Percorrer todas as páginas automaticamente

for await (const item of client.transactions.listAutoPagingIterator({
	limit: 100,
	paymentMethods: ["pix"],
})) {
	console.log(item.id, item.status);
}

Atualizar uma transação em sandbox

const updated = await client.transactions.update(
	"tr_123",
	{ status: "paid" },
	{ idempotencyKey: "idem_update_tr_123_paid" },
);

console.log(updated.data.status);

Simular o ciclo de uma cobrança em sandbox

await client.transactions.update(
	"tr_sandbox_1",
	{ status: "processing" },
	{ idempotencyKey: "idem_tr_sandbox_1_processing" },
);

await client.transactions.update(
	"tr_sandbox_1",
	{ status: "paid" },
	{ idempotencyKey: "idem_tr_sandbox_1_paid" },
);

Reembolsar uma transação

const refunded = await client.transactions.refund(
	"tr_123",
	{
		amount: 500,
		reason: "requested_by_customer",
	},
	{
		idempotencyKey: "idem_refund_tr_123_1",
		requestId: "refund_req_123",
	},
);

console.log(refunded.data.amount_refunded, refunded.data.is_full_refund);

Helper para reembolso total

export async function refundFullTransaction(transactionId: string) {
	return client.transactions.refund(
		transactionId,
		{ reason: "requested_by_customer" },
		{ idempotencyKey: `refund_full_${transactionId}` },
	);
}

Reconciliar após incerteza no webhook

async function reconcileTransaction(id: string) {
	const response = await client.transactions.retrieve(id, {
		timeoutMs: 10_000,
	});

	return {
		id: response.data.id,
		status: response.data.status,
		requestId: response.meta.requestId,
	};
}

Padrão de consumidor de webhook com consulta do estado atual

export async function handleTransactionWebhook(payload: { id: string; event: string }) {
	const current = await client.transactions.retrieve(payload.id, {
		requestId: `webhook_${payload.id}`,
	});

	await savePaymentState({
		id: current.data.id,
		status: current.data.status,
		event: payload.event,
		requestId: current.meta.requestId,
	});
}

Persistir dados de correlação da requisição

const result = await client.transactions.create({
	amount: 1500,
	currency: "BRL",
	method: "pix",
	buyer: {
		name: "Ada Lovelace",
		email: "ada@example.com",
		document: { type: "CPF", number: "12345678901" },
	},
	products: [{ name: "Pedido inicial", price: 1500, quantity: 1 }],
});

await db.insert({
	pagouTransactionId: String(result.data.id),
	pagouRequestId: result.meta.requestId,
	status: result.data.status,
});

Exportação noturna de reconciliação

const stale: Array<{ transactionId: string }> = await loadPaymentsNeedingReconciliation();

for (const item of stale) {
	const current = await client.transactions.retrieve(item.transactionId);

	await appendSettlementRow({
		transactionId: current.data.id,
		status: current.data.status,
		requestId: current.meta.requestId,
	});
}