🎨 Componentes
O public-sdk oferece componentes Vue 3 prontos para uso nas lojas:
PaymentHosted→ formulário de pagamento hospedadoColorTheme→ aplica as cores e a fonte da lojaGoogleAutheFacebookAuth→ botões de login socialExpandTransition→ transição de expandir e recolher
Os componentes dependem de Vue 3. Importe-os da raiz (@uappi/public-sdk) ou de @uappi/public-sdk/components.
PaymentHosted
Renderiza o formulário de pagamento (cartão, etc.) dentro de um isolado, servido pelo serviço de pagamentos da Uappi. Os dados sensíveis (número do cartão, CVV, etc.) trafegam diretamente entre o iframe e o gateway, sem passar pela loja.
Ao montar, o componente:
1. Gera um token de pagamento com Api.cart.paymentToken
2. Monta a URL do iframe com esse token
3. Escuta as mensagens (postMessage) do iframe e as converte em eventos do componente
O token é renovado automaticamente quando está perto de expirar, sem recarregar o iframe nem perder o que o cliente já preencheu. A altura do iframe se ajusta ao conteúdo do formulário.
1<script setup lang="ts">2import { PaymentHosted } from '@uappi/public-sdk';3import type {4 PaymentSuccessData,5 PaymentRedirectData,6} from '@uappi/public-sdk/components/PaymentHosted/types';78function onSuccess(data: PaymentSuccessData) {9 // pedido criado, mesmo formato retornado por Api.cart.buy10}1112function onRedirect(url: string, data: PaymentRedirectData) {13 // o gateway pediu redirecionamento (ex: autenticação 3DS)14 window.location.href = url;15}1617function onError(errorCode: string | undefined, message: string) {18 // falha ao processar o pagamento19}20</script>2122<template>23 <PaymentHosted24 :option="selectedPaymentOption"25 cta-color="#FF0000"26 lang="pt-BR"27 country-code="BRA"28 @payment-success="onSuccess"29 @payment-redirect="onRedirect"30 @payment-error="onError"31 />32</template>Props
| Prop | Tipo | Obrigatório | Descrição |
|---|---|---|---|
option | PaymentOption | Sim | Opção de pagamento selecionada (item retornado por Api.cart.listPayments). |
ctaColor | string | Não | Cor hex do botão do formulário (com ou sem #). |
lang | string | Não | Idioma do formulário (pt-BR, en-US, es-ES, ...). Padrão: pt-BR. |
countryCode | string | Não | Código Alpha-3 para pré-selecionar o DDI do telefone (BRA, USA, ...). Padrão: BRA. |
iframeHost | string | Não | Host do formulário. Tem prioridade sobre a variável VITE_PAYMENT_IFRAME_HOST. Padrão: https://payments.uappi.store. |
orderGroupPaymentCode | string | Não | Código do link de pagamento. Quando informado, o pagamento é feito para o pedido do link, e não para o carrinho. |
orderGroup | CustomerOrderResponse | Não | Grupo de pedido do link. Obrigatório junto com orderGroupPaymentCode. |
Eventos
| Evento | Payload | Quando é emitido | |
|---|---|---|---|
payment-ready | — | O formulário carregou e está pronto para interação. | |
token-error | errorCode: string \ | undefined | Falha ao gerar o token de pagamento, antes de o formulário existir. |
payment-success | data: PaymentSuccessData | Pagamento concluído. data tem o mesmo formato de Api.cart.buy. | |
payment-redirect | url: string, data: PaymentRedirectData | O gateway exige redirecionamento (ex: autenticação 3DS). | |
payment-error | errorCode: string \ | undefined, message: string | Falha ao processar o pagamento. |
Tracking
O componente dispara o evento de compra sozinho quando o pagamento é concluído: purchase no GA4 e Purchase no Facebook Pixel (quando o fbq está carregado). Não é necessário usar Tracking.cart.buy junto com ele.
No fluxo de carrinho, os dados do evento vêm do carrinho lido antes do pagamento. No fluxo de link de pagamento, vêm do orderGroup informado.
Pagamento por link
Para pagar um pedido criado pelo vendedor, sem carrinho ativo, consulte o link com Api.order.detailOrderPaymentCode e repasse o código e o pedido ao componente:
1<script setup lang="ts">2import { ref, onMounted } from 'vue';3import { Api, PaymentHosted, type ApiTypes } from '@uappi/public-sdk';45const props = defineProps<{ code: string }>();67const link = ref<ApiTypes.OrderPaymentCodeDetailResponse | null>(null);8const selectedOption = ref<ApiTypes.PaymentOption | null>(null);910onMounted(async () => {11 link.value = await Api.order.detailOrderPaymentCode(props.code);12 selectedOption.value = link.value.paymentOptions[0]?.option ?? null;13});14</script>1516<template>17 <PaymentHosted18 v-if="link?.orderGroup && selectedOption"19 :option="selectedOption"20 :order-group-payment-code="link.code"21 :order-group="link.orderGroup"22 @token-error="onTokenError"23 @payment-success="onSuccess"24 />25</template>Os erros possíveis do link estão em Api: Recursos → Order.
ColorTheme
Aplica as cores e a fonte da loja como variáveis CSS globais (--primary-cta-text, --checkout-cta-default, --neutral-background, etc.) no document.documentElement assim que é montado. Não renderiza elementos próprios: apenas repassa o conteúdo do slot.
1<script setup lang="ts">2import { ColorTheme, type CSSVariables } from '@uappi/public-sdk';34const variables: CSSVariables = {5 font: {6 family: 'Inter',7 link: 'https://fonts.googleapis.com/css2?family=Inter',8 },9 colors: {10 CheckoutCTADefault: '#000000',11 CheckoutCTAHover: '#333333',12 CheckoutCTAText: '#FFFFFF',13 PrimaryCTAText: '#FFFFFF',14 // ...demais cores do tipo CSSVariables15 },16};17</script>1819<template>20 <ColorTheme :variables="variables">21 <App />22 </ColorTheme>23</template>| Prop | Tipo | Obrigatório | Descrição |
|---|---|---|---|
variables | CSSVariables | Não | Fonte e cores da loja. As cores seguem os grupos Checkout, Primary, Neutral, Success, Warning, Error, Info e Link. |
GoogleAuth e FacebookAuth
Botões de login social. Ao clicar, o componente obtém a URL de autenticação com Api.thirdParty.oauthRedirect e redireciona o cliente para o provedor.
1<script setup lang="ts">2import { GoogleAuth, FacebookAuth } from '@uappi/public-sdk';3</script>45<template>6 <GoogleAuth uri="/conta" />7 <FacebookAuth uri="/conta" />8</template>| Prop | Tipo | Obrigatório | Descrição |
|---|---|---|---|
uri | string | Sim | Prefixo de rota da loja usado para montar as URLs de retorno ({uri}/signin e {uri}/signup). |
ExpandTransition
Wrapper sobre o do Vue que anima altura e opacidade ao expandir e recolher. Útil para acordeões e listas condicionais.
1<script setup lang="ts">2import { ExpandTransition } from '@uappi/public-sdk';3</script>45<template>6 <ExpandTransition>7 <div v-if="open">Conteúdo</div>8 </ExpandTransition>9</template>| Prop | Tipo | Obrigatório | Descrição | ||
|---|---|---|---|---|---|
mode | 'in-out' \ | 'out-in' \ | 'default' | Não | Modo de transição do Vue. Padrão: out-in. |