Setup do SDK
Criação do SDK, setup com SetupData, sessão ativa e telas da venda.
Criação do SDK, setup com SetupData, sessão ativa e telas da venda.
O setup ativa a sessão do SDK no dispositivo para o lojista. A partir da v3.0, a ativação usa um único modelo, o SetupData, para qualquer integração:
| Campo | Origem |
|---|---|
document | CNPJ ou CPF do lojista |
activationCode | Gerado pelo backend na ativação (ver Consentimento e Ativação) |
stoneCode | Código de afiliação do lojista |
paymentProfileId | Perfil de pagamento do lojista |
accountId | Conta do lojista na Stone |
credential | Credential(clientId, clientSecret) com as Credenciais Transacionais |
Crie uma instância do TapStoneCo na inicialização do app e reutilize em todo o app.
Android — classe Application
class MainApplication : Application() {
lateinit var tapStoneCo: TapStoneCo
private set
override fun onCreate() {
super.onCreate()
// A tela de PIN roda num processo separado: nele, não inicialize nada.
if (TapSdk.shouldIgnoreApplicationOnCreate()) return
tapStoneCo = TapStoneCo.Builder(this).build {
environment = Environment.SDX // Environment.PRODUCTION em produção
}
}
}
iOS
import TapCore
final class TapService {
static let shared = TapService()
let sdk: TapStoneCo
private init() {
sdk = TapStoneCoBuilder(application: IosContext()).build(block: { builder in
builder.environment = TapCore.Environment.sdx // .production em produção
})
}
}
| Opção do Builder | Padrão | Descrição |
|---|---|---|
environment | conforme a variante do SDK | SDX (sandbox) ou PRODUCTION |
timeouts | padrão do SDK | Tempo máximo de leitura e de PIN |
pinpad | padrão Stone | Estilo da tela de PIN |
Peça o activationCode ao backend e chame o setup() logo em seguida, com um SetupData. O SDK identifica o tipo de integração sozinho; o app não informa instituição nem tipo de dono da sessão.
Android
val activationCode = backend.fetchActivationCode() // nunca chame a CMA API do app
val result = tapStoneCo.setup(
SetupData(
document = document,
activationCode = activationCode,
paymentProfileId = paymentProfileId,
accountId = accountId,
stoneCode = stoneCode,
credential = Credential(
clientId = transactionalClientId, // Credenciais Transacionais
clientSecret = transactionalClientSecret,
),
)
)
if (result.stoneStatus == StoneStatus.SUCCESS) {
// sessão ativa, pronto para transacionar
} else {
val status = result.stoneStatus
Log.e("TapStoneCo", "Setup failed [${status.code}] ${status.message}")
}
iOS
let activationCode = try await backend.fetchActivationCode()
let setupData = SetupData(
document: document,
activationCode: activationCode,
paymentProfileId: paymentProfileId,
accountId: accountId,
stoneCode: stoneCode,
credential: Credential(
clientId: transactionalClientId, // Credenciais Transacionais
clientSecret: transactionalClientSecret
)
)
let result = try await TapService.shared.sdk.setup(data: setupData)
if result.stoneStatus == ErrorStoneStatus.companion.SUCCESS {
// sessão ativa, pronto para transacionar
} else {
print("Setup failed [\(result.stoneStatus.code)] \(result.stoneStatus.message)")
}
O setup() é assíncrono (suspend no Android, async no iOS). O retorno é um TapActivationResult; sucesso é o código "0000".
No iOS, a primeira ativação do aparelho pede ao lojista que aceite os termos do Tap to Pay on iPhone com a conta Apple dele (veja iOS).
O setup() cria a sessão ativa do lojista. O SDK guarda os dados do lojista dessa sessão (o contexto do lojista) e os usa em todas as vendas. Por isso o pay() não recebe mais o dono da transação: basta chamar pay() depois de um setup() bem-sucedido. Não é preciso chamar o setup() antes de cada transação.
Gere um novo activationCode e refaça o setup() quando:
deactivate());7410 (DEACTIVATED).O SDK exibe todas as telas da venda. O app não desenha nenhuma tela de pagamento e não precisa tratar eventos de leitura do cartão: ele chama pay() com o valor e recebe o resultado final.
Durante o pay(), o SDK mostra, nesta ordem:
O pay() só emite o OnResult quando o lojista termina a venda: sucesso ao sair da venda aprovada ou do comprovante, cancelamento (7011) se ele desistir na forma de pagamento, ou o erro que ele fechou.
Mantenha a coleta do pay() ativa até o OnResult. Se ela for cancelada junto com a tela do app, o SDK fecha as telas e o resultado da venda se perde.
| Callback | Quando é chamado | Para que serve |
|---|---|---|
TapFeeScreens.onPaymentMethodConfirmed | Quando o lojista confirma a forma de pagamento, antes da aproximação | Recebe o TransactionData final. Com repasse da taxa, o amount é maior que o valor enviado no pay(); use este valor no seu registro e na conciliação |
TapFeeScreens.onSaleFinished | Quando o lojista sai da venda aprovada, logo antes do OnResult de sucesso | Diz por onde ele saiu: NEW_SALE ("Fazer nova venda") ou CLOSE (fechar). Use para voltar à tela de valor ou à home do app |
Encerra a sessão do SDK no dispositivo. A chamada é a mesma em Android e iOS, então não há necessidade de blocos de código separados por plataforma.
Android e iOS
tapStoneCo.deactivate()
Depois do deactivate(), a próxima venda exige um novo setup() com um activationCode novo.
| Fase | Quando | O que fazer |
|---|---|---|
| 1 — Inicialização do app | Uma vez, na startup | Criar o SDK com TapStoneCo.Builder(app).build { ... } |
| 2 — Ativação do dispositivo | Primeiro uso, reinstalação, troca de lojista ou venda sem sessão | Obter o activationCode via backend do parceiro e chamar setup(SetupData(...)). Se result.stoneStatus for SUCCESS, a sessão está ativa; senão, trate o erro |
| 3 — A cada transação | Em cada venda | Chamar pay(TransactionData(...)); o SDK exibe as telas da venda. Trate o OnResult ao fim da venda: em caso de sucesso, a venda está concluída. Sem sessão ou com 7410, volte à fase 2 |
Integração: Tap to Pay para Terceiros
Etapa 3 de 7