Pular para o conteúdo principal

@cactus-agents/payments

SDK framework-agnostic para providers de pagamento, deposito e saque multi-pais (PIX/SPEI/Wallet/CreditCard/Redirect, bank-list, chave PIX, contas MX/CHL).

Instalacao

pnpm add @cactus-agents/payments

Uso recomendado

Use createPaymentsFromClient quando voce ja estiver usando @cactus-agents/api-client:

import { createApiClient } from "@cactus-agents/api-client";
import { createPaymentsFromClient } from "@cactus-agents/payments";

const client = createApiClient({ baseUrl, tenant, language });
const payments = createPaymentsFromClient(client);

const providers = await payments.getPaymentProviders();
// providers.deposit, providers.withdraw

API publica

Exports principais:

  • createPaymentsService(fetcher)
  • createPaymentsFromClient(client)
  • getPaymentProviders(), submitDeposit(payload), checkDepositStatus(transactionId), submitWithdraw(payload)
  • getBankList(), getPixKey(), updatePixKey(payload), getMexBankAccount(), storeMexBankAccount(payload), getGenericBankAccount(), storeGenericBankAccount(payload)
  • Transforms: transformPaymentProviders, transformDepositResponse, buildDepositPayload, buildWithdrawPayload, transformPixKey, buildPixKeyUpdatePayload, transformMexBankAccount, buildMexBankAccountPayload, transformGenericBankAccount, buildGenericBankAccountPayload, transformBankListItem, resolvePaymentIconUrl
  • Helpers: isPixMethod, isSpeiMethod, isPhoneMethod, isRedirectMethod, isCheckoutPageMethod, isCreditCardFormMethod, isWalletMethod, isBankTransferWithdrawMethod, isExternalRedirectMethod, filterProvidersByCurrency

Tipos principais: PaymentProvider, PaymentProviders, DepositPayload, DepositResult, WithdrawPayload, WithdrawResult, PixKeyUpdatePayload, GenericBankAccountPayload, PaymentsService, PaymentsFetcher.

Referencia de exports: front-cactus-core/packages/payments/src/index.ts.

Metodos de pagamento suportados

SlugTipoPaisDescricao
pix, pixtopay, paybrokers, anspacepay, pay2free, riopag, paag, triopay, starkbank, efibank, genialbank, iuguPIX-likeBRQR code + copia-e-cola + polling
speiSPEIMXTransferencia bancaria (CLABE)
oxxoOXXOMXPagamento em loja (barcode)
credit-cardCheckout PageCHL/MX/PER/FINIframe com gateway de pagamento
bank-transferCheckout PageCHLIframe com gateway bancario
khipuCheckout PageCHLIframe Khipu
credit-card-2, credit-card-prontopagaCard FormCHL/MXFormulario de cartao no frontend
walletWallet/MACHCHLQR + deep-link (app_link) + polling
astropayRedirectMultiIframe AstroPay
worldlineRedirectMultiIframe Worldline
prontopagaRedirectMultiIframe ProntoPaga
cryptoRedirectMultiIframe crypto
webpay, bitfeverExternal RedirectCHLAbre nova aba
trioRedirectPER/FINTrio payments

Classificadores de metodo

isPixMethod("pix") // true — QR + brCode + polling
isSpeiMethod("spei") // true — CLABE + barcode
isPhoneMethod("astropay") // true — requer telefone no saque
isRedirectMethod("astropay") // true — iframe com URL
isCheckoutPageMethod("credit-card") // true — iframe com checkout_page
isCreditCardFormMethod("credit-card-2") // true — form de cartao
isWalletMethod("wallet") // true — app_link + QR
isBankTransferWithdrawMethod("bank-transfer") // true — conta bancaria generica
isExternalRedirectMethod("webpay") // true — abre nova aba

Icones de pagamento

Os icones SVG dos metodos de pagamento ficam dentro do pacote em @cactus-agents/payments/icons/payments/. O transformPaymentProvider() aplica automaticamente resolvePaymentIconUrl() para converter o slug da API (ex: payments/pix) em URL absoluta (ex: /icons/payments/pix.svg).

No front-web-base, um plugin Vite (copyPaymentIcons) copia os icones do pacote para public/icons/ automaticamente no build e dev server.

import { resolvePaymentIconUrl } from "@cactus-agents/payments";

resolvePaymentIconUrl("payments/pix"); // "/icons/payments/pix.svg"
resolvePaymentIconUrl("payments/pix", "/assets"); // "/assets/payments/pix.svg"

DepositPayload

Shape canonico do payload aceito por submitDeposit() / buildDepositPayload(). O builder converte camelCase → snake_case antes de enviar pro BFF (POST /wallet/add-credit).

interface DepositPayload {
userId: number;
/** Valor em centavos. */
creditAmount: number;
paymentMethod: PaymentMethodSlug;
currency: string;
couponCode?: string;

// ─── Tracking de marketing (paridade com legado Nuxt) ─────────────────
// Anexados pelo template no `DepositModal` a partir do cookie
// `cookie_tracking` + `_ga`. Detalhes em
// → ../architecture/marketing-tracking.md
utmCampaign?: string;
utmSource?: string;
utmMedium?: string;
utmContent?: string;
gaClientId?: string;

/** Campos de cartao de credito (apenas `credit-card-2` / `credit-card-prontopaga`). */
cardNumber?: string;
cardName?: string;
cardExpiryMonth?: string;
cardExpiryYear?: string;
cardCvv?: string;
}

:::caution Paridade estrita: src NAO vai no deposit Diferente do signup, o deposit nao envia src (first-touch source). Nenhum dos quatro projetos legado (base, 7k, cassino, vera) jamais incluiu src em /wallet/add-credit. Manter essa distincao evita quebrar dashboards de BI calibrados na atribuicao legacy.

Se voce ver um pull request adicionando utmSrc ou src ao DepositPayload / buildDepositPayload, bloqueie ate validar com BI/backoffice. Existe um teste em packages/payments/src/__tests__/transform.test.ts que falha intencionalmente caso o campo seja reintroduzido. :::

affiliation_code e app_source tambem nao sao enviados no deposit — so no signup.

Endpoints do PaymentsService

MetodoEndpointObservacao
getPaymentProviders()GET /payment-providersProviders deposit/withdraw por pais
submitDeposit(payload)POST /wallet/add-creditDeposito (payload em snake_case)
checkDepositStatus(transactionId)GET /wallet/charge/{transactionId}Status do deposito (polling)
submitWithdraw(payload)POST /new-withdrawsSaque (PIX, SPEI, bank, phone)
getBankList()GET /bff/users/bank-listLista de bancos
getPixKey()POST /pix-keys/user-keyBR — chave PIX do usuario
updatePixKey(payload)POST /pix-keys/update-user-key-v2BR — atualizar chave PIX
getMexBankAccount()GET /mex-bank-accounts/user-accountMX — conta do usuario
storeMexBankAccount(payload)POST /mex-bank-accounts/storeMX — salvar conta
getGenericBankAccount()GET /bff/users/bank-accountCHL — conta bancaria generica
storeGenericBankAccount(payload)POST /bff/users/bank-accountCHL — salvar conta generica

Integracao no front-web-base

Quando o token fica em cookie HttpOnly, as chamadas de deposito/saque passam por API routes no servidor. O template expoe:

  • Rotas: api.payments.providers, api.payments.deposit, api.payments.deposit-status, api.payments.withdraw, api.payments.bank-list, api.payments.pix-key
  • Store Zustand payments.ts (providers, estado do modal)
  • Hook usePayments (submit deposit/withdraw, polling de status)
  • Componentes: DepositModal, WithdrawModal, DepositForm, WithdrawForm, resultados PIX/SPEI/Wallet/CheckoutPage/CreditCard/Redirect/ExternalRedirect

Carteira e historico de transacoes usam @cactus-agents/wallet (rotas api.wallet.*).