SDK Android

Suggest Edits

Introdução

 

Essa é a documentação para ajudar você integrar a sua aplicação Android no sistema de pagamentos da Stone.
Para que isso seja possível, nós disponibilizamos um SDK (Software Development Kit), desenvolvido nativamente na plataforma Android, que possibilita pagamentos de crédito, débito e voucher através do seu aplicativo.

VERSÃO ATUAL

Você está na versão atual (3.0.4) do SDK Android, destinada a terminais pinpad Bluetooth.

Atenção:

Caso você deseje utilizar o POS Ingenico A8, favor utilizar essa documentação

Caso você deseje utilizar o POS NEXGO N5 , favor utilizar essa documentação

Suggest Edits

Dispositivos Suportados

 

O SDK permite a integração da sua aplicação com Pinpad Bluetooth. A função do Pinpad neste caso é de receber e criptografar os dados sensíveis (dados do cartão e senha). O SDK irá controlar o fluxo de pagamento direto com o autorizador da Stone.

Modelos Suportados:

  • D150, D180 da Pax
  • MP10 e MP5 da Gertec
Suggest Edits

Pré-requisitos

 

Para que você consiga integrar com o SDK Android da Stone é necessário seguir alguns requisitos técnicos.

  • Nosso SDK é desenvolvido nativamente no sistema Android, por isso sua aplicação precisa ser Android também ou, caso ela seja desenvolvida com uma plataforma híbrida, é necessário uma interface ou plugin que permita essa comunicação.

  • Caso você esteja integrando no nosso SDK utilizando um:

    • Pinpad: sua aplicação precisa ter a versão do 4.0+ do Android (API 14)

Caso você queira utilizar os dois dispositivos, aconselhamos a usar o mecanismo de Flavors do Android.

Suggest Edits

Processo de Integração

 

Agora que você já sabe como funciona nosso SDK, podemos iniciar a integração.

Integração

Nessa fase ainda não é necessário ser cliente cadastrado para enviar requisições, mas é necessário se cadastrar no nosso programa de parcerias para receber uma credencial de integração ao ambiente. Cadastre-se aqui.

Homologação

Quando concluído o processo de integração, será necessário que você envie sua aplicação para homologação.
O processo de homologação é um processo de teste, que tem como objetivo validar se todos os casos transacionais estão sendo executados com sucesso para que você não tenha problemas ao colocar sua solução em produção.

O nosso time de integrações também irá acompanhar esse processo com você.

Produção

Ao final da homologação, você receberá o nosso OK para ir para produção.
Caso já tenha se cadastrado no nosso programa de parcerias, entre em contato com seu Gerente Comercial na Stone ou através do email integracoes@stone.com.br.
Caso ainda não tenha se cadastrado, você consegue fazê-lo aqui.

Suggest Edits

Overview do SDK

 

O SDK Android é uma interface do sistema de pagamento da Stone. Foi desenvolvido com objetivo de permitir que você faça pagamentos através da sua aplicação de forma fácil e segura.

O SDK possui 3 operações principais: Ativação, Pagamento e Cancelamento

Ativação

Para fazer qualquer operação com o SDK é necessário antes fazer a ativação, que tem como objetivo reconhecer quem está transacionando na Stone através do ID único do lojista/estabelecimento (StoneCode).
Além disso, na ativação salvamos localmente todos os dados do lojista para ser enviado na transação e exibido no comprovante de venda.

Pagamento

O Pagamento é a ação principal do nosso SDK. Essa operação possui 2 etapas:

  • Autorização

A Autorização é o primeiro passo para realizar uma transação. O valor da transação sensibiliza o limite do cartão do portador, porém não gera cobrança enquanto não houver a confirmação (captura).

  • Captura

Ao realizar uma autorização, é necessária a confirmação desta transação, ou seja, a Captura. É nesse momento que o limite do cartão sensibilizado na autorização é, de fato, cobrado. O valor capturado pode ser o total sensibilizado ou um valor inferior (captura parcial).

O Android SDK realiza normalmente a autorização e a captura no mesmo momento, sem que seja necessário você fazer 2 chamadas para cada etapa. Porém, caso você queira, pode fazer as chamadas separadamente.

Na autorização com captura automática, o valor da transação é confirmado de maneira instantânea no momento da requisição de autorização, sem a necessidade de enviar a requisição de captura. Essa é a modalidade mais utilizada.

Já na autorização com captura posterior, a transação é autorizada junto ao emissor do cartão (neste momento o valor ainda não é cobrado na fatura do portador) e posteriormente é necessário realizar a captura total ou parcial desta transação.

Prazo de Captura

Caso a autorização não seja capturada no prazo máximo de 7 dias, ela é automaticamente cancelada pela Stone.

Cancelamento

O Cancelamento é a operação que reverte uma transação efetuada anteriormente.

Suggest Edits

Estrutura do SDK

 

O SDK Android foi desenvolvido utilizando Providers, um padrão de projeto que simplesmente define um contrato entre a API e camada de dados/lógica.
Todos os providers possuem o mesmo padrão e herdam de uma classe modelo que herda da classe AsyncTask do Android. Portanto, toda a comunicação com o terminal e chamadas para APIs externas são executadas em background e devem ter algum feedback para o usuário, como por exemplo, informar que o cartão precisa ser inserido no terminal.

Após a execução de um provider, ele realizará uma chamada de retorno para a sua aplicação (Callback) com o objetivo de informar o status da sua chamada: se teve sucesso, erro ou qual é o próximo passo a ser executado.

Ao chamar um provider, uma ação será executada. Aconselhamos sempre mostrar o progresso dessa ação para garantir uma melhor experiência de usuário e um feedback da operação.
Dado isso, se você não quiser implementar o seu próprio feedback de progresso, você pode usar uma interface do SDK - um dialog - a partir dos métodos listados abaixo.

Método Tipo Função
useDefaultUI Boolean Esse método é usado para habilitar a interface de progresso do SDK quando um provider for chamado
setActivity Activity Esse método deve ser chamado caso haja necessidade de mudar o contexto em que o provider foi instanciado
setDialogMessage String Esse método é usado para personalizar a mensagem exibida no dialog de progresso. Caso nada seja passado, é exibido uma mensagem default
setDialogTitle String Esse método é usado para definir um título para o dialog exibido pelo SDK. Caso nada seja passado, o dialog será exibido sem título
setConnectionCallback StoneCallbackInterface Esse método é usado para receber a resposta do callback do provider instanciado
getListOfErrors() List<ErrorsEnum> Esse método retornará uma lista de erros, caso algum tenha ocorrido na operação executada pelo provider
Suggest Edits

Lista de Providers

 
Provider Função
ActiveApplicationProvider Responsável por ativar a sua aplicação.
BluetoothConnectionProvider Responsável por criar conexão bluetooth com um pinpad a partir de um mac address.
TransactionProvider Responsável por realizar as transações com um pinpad
CaptureTransactionProvider Responsável por realizar a captura de transações que foram autorizadas sem captura automática.
CancellationProvider Responsável por realizar um cancelamento de uma transação.
ValidateTransactionByCardProvider Responsável por validar no banco de transações do SDK se existe transação para um cartão específico.
DisplayMessageProvider Exibe uma mensagem de até 32 caracteres na tela do Pinpad.
SendEmailTransactionProvider Responsável por enviar o comprovante da transação por e-mail.
PrintProvider Responsável por realizar impressões nos Pinpads que possuem suporte para impressão.
ReversalProvider Responsável por procurar no banco local do SDK transações com o status WITH_ERROR e cancelá-las
Suggest Edits

Comunicação Stone

 

Toda a comunicação entre sua aplicação e a Stone é controlada pelo SDK, garantindo segurança e confiabilidade nas transações. Os dados trafegados pelo SDK, como número do cartão, trilhas e senha, são protegidos por criptografia.

Segurança

Devido à alteração do certificado de segurança para o TLS 1.2, as versões do SDK Android Stone inferiores a v2.5.6 não funcionam em dispositivos com Android KitKat (4.4) ou inferior. Dispositivos com versões superiores não são impactados.

Suggest Edits

Getting Started

 

VERSÃO ATUAL

A última versão disponível da SDK é stone-sdk:3.0.4

Para iniciar a integração com o SDK, você precisa:

  1. Adicionar os nossos repositórios no build.gradle do seu projeto:
repositories {
  maven { url "https://packagecloud.io/stone/sdk-android/maven2" }
  maven { url "https://packagecloud.io/stone/sdk-android-snapshot/maven2" }
}
  1. Adicionar a dependência para o core da SDK:
dependencies {
  implementation "br.com.stone:stone-sdk:$stone_sdk_version"
}

Versão atual Pinpad Mobile

Nossa versão estável em produção é stone-sdk:3.0.1

ESSA VERSÃO NÃO POSSUI SUPORTE AO POS ANDROID

Aplicação Demo

Para te ajudar a desenvolver essa integração, criamos uma aplicação que exemplifica todas as etapas da integração.
Você pode acessar o App Demo neste link

Suggest Edits

Inicializando o SDK

 

Depois de configurar as dependências do seu projeto, podemos começar a integração.

Utilize sempre o aplicativo demo como referência quando tiver alguma dúvida de implementação.

O primeiro passo é inicializar o SDK.

StoneStart.init(APLICATION_CONTEXT)

Esse método irá ativar os recursos que o SDK precisa.

Se for a primeira vez que esse método for chamado e sua aplicação ainda não fez uma operação de ativação, ele retorna null

Se sua aplicação já tiver feito uma ativação, o método init irá retornar uma lista do tipo UserModel. Por exemplo, sua aplicação fez uma ativação e o usuário fechou o app. Quando ele for aberto de novo, sua aplicação irá executar o método init porém já vai estar ativada.

O objeto UserModel possui os dados do cliente que foi ativado anteriormente. Essas informações são constantemente utilizadas pelo SDK e você pode saber mais sobre elas na seção UserModel.

Em seguida, é necessário chamar o método setAppName da classe Stone, que recebe como parâmetro uma String referente ao nome da sua aplicação.

StoneStart.init(APLICATION_CONTEXT);
Stone.setAppName("StoneDemo");

AppName

O envio desse campo é obrigatório, sem ele não irá conseguir transacionar com a nossa SDK.

Suggest Edits

Configurando Ambientes

 

Para que seja possível realizar testes com a nossa SDK, disponibilizamos uma ambiente de Sandbox para você.

Ele foi preparado para lhe ajudar a validar as principais respostas das bandeiras. Assim, suas transações irão receber respostas correspondentes ao valor dos centavos passados no Valor da Transação.

Exemplo: Transações de R$1,00 tem código de resposta 0000. Transações de R$1,01 tem código de resposta 1007.

Todos os possíveis códigos de retorno deste ambiente, e seus significados, encontram-se na sessão Códigos de Retorno do Sandbx.

Stone.setEnvironment(Environment.SANDBOX)
Suggest Edits

Provider de Ativação

 

O provider ActiveApplicationProvider é responsável por ativar e desativar o StoneCode do lojista.

Ativando seu Stone Code:

// Este deve ser, obrigatoriamente, o primeiro método a ser chamado
List<UserModel> userList = StoneStart.init(APPLICATION_CONTEXT);

// Se retornar nulo, o SDK não possui nenhum Stone Code ativo
if (userList == null) {
  ActiveApplicationProvider activeApplicationProvider = new ActiveApplicationProvider(CONTEXT);
  activeApplicationProvider.setDialogMessage("Ativando o aplicativo");
  activeApplicationProvider.setDialogTitle("Aguarde");
  activeApplicationProvider.useDefaultUI(true) 
  activeApplicationProvider.setConnectionCallback(new StoneCallbackInterface() {

     // Método chamado se for executado sem erros
     public void onSuccess() {
       Toast.makeText(getApplicationContext(), "Ativado com sucesso, iniciando o aplicativo", Toast.LENGTH_SHORT).show();
     }

     // Método chamado caso ocorra alguma exceção
     public void onError() {
       Toast.makeText(getApplicationContext(), "Erro na ativação do aplicativo, verifique a lista de erros do provider", Toast.LENGTH_SHORT).show();
       // Chame o método abaixo para verificar a lista de erros
       activeApplicationProvider.getListOfErrors();
     }
  });
  activeApplicationProvider.activate(STONE_CODE);\n
} else {
  // Caso já tenha as informações do SDK sua aplicação poderá seguir o fluxo normal.
}

Você precisa conectar com um pinpad para poder transacionar. Leia seção Provedor de Conexão com Pinpad Bluetooth

Desativando um Stone Code:

  ActiveApplicationProvider activeApplicationProvider = new ActiveApplicationProvider(CONTEXT);
  activeApplicationProvider.setDialogMessage("Ativando o aplicativo");
  activeApplicationProvider.setDialogTitle("Aguarde");
  activeApplicationProvider.useDefaultUI(true) 
  activeApplicationProvider.setConnectionCallback(new StoneCallbackInterface() {

     // Método chamado se for executado sem erros
     public void onSuccess() {
       Toast.makeText(getApplicationContext(), "Ativado com sucesso, iniciando o aplicativo", Toast.LENGTH_SHORT).show();
     }

     // Método chamado caso ocorra alguma exceção
     public void onError() {
       Toast.makeText(getApplicationContext(), "Erro na ativação do aplicativo, verifique a lista de erros do provider", Toast.LENGTH_SHORT).show();
       // Chame o método abaixo para verificar a lista de erros
       activeApplicationProvider.getListOfErrors();
     }
  });
  activeApplicationProvider.deactivate(STONE_CODE);\n

Status do Provider

Todos os status que podem ser retornados por um provider estão disponíveis na seção Status do Provider.

Suggest Edits

Provider de Transação

 

Esse provider é utilizado apenas para transações com Pinpad

Tipos de Transação

Para saber mais sobre tipos de transação acesse a seção Transações Financeiras

Transações em Ambiente de Integração

Nosso Sandbox foi preparado para lhe ajudar a validar todos os cenários possíveis de respostas das bandeiras. As transações recebem respostas correspondentes ao valor dos centavos instanciados.

Exemplo: Transações de R$1,00 tem código de resposta 0000. Transações de R$1,01 tem código de resposta 1007.

Todos os possíveis códigos de retorno deste ambiente e seus significados encontram-se na sessão Códigos de Retorno do Sandbox.

Enviar transações com o nosso SDK é simples e rápido.

Primeiro você deve instanciar um objeto do tipo TransactionObject:

final TransactionObject transaction = new TransactionObject();

E popular os seguintes atributos:

Nome Tipo Função
amount String Valor da transação em centavos.
initiatorTransactionKey String É um identificador único da transação. Caso você queira passar o seu próprio identificador, certifique-se que ele será sempre único para todas as suas transações. O SDK possui um padrão próprio para gerar este identificador caso você não o preencha.
instalmentTransactionEnum (¹) Quantidade de parcelas.
typeOfTransactionEnum (¹) Tipo da transação
shortName String Nome de exibição no extrato do cliente (máximo de 14 caracteres).
capture Boolean Define se a transação será realizada com captura automática(true) ou não(false).
SubMerchantCity String Cidade do sub-merchant. Atributo obrigatório para aplicações de subadquirentes
SubMerchantPostalAddress String CEP do sub-merchant. Atributo obrigatório para aplicações de subadquirentes
SubMerchantRegisteredIdentifier String Identificador do sub-merchant no sistema do parceiro. Atributo obrigatório para aplicações de subadquirentes
SubMerchantTaxIdentificationNumber Strring CNPJ (apenas números) do sub-merchant. Atributo obrigatório para aplicações de subadquirentes

*Sub-Merchant*

No caso de aplicações de subadquirentes o Sub-Merchant é o EC afiliado no sistema da subadquirente.

(¹) *instalmentTransactionEnum* e *typeOfTransactionEnum*

Os valores possíveis para estes atributos estão na seção Transaction Enums.

//Definir o valor da transação em centavos
transactionObject.setAmount("10");

/* AVISO IMPORTANTE: Não é recomendado alterar o campo abaixo do ITK,
 * pois ele gera um valor único. Contudo, caso seja necessário
 * faça conforme a linha a seguir. */
transactionObject.setInitiatorTransactionKey("SEU_IDENTIFICADOR_UNICO");

//Informar a quantidade de parcelas, veja a tabela de valores para o InstalmentTransactionEnum
transactionObject.setInstalmentTransaction(InstalmentTransactionEnum.ONE_INSTALMENT);

//Definir forma de pagamento
transactionObject.setTypeOfTransaction(TypeOfTransactionEnum.CREDIT);

//Define se transação será feita com captura ou não.
transactionObject.setCapture(true); 

//Cidade do sub-merchant
stoneTransaction.setSubMerchantCity("city") 
  
//CEP do sub-merchant (Apenas * números)  
stoneTransaction.setSubMerchantPostalAddress("00000000") 
  
// Identificador do sub-merchant  
stoneTransaction.setSubMerchantRegisteredIdentifier("00000000")
  
// Identificador do sub-merchant
stoneTransaction.setSubMerchantTaxIdentificationNumber("33368443000199") 

Após instanciar e popular o objeto TransactionObject, você poderá passar o mesmo para o TransactionProvider, junto com os seguintes parâmetros:

  • UserModel: Objeto que representa o Stone Code ativado
  • PinpadObject: Objeto que representa o pinpad que irá passar a transação
// Processo para envio da transação

final TransactionProvider provider = new TransactionProvider("CONTEXT", transactionObject, "USER_MODEL", "PINPAD_OBJECT");

provider.useDefaultUI(true);
provider.setDialogTitle("Aguarde"); // Título do Dialog
provider.setDialogMessage("Enviando..."); // Mensagem do Dialog

provider.setConnectionCallback(new StoneCallbackInterface() {
  @Override
  public void onSuccess() {
    // Transação enviada com sucesso e salva no banco. Para acessar, use o TransactionDAO
  }
  @Override
public void onStatusChanged(Action action) {
		// Nesse callback é retornado o próximo passo a ser executado no fluxo de pagamento
}
  @Override
  public void onError() {
    // Erro na transação
  }
});

Após a execução do provider, a sua aplicação receberá um Callback nos métodos onSuccess() ou onError().

Para ter acesso ao status da transação, você deve utilizar o método:

provider.getTransactionStatus();

Status da Transação

Todos os status possíveis se encontram na seção Status da Transação.

Em caso de REJECTED e DECLINED, você pode ver a mensagem de retorno da Stone com o método:

provider.getMessageFromAuthorize()

Códigos de Retorno Autorizador

Todos os códigos possíveis retornados pelo autorizador Stone em produção se encontram na seção Códigos de Retorno do Autorizador Stone.

Suggest Edits

Provider de Captura

 

A operação de pagamento possui 2 etapas: Autorização e Captura. Por padrão, O SDK realiza a transação com autorização e captura, mas existe a possibilidade de você fazer uma transação somente de autorização e depois realizar uma Captura Posterior.
A Captura Posterior irá executar uma operação de captura, ou cobrança, do valor autorizado previamente.

Uma transação pode ser realizada com a captura posterior, quando define-se o setCapture como "false" no TransactionObject, conforme segue:

final TransactionObject transaction = new TransactionObject();

// Define se transação será feita com captura ou não.
transaction.setCapture(false); 

Podemos buscar uma transação da seguinte forma:

// Cria uma lista com todas as transacoes
transactionObjects = transactionDAO.getAllTransactionsOrderByIdDesc();

/* Seleciona uma transação da lista
 * transactionObjects.get(0) retorna a transação localizada na posição 0 */
final TransactionObject selectedTransaction = transactionObjects.get(0);

Para verificar se a transação já foi capturada, você pode utilizar o método a seguir, que retornará "false" caso a transação não tenha sido capturada.

//Retorna "false" se a transação ainda não foi capturada
selectedTransaction.isCapture();

Para finalmente realizar a captura, você deve fornecer a este provider uma Activity e um TransactionObject, que se trata da sua transação a ser capturada.

//Captura da transação selecionada
final CaptureTransactionProvider provider = new CaptureTransactionProvider("SUA_ACTIVITY_AQUI", selectedTransaction);
provider.useDefaultUI(true);
provider.setDialogMessage("Efetuando Captura...");
provider.setConnectionCallback(new StoneCallbackInterface() {
	@Override
	public void onSuccess() {
		//Transação Capturada com sucesso
  }
	@Override
	public void onError() {
		//Ocorreu um erro na captura da transacao
  }
});
provider.execute();

Por exigência da Sodexo as transações dessa bandeira não devem ser enviadas com captura automática.

Quando uma transação da bandeira Sodexo é realizada com captura automática, o nosso SDK detecta essa informação e uma autorização sem captura automática é realizada. Uma requisição de captura é enviada automaticamente logo em seguida.

Suggest Edits

Provider de Cancelamento

 

O provedor de Cancelamento, CancellationProvider, é um dos provedores mais simples. Para efetuar um cancelamento, você deve instanciar o CancellationProvider e passar sua Activity e o ID da transação que deseja passar (todos os IDs das transações podem ser obtidos com o TransactionDAO).

//Construtor
CancellationProvider('SUA_ACTIVITY_AQUI', TransactionObject transaction);

//Método que retorna o actionCode do cancelamento
getActionCode();

//Método que retorna o status do cancelamento
getResponseCodeEnum();

Veja a tabela Códigos de Retorno do Autorizador Stone para os possíveis retornos do método getActionCode();
Veja a tabela Status do Cancelamento, para os possíveis retornos do método getResponseCodeEnum();

Use o ValidateTransactionByCardProvider() para validar se a transação que será cancelada foi realizada com o mesmo cartão que consta no TransactionDAO.

Suggest Edits

Provider de Reversão

 

Caso uma transação não tenha uma resposta do Autorizador Stone e retorne timeout, o SDK Android marcará a transação com o status WITH_ERROR e, com isso, enviará automaticamente um desfazimento logo em seguida.

Se o desfazimento for efetuado com sucesso, a transação terá status atualizado de WITH_ERROR para CANCELLED e o provider finalizado como erro Timeout.

Se a requisição de cancelamento também tiver timeout, será retornado o status WITH_ERROR.

O ReversalProvider deve ser utilizado para os casos em que existem transações com desfazimento pendente (status WITH_ERROR). Este provider varrerá o banco procurando por transações com esse status para realizar o cancelamento.

BOA PRÁTICA

Crie uma rotina no seu App para chamar este Provider para realizar o cancelamento das transações que ficarem com status WITH_ERROR.

A falta desta rotina pode resultar em cobranças duplicadas dos consumidores finais.

ReversalProvider reversalProvider = new ReversalProvider(this);
reversalProvider.setDialogMessage("Cancelando transação com erro");
reversalProvider.isDefaultUI();
reversalProvider.setConnectionCallback(new StoneCallbackInterface() {
      @Override
      public void onSuccess() {
        // code code code
      }

      @Override
      public void onError() {
        // code code code
      }
});
Suggest Edits

Provider de Envio de Comprovante por Email

 

O SendEmailTransactionProvider é o provider responsável por enviar o comprovante de uma transação por email.
Ele deve ser chamado assim que é realizada uma transação, caso o portador do cartão deseje receber o comprovante da compra.

Para executar o provider, é necessário passar o TransactionObject da transação que foi efetuada. Além disso, existem algumas propriedades que podem ser customizadas:

  • setReceiptType(ReceiptType) - Tipo de comprovante: Via do Estabelecimento ou Via do Cliente
  • addTo(Contact) - Destinatário do email
  • setFrom(Contact) - Remetente do email
  • setCompanyLogo(Bitmap) - Logo que irá ser exibida no comprovante
SendEmailTransactionProvider provider = new SendEmailTransactionProvider(CONTEXT, transactionObject);
	provider.setReceiptType(ReceiptType.CLIENT);
	provider.addTo(new Contact("cliente@gmail.com", "Nome do Cliente"));
	provider.setFrom(new Contact("parceiro_stone@gmail.com", "Nome do Parceiro"));
  provider.useDefaultUI(false);
  provider.setDialogMessage("Enviando comprovante");
  provider.setConnectionCallback(new StoneCallbackInterface() {
    public void onSuccess() {
      //Comprovante enviado com sucesso
    }

    public void onError() {
      //Comprovante não enviado
    }
  });
  provider.execute();
Suggest Edits

Provider de Validação de Transação

 

O ValidateTransactionByCardProvider é o provedor que verifica se existe no banco de dados local da SDK transações realizadas para um determinado cartão.

Para iniciar o provider, é necessário passar o context e um PinpadObject por parâmetro.

Ao fazer a chamada, o provider irá iniciar a comunicação com o Pinpad que irá requisitar a inserção do cartão. Em seguida, com as informações do cartão inserido, ele irá buscar no banco de dados todas as transações realizadas com aquele cartão e retornar para a sua aplicação.

Se o cartão inserido por Múltiplo, ou seja, possui crédito e débito, o pinpad irá perguntar ao portador qual opção ele deseja selecionar.

final ValidateTransactionByCardProvider validateTransactionByCardProvider = new ValidateTransactionByCardProvider(CONTEXT, PINPAD_OBJECT);

validateTransactionByCardProvider.setDialogMessage("Validando transação");
validateTransactionByCardProvider.useDefaultUI(true); 
validateTransactionByCardProvider.setDialogTitle("Aguarde");

validateTransactionByCardProvider.setConnectionCallback( new StoneCallbackInterface() {
  public void onSuccess() {
    // Para saber se existem transações com esse cartão:
    List<TransactionObject> transactions = validateTransactionByCardProvider.getTransactionWithCurrentCard();
  }

  public void onError() {
    // Erro na execução do provider
  }
});
Suggest Edits

Provider de Impressão

 

O PrintProvider pode ser utilizado apenas com pinpads que possuem suporte a print.

Na assinatura do construtor, o PrintProvider irá pedir três parâmetros, uma Activity, uma lista de PrintObject e o pinpad que irá imprimir o seu comprovante.

PrintObject representa cada linha que será impressa pelo PrintProvider.

Nome Tipo Função
message String Mensagem que será impressa (por linha).
size Integer Tamanho da impressão, SMALL, MEDIUM ou BIG, todos dentro do objeto PrintObject.
align Integer Alinhamento da impressão, LEFT, CENTER ou RIGHT, todos dentro do objeto PrintObject.

Para impressão de QR Code é necessário enviar a ‘TAG_PRINT’ como size e align. A mensagem que será enviada dentro do QR Code deve conter no máximo 512 caracteres.

Boas práticas

Para imprimir uma imagem com qualidade, ela deve ter no máximo 360 pixels de largura.

// Declara a lista de impressão, lembrando que cada item representa uma linha.
List<PrintObject> listToPrint = new ArrayList<PrintObject>();
for (int i = 0; i < 10; i++) {
    listToPrint.add(new PrintObject("Teste de impressão linha " + i, PrintObject.MEDIUM, PrintObject.CENTER));
}

final PrintProvider printProvider = new PrintProvider("SUA_ACTIVITY_AQUI", listToPrint, "PINPAD_QUE_VOCÊ_DESEJA_UTILIZAR");
printProvider.useDefaultUI(true);
printProvider.setDialogMessage("Imprimindo...");
printProvider.setConnectionCallback(new StoneCallbackInterface() {
    public void onSuccess() {
        // Notinha impressa com sucesso.
    }
    public void onError() {
        // Ocorreu um erro na impressão.
    }
});
printProvider.execute();

Com o código que tivemos de exemplo anteriormente, nós teremos o seguinte comprovante:

A SDK irá interpretar cada item da sua lista (cada PrintObject) como uma linha a ser impressa. Com o código que foi passado na imagem anterior, ele rodará um laço "for" e criará 10 linhas de impressão. O provider será executado e terá o resultado visto acima.

Por padrão, todas as notinhas são impressas com a logo da Stone.

Para visualizar exemplos de comprovante, acesse a seção Exemplo de Comprovante.

Suggest Edits

Provider de Conexão com Pinpad Bluetooth

 

A conexão com os pinpads bluetooth também é realizada pelo SDK. Para isso você utilizará o BluetoothConnectionProvider.

Liste na sua aplicação todos os aparelhos que já foram conectados ao dispositivo com a função BluetoothAdapter.getBondedDevices() do Android. Ela retornará todos os aparelhos que foram pareados com o dispositivo.

O provider BluetoothConnectionProvider recebe como parâmetro um objeto do tipo PinpadObject, que contém as informações do pinpad.

Esse objeto precisa ser preenchido previamente com as informações coletadas na chamada do método BluetoothAdapter.getBondedDevices() do Android.

Com a conexão realizada, o equipamento será adicionado em uma lista de pinpads conectados na classe Stone.

Para obter a lista de pinpads conectados utilize o método Stone.getPinpadObjectList().
Esse método irá retornar uma lista vazia caso o Bluetooth esteja desligado ou não haja conexão.

PinpadObject pinpadSelected = new PinpadObject("Nome do Pinpad", "mac address");

// Passa o pinpad selecionado para o provider de conexão bluetooth.
BluetoothConnectionProvider bluetoothConnectionProvider = new BluetoothConnectionProvider(context, pinpadSelected);
bluetoothConnectionProvider.setDialogMessage("Criando conexao com o pinpad selecionado"); // Mensagem exibida do dialog.
bluetoothConnectionProvider.useDefaultUI(true); 
bluetoothConnectionProvider.setConnectionCallback(new StoneCallbackInterface() {

    public void onSuccess() {
        Toast.makeText(context, "Pinpad conectado", Toast.LENGTH_SHORT).show();
    }

    public void onError() {
        Toast.makeText(context, "Erro durante a conexao. Verifique a lista de erros do provider para mais informacoes", Toast.LENGTH_SHORT).show();
    }
});
bluetoothConnectionProvider.execute(); // Executa o provider de conexão bluetooth.

Com o pinpad conectado, a aplicação está pronta para realizar transações.

Suggest Edits

Provider de Display

 

DisplayMessageProvider exibe uma mensagem de até 32 caracteres na tela do Pinpad.

Suggest Edits

Transações Financeiras

 
Transação Modalidades Formas de Pagamento
Débito Captura Imediata (Automática) À Vista
Crédito Captura Imediata (Automática) À Vista / Parcelado emissor / Parcelado lojista
Crédito Captura Posterior À Vista / Parcelado emissor / Parcelado lojista
Crédito Recorrência À Vista

Modalidades de Pagamento

À vista - Consiste no pagamento do valor total da compra

Parcelado - É o pagamento mensal do valor da compra, dividido pelo número escolhido de parcelas. O pagamento é realizado de acordo com a data de faturamento acordada entre o portador do cartão e o emissor, nos meses subsequentes a compra, até que o valor integral devido seja quitado. É o adquirente (Stone) quem controla o número máximo de parcelas desta transação. Existem dois tipos de parcelamentos e ambos possuem juros. A diferença é de quem os juros serão cobrados: a) do portador do cartão ou; b) do lojista.

Tipos de parcelamento

Nas transações com a Stone é possível optar pelas seguintes formas de parcelamento:

Parcelado lojista (sem juros) – é o pagamento mensal do valor da compra, dividido pelo número escolhido de parcelas. O pagamento é realizado de acordo com a data de faturamento acordada entre o portador do cartão e o emissor, nos meses subsequentes a compra, até que valor integral devido seja quitado. É o adquirente quem controla as parcelas desta transação.

Parcelado emissor (com juros) – é similar ao parcelado sem juros, porém, no valor a ser pago, será acrescentado juros cobrados diretamente pelo emissor e devidamente aceitos pelo portador. Para o adquirente e o estabelecimento, a transação será liquidada como à vista. É o emissor quem controla as parcelas dessa transação.

No módulo Utils, você possui ferramentas que podem lhe ajudar na criação da sua aplicação.

Com esse modulo você terá as seguintes ferramentas:

Ferramenta Função
ConnectionValidator Teste de conexão.
Utilities Utilitários para a sua aplicação, por exemplo, nomalizador de Strings.
Stone Informações que ficam compartilhadas entre a sua aplicação e a SDK.
Suggest Edits

Retorno do Sandbox

 

Nosso Sandbox permite que os desenvolvedores possam testar o comportamento para os principais códigos de retorno (Action Codes) possíveis. Os códigos retornados nas transações em ambiente de integração tem correspondência com o número de centavos do valor da transação.

Códigos para qualquer bandeira

Centavos Action Code Descrição Description
00 0000 Aprovado Approved
01 1007 Consultar o emissor Refer to card issuer
02 1008 Consultar as condições especiais do emissor Refer to card issuer's special conditions
03 1009 Estabelecimento inválido Invalid card acceptor
04 2000 Não aprovado Do not honour
05 1000 Não aprovado Do not honour
06 9999 Erro não especificado Other errors
07 2007 Condições especiais Special conditions
08 0001 Aprovar após verificação de identidade Approve after identity verification
09 9123 Requisição em progresso Request in progress
10 0002 Parcialmente aprovado Partially approved
11 0003 Aprovado (VIP) Approved (VIP)
12 9102 Transação inválida Invalid transaction
13 1010 Valor inválido Invalid amount
14 1011 Cartão inválido Invalid card number
15 9108 Não foi possível enviar a transação para o destinatário Transaction destination cannot be found for routing
16 0004 Aprovado, atualizar trilha 3 Approved, upgrade track 3
17 9999 Erro não especificado Other errors
18 9999 Erro não especificado Other errors
19 9103 Re-enter transaction Re-enter transaction
20 9999 Erro não especificado Other errors
21 9999 Erro não especificado Other errors
22 9999 Erro não especificado Other errors
23 1013 Unacceptable fee Unacceptable fee
24 3001
25 3002
26 3003
27 3004
28 3005
29 3006
30 9100 Erro no formato da mensagem One or more data element errors (see message error indicator)
31 9108 Não foi possível enviar a transação para o destinatário Transaction destination cannot be found for routing
32 9999 Erro não especificado Other errors
33 2001 Cartão vencido Expired card
34 2002 Suspeita de fraude Suspected fraud
35 2003 Estabelecimento entrar em contato com emissor Card acceptor contact acquirer
36 2004 Cartão com restrição Restricted card
37 2005 Estabelecimento entrar em contato com departamento de segurança do adquirente Card acceptor call acquirer's security department
38 2006 Tentativas de senha excedidas Allowable PIN tries exceeded
39 1014 Nenhuma conta do tipo selecionado No account of type requested
40 1015 Função selecionada não suportada Requested function not supported
41 2008 Cartão perdido Lost card
42 1014 Nenhuma conta do tipo selecionado No account of type requested
43 2009 Cartão roubado Stolen card
44 1014 Nenhuma conta do tipo selecionado No account of type requested
45 9999 Erro não especificado Other errors
46 9999 Erro não especificado Other errors
47 9999 Erro não especificado Other errors
48 9999 Erro não especificado Other errors
49 9999 Erro não especificado Other errors
50 9999 Erro não especificado Other errors
51 1016 Saldo insuficiente Not sufficient funds
52 1014 Nenhuma conta do tipo selecionado No account of type requested
53 1014 Nenhuma conta do tipo selecionado No account of type requested
54 1001 Cartão vencido Expired card
55 1017 Senha inválida Incorrect PIN
56 1018 No card record No card record
57 1019 Transação não permitida para o portador Transaction not permitted to cardholder
58 1020 Transação não permitida para o terminal Transaction not permitted to terminal
59 1002 Suspeita de fraude Suspected fraud
60 1003 Estabelecimento entrar em contato com adquirente Card acceptor contact acquirer
61 1021 Limite de valor para saque excedido Exceeds withdrawal amount limit
62 1004 Cartão com restrição Restricted card
63 1022 Violação de segurança Security violation
64 1010 Valor inválido Invalid amount
65 1023 Limite de quantidade de saques excedido Exceeds withdrawal frequency limit
66 1005 Estabelecimento entrar em contato com departamento de segurança do adquirente Card acceptor call acquirer's security department
67 2000 Não aprovado Do not honour
68 9999 Erro não especificado Other errors
72 9999 Erro não especificado Other errors
73 9999 Erro não especificado Other errors
74 9999 Erro não especificado Other errors
75 1006 Tentativas de senha excedidas Allowable PIN tries exceeded
82 9999 Erro não especificado Other errors
83 9999 Erro não especificado Other errors
90 9106 Cutover in process Cutover in process
91 9107 Emissor fora de operação Card issuer or switch inoperative
92 9108 Não foi possível enviar a transação para o destinatário Transaction destination cannot be found for routing
93 1024 Violação da lei Violation of law
94 9113 Transmissão duplicada Duplicate transmission
95 9115 Reconciliation cutover or checkpoint error Reconciliation cutover or checkpoint error
96 9109 Erro no sistema System malfunction

Códigos exclusivos para BINs MasterCard

Centavos Action Code Descrição Description
70 1007 Consultar o emissor Refer to card issuer
71 1048 Nova senha inválida New PIN invalid
76 1042 Status ruim para conta de destino To account bad status
77 1041 Status ruim para conta de origem From account bad status
78 1014 Nenhuma conta do tipo selecionado No account of type requested
79 8002
80 9112 Emissor indisponível Card issuer unavailable
81 9102 Transação inválida Invalid transaction
84 1033 Ciclo de vida inválido para a transação Invalid life cycle for the transaction
85 0000 Aprovado Approved
86 1801 Não é possivel Validar o PIN Can not Validate PIN
87 0862
88 1802 Falha na Criptografia Encryption failed
89 1017 Senha inválida Incorrect PIN

Códigos exclusivos para BINs Visa e ELO

Centavos Action Code Descrição Description
70 9999 Erro não especificado Other errors
71 9999 Erro não especificado Other errors
76 9114 Não foi possível encontrar a transação original Not able to trace back to original transaction
77 9999 Erro não especificado Other errors
78 1025 Cartão bloqueado Card not effective
79 9999 Erro não especificado Other errors
80 9112 Emissor indisponível Card issuer unavailable
81 1802 Falha na Criptografia Encryption failed
84 9999 Erro não especificado Other errors
85 0000 Aprovado Approved
86 1801 Não é possivel Validar o PIN Can not Validate PIN
87 9999 Erro não especificado Other errors
88 9999 Erro não especificado Other errors
89 9999 Erro não especificado Other errors

Além disso, é possível testar alguns cenários, como descrito abaixo:

Cenário Valor
Timeout R$666,00
Transações aprovadas Qualquer valor inteiro, entre R$1,00 e R$100,00
Suggest Edits

Códigos de Retorno do Autorizador Stone

 
Action Code Descrição Descrição
1000 Do not honour Não aprovado
1001 Expired card Cartão vencido
1002 Suspected fraud Suspeita de fraude
1003 Card acceptor contact acquirer Estabelecimento entrar em contato com adquirente
1004 Restricted card Cartão com restrição
1005 Card acceptor call acquirer's security department Estabelecimento entrar em contato com departamento de segurança do adquirente
1006 Allowable PIN tries exceeded Tentativas de senha excedidas
1007 Refer to card issuer Consultar o emissor
1008 Refer to card issuer's special conditions Consultar as condições especiais do emissor
1009 Invalid card acceptor Estabelecimento inválido
1010 Invalid amount Valor inválido
1011 Invalid card number Cartão inválido
1012 PIN data required Senha necessária
1014 No account of type requested Nenhuma conta do tipo selecionado
1015 Requested function not supported Função selecionada não suportada
1016 Not sufficient funds Saldo insuficiente
1017 Incorrect PIN Senha inválida
1019 Transaction not permitted to cardholder Transação não permitida para o portador
1020 Transaction not permitted to terminal Transação não permitida para o terminal
1021 Exceeds withdrawal amount limit Limite de valor para saque excedido
1022 Security violation Violação de segurança
1023 Exceeds withdrawal frequency limit Limite de quantidade de saques excedido
1024 Violation of law Violação da lei
1025 Card not effective Cartão bloqueado
1026 Invalid PIN block Dados de senha inválidos
1027 PIN length error Erro no tamanho da senha
1028 PIN key sync error Erro de sincronia de chave de senha
1029 Suspected counterfeit card Suspeita de cartão falso
1030 Currency unacceptable to card issuer Moeda inaceitável para o emissor
1032 Lost/stolen card Cartão perdido ou roubado
1035 Closed account Conta encerrada
1036 Closed savings account, or restricted for closing Conta poupança encerrada ou bloqueada para encerramento
1037 Closed credit account or restricted for closing Conta de crédito encerrada ou bloqueada para encerramento
1039 Closed cheque account or restricted for closing Conta corrente encerrada ou bloquada para encerramento
1041 From account bad status Status ruim para conta de origem
1042 To account bad status Status ruim para conta de destino
1045 Card verification data failed Código de segurança inválido
1047 PIN change required Troca de senha necessária
1048 New PIN invalid Nova senha inválida
1057 Payment date invalid Data de pagamento inválida
1060 Transaction did not complete normally at terminal Transação não completou normalmente no terminal
1061 Transaction not supported by the card issuer Transação não suportada pelo emissor
1062 Cashback not allowed Saque fácil não disponível
1063 Cashback amount exceeded Limite de saque fácil excedido
1064 Declined, transaction processed offline by terminal Negado offline pelo terminal
1065 Declined, terminal unable to process offline Negado, não foi possível processar offline
2000 Do not honour Não aprovado
2001 Expired card Cartão vencido
2002 Suspected fraud Suspeita de fraude
2003 Card acceptor contact acquirer Estabelecimento entrar em contato com emissor
2004 Restricted card Cartão com restrição
2005 Card acceptor call acquirer's security department Estabelecimento entrar em contato com departamento de segurança do adquirente
2006 Allowable PIN tries exceeded Tentativas de senha excedidas
2007 Special conditions Condições especiais
2008 Lost card Cartão perdido
2009 Stolen card Cartão roubado
2010 Suspected counterfeit card Suspeita de cartão falso
2011 Daily withdrawal uses exceeded Limite de quantidade de saques excedido
2012 Daily withdrawal amount exceeded Limite de valor para saque excedido
9100 One or more data element errors (see message error indicator) Erro no formato da mensagem
9102 Invalid transaction Transação inválida
9103 Re-enter transaction Tente novamente
9105 Acquirer not supported by switch Adquirente não suportado pelo switch
9107 Card issuer or switch inoperative Emissor fora de operação
9108 Transaction destination cannot be found for routing Não foi possível enviar a transação para o destinatário
9109 System malfunction Erro no sistema
9110 Card issuer signed off Emissor se desconectou
9111 Card issuer timed out Emissor não respondeu em tempo
9112 Card issuer unavailable Emissor indisponível
9113 Duplicate transmission Transmissão duplicada
9114 Not able to trace back to original transaction Não foi possível encontrar a transação original
9116 MAC incorrect MAC incorreto
9117 MAC key sync error Erro de sincronização de chave de MAC
9118 No communication keys available for use Nenhuma chave de comunicação disponível
9119 Encryption key sync error Erro de sincronização de chave de encriptação
9120 Security software/hardware error – try again Erro de segurança de software/hardware, tente novamente
9121 Security software/hardware error – no action Erro de segurança de software/hardware
9122 Message number out of sequence Número da mensagem fora de sequência
9123 Request in progress Requisição em progresso
9124 Invalid security code Código de segurança inválido
9125 Database error Erro no banco de dados
9132 Recurring data error Erro nos dados de recorrência
9133 Update not allowed Atualização não permitida
9350 Violation of business arrangement Violação de acordo comercial
9999 Other errors Erro não especificado
UNPR Rejection Não Foi possível processar – Não foi possível processar a mensagem. Tente novamente.
IMSG Rejection Mensagem Invalida – A mensagem enviada possui um formato inválido.
PARS Rejection Erro na leitura da mensagem – Algum campo obrigatório não esta sendo enviado
SECU Rejection Segurança – Algum erro no processo de segurança. A chave de criptografia pode não estar presente no terminal.
INTP Rejection SAK Invalido – O SAK enviado não foi reconhecido
RCPP Rejection Destinatario Invalido – O local para aonde a mensagem foi enviada esta invalida
DPMG Rejection Mensagem Duplicada – Esta mensagem já foi recebida pela Stone.
VERS Rejection Protocolo – A versão do protocolo enviada não é suportada.
MSGT Rejection Tipo da Mensagem – o Message Type enviado não é reconhecido.
Suggest Edits

UserModel

 

O UserModel é o objeto que representa as informações do usuário ativado na aplicação. Estas informações são guardadas em cache e são constantemente utilizadas pela aplicação.

Os atributos desse objeto são:

Campo Tipo Descrição
merchantName String Nome do estabelecimento no cadastro Stone
merchantDocumentNumber String CNPJ do estabelecimento
stoneCode String StoneCode do estabelecimento
merchantAddress Adress Endereço do estabelecimento no cadastro Stone
merchantUserPhone UserPhone Telefone do estabelecimento
Suggest Edits

TransactionDAO

 

TransactionDAO é o objeto responsável por controlar o banco de dados do SDK. Este objeto diponibiliza alguns métodos para buscar dados das transações salvas no banco.

Os métodos disponíveis são:

Método Tipo do retorno Descrição
getLastTransactionId() int Retorna o TRANSACTION_ID da última transação processada pelo SDK
getAllTransactionsOrderByIdDesc() List<TransactionObject> Retorna todas as trasnações processadas pelo SDK ordenadas do maior TRANSACTION_ID para o menor
getAllTransactions() List<TransactionObject> Retorna todas as trasnações processadas pelo SDK
findTransactionWithId(Integer transactionId) TransactionObject Busca uma transação pelo TRANSACTION_ID
findTransactionWithAuthorizationCode(String authorizationCode) TransactionObject Busca uma transação pelo AUTHORIZATION_CODE
findTransactionWithInitiatorTransactionKey(String initiatorTransactionKey) TransactionObject Busca uma transação pelo INITIATOR_TRANSACTION_KEY
findTransactionByFilter(Map<String, String> filters) List<TransactionObject> Busca uma transação de acordo com o filtro escolhido (CHAVE, VALOR) (Ex: "RECIPIENT_TRANSACTION_IDENTIFICATION", "32019832938120")

A base de dados contém os seguintes campos:

Campo Tipo Descrição
TRANSACTION_ID String Id da transação
RECIPIENT_TRANSACTION_IDENTIFICATION String Identificador da transação que é retornado pelo autorizador (StoneID ou ATK)
INITIATOR_TRANSACTION_KEY String Identificador da transação gerador pela aplicação que iniciou a transação (ITK)
AMOUNT String Valor da transação
TYPE_OF_TRANSACTION String Tipo de transação
INSTALMENT_TYPE String Tipo de parcelamento
NUMBER_OF_INSTALMENT String Quantidade de parcelas
CARD_HOLDER_NUMBER String Cartão usado na transação no formato 654343**9834
CARD_BRAND String Bandeira do cartão
CARD_HOLDER_NAME String Nome do portador do cartão
AUTHORIZATION_CODE String Código de autorização gerado pelo emissor do cartão
DATE String Dia da transação no formato: dd/MM/yyyy
TIME String Hora da transação no formato: HH:mm:ss
TIME_TO_PASS_TRANSACTION String Tempo de execução da transação
SHORT_NAME String Nome customizado exibido na fatura do portador do cartão (máximo de 14 caracteres)
EMAIL_CLIENT String Email do cliente (usado para enviar o comprovante)
ACTION_CODE String Código de retorno da transação
STATUS_OF_TRANSACTION String Status da transação
BALANCE String Saldo do voucher (ex.: Ticket, Sodexo)
CAPTURE String Define se a transação foi realizada com captura automática ou não.
PINPAD_USED String Pinpad utilizado na transação
CANCELLATION_DATE String Data do cancelamento no formato: dd/MM/yyyy
SUB_MERCHANT_CATEGORY_CODE String MCC do lojista que efetuou a transação (Campo restrito para subAdquirentes)
SUB_MERCHANT_ADDRESS String Endereço do lojista que efetuou a transação (Campo restrito para subAdquirentes)
Suggest Edits

TransactionObject

 

O TransactionObject é o objeto que contém todas as informações relacionadas à uma transação e possui os seguintes atributos:

Campo Tipo Descrição
recipientTransactionIdentification String Identificador único da transação gerado pela Stone. Conhecido como StoneID ou ATK (Acquirer Transaction Key)
initiatorTransactionKey String Identificação da transação definido pela sua aplicação (ITK)
amount String Valor da transação no formato de centavos (ex: 10,00 vai ser 1000. Basta multiplicar por 0.01 para obter o valor real.)
typeOfTransaction typeOfTransactionEnum Débito ou crédito
instalmentTransaction InstalmentTransactionEnum Número de parcelas da transação
instalmentType InstalmentTypeEnum Tipo de parcelamento da transação
cardHolderNumber String 4 últimos número do cartão
cardBrand cardBrandEnum Bandeira do cartão
cardHolderName String Nome do portador do cartão
authorizationCode String Código de autorização gerado pelo Emissor
transactionStatus TransactionStatusEnum Aprovada, cancelada, negada...
date String Data da transação
shortName String Nome customizado exibido na fatura (se não for definido será null) Armazena em banco opção setada no campo shortName do TransactionObject
userModel userModel Dados cadastrais do lojista que passou a transação
pinpadUsed String Pinpad que passou a transação
balance String Saldo do voucher (ex.: Ticket, Sodexo)
capture Boolean Define se a transação será/foi realizada com captura automática ou não.
subMerchantCategoryCode String MCC do lojista que efetuou a transação (Campo restrito para subAdquirentes)
subMerchantAddress String Endereço do lojista que efetuou a transação (Campo restrito para subAdquirentes)
Suggest Edits

Transaction Enums

 

Nesta seção estão descritos os valores possíveis do instalmentTransactionEnum, typeOfTransactionEnum e o InstalmentTypeEnum:

instalmentTransactionEnum

Enum Descrição
ONE_INSTALMENT 1x (à vista)
TWO_INSTALMENT_NO_INTEREST 2x sem juros
THREE_INSTALMENT_NO_INTEREST 3x sem juros
FOUR_INSTALMENT_NO_INTEREST 4x sem juros
FIVE_INSTALMENT_NO_INTEREST 5x sem juros
SIX_INSTALMENT_NO_INTEREST 6x sem juros
SEVEN_INSTALMENT_NO_INTEREST 7x sem juros
EIGHT_INSTALMENT_NO_INTEREST 8x sem juros
NINE_INSTALMENT_NO_INTEREST 9x sem juros
TEN_INSTALMENT_NO_INTEREST 10x sem juros
ELEVEN_INSTALMENT_NO_INTEREST 11x sem juros
TWELVE_INSTALMENT_NO_INTEREST 12x sem juros
TWO_INSTALMENT_WITH_INTEREST 2x com juros
THREE_INSTALMENT_WITH_INTEREST 3x com juros
FOUR_INSTALMENT_WITH_INTEREST 4x com juros
FIVE_INSTALMENT_WITH_INTEREST 5x com juros
SIX_INSTALMENT_WITH_INTEREST 6x com juros
SEVEN_INSTALMENT_WITH_INTEREST 7x com juros
EIGHT_INSTALMENT_WITH_INTEREST 8x com juros
NINE_INSTALMENT_WITH_INTEREST 9x com juros
TEN_INSTALMENT_WITH_INTEREST 10x com juros
ELEVEN_INSTALMENT_WITH_INTEREST 11x com juros
TWELVE_INSTALMENT_WITH_INTEREST 12x com juros

typeOfTransactionEnum

Enum Descrição
CREDIT Crédito
DEBIT Débito
VOUCHER Voucher

InstalmentTypeEnum

Enum Descrição
MERCHANT Parcelado lojista (Sem juros)
ISSUER Parcelado emissor (Com juros)
Suggest Edits

PinpadObject

 

O PinpadObject representa os dados do pinpad e possui os seguintes atributos:

Nome Tipo Função
id Integer ID do Pinpad quando for carregado pelo PinpadDAO.
name String Nome do Pinpad (format: MODELO-SERIAL).
macAddress String Mac address do dispositivo bluetooth.
printSupport boolean Se o Pinpad possui suporte para impressão.
timeToConnect String Tempo que levou para criar a última conexão.
majorDevice int O tipo do Bluetooth (headset, phone, pc, etc.).
Suggest Edits

Status da Transação

 
Valor Descrição
UNKNOWN Ocorreu um erro antes de ser enviada para o autorizador.
APPROVED Transação aprovada com sucesso.
DECLINED Transação negada.
DECLINED_BY_CARD Transação negada pelo cartão.
CANCELLED Transação cancelada (ocorre no cancelamento, ou seja, CancellationProvider).
PARTIAL_APPROVED Transação foi parcialmente aprovada.
TECHNICAL_ERROR Erro técnico (ocorreu um erro ao processar a mensagem no autorizador).
REJECTED Transação rejeitada.
WITH_ERROR Transação não completada com sucesso. O Provedor de Reversão irá desfazer as transações com este status.
Suggest Edits

TransactionProvider ActionEnum

 

Abaixo estão descritos os action enums do Provedor de Transação. Estes Enums indicam as acões que a SDK está executando ou que precisam ser executadas pelo portador do cartão.

Valor Descrição
TRANSACTION_WAITING_CARD Aguardando o cartão ser inserido
TRANSACTION_WAITING_PASSWORD Aguardando a senha do cartão
TRANSACTION_SENDING Enviando a transação para a Stone
TRANSACTION_WAITING_REMOVE Aguardando o cartão ser retirado (Somente para Chip e Senha)
REVERSING_TRANSACTION_WITH_ERROR Tentando reverter transação com status WITH_ERROR
Suggest Edits

Status do Provider

 

Status genéricos compartilhados por todos os providers

Valor Descrição
CONNECTION_NOT_FOUND Sem conexão com a internet, ligue a internet.
DEVICE_NOT_COMPATIBLE Dispositivo bluetooth não possui a biblioteca compartilhada.
UNEXPECTED_STATUS_COMMAND Status de um comando inexperado, tente novamente.
GENERIC_ERROR Um erro genérico.
IO_ERROR_WITH_PINPAD Erro de leitura e escrita com o Pinpad.
PINPAD_CONNECTION_NOT_FOUND Sem conexão com um Pinpad, conecte-se com um dispositivo.
NO_ACTIVE_APPLICATION SDK não foi ativada. Chame o ActiveApplicationProvider.
UNKNOWN_TYPE_OF_USER Um tipo de usuário desconhecido, Usuário final ou Desenvolvedor (User ou Partner).
INVALID_AMOUNT Valor inválido para passar a transação.
TIME_OUT Tempo expirado, tente novamente.
OPERATION_CANCELLED_BY_USER Operação cancelada pelo usuário, provavelmente o botão X foi pressionado.
CARD_REMOVED_BY_USER Cartão removido pelo usuário indevidamente.
CANT_READ_CARD_HOLDER_INFORMATION Erro na leitura das informações do cartão, tente novamente.
INVALID_TRANSACTION Transação inválida, talvez um cartão de crédito esteja passando uma transação de débito, ou viceversa.
PASS_TARGE_WITH_CHIP Cartão de chip passou tarja.
NULL_RESPONSE Não houve resposta do Pinpad.
ERROR_RESPONSE_COMMAND Erro na resposta do comando.
ACCEPTOR_REJECTION Transação rejeitada pelo autorizador.
EMAIL_MESSAGE_ERROR Erro no envio do email.
INVALID_EMAIL_CLIENT Email do cliente é inválido.
INVALID_STONE_CODE_OR_UNKNOWN StoneCode foi digitado de forma errada ou não existe.
TRANSACTION_NOT_FOUND Não se pode cancelar uma transação que não foi aprovada.
TRANSACTION_NOT_APPROVED Você não pode cancelar uma transação não aprovada.
INVALID_STONECODE Seu stonecode tem mais do que 9 caracteres.
USERMODEL_NOT_FOUND User Model não encontrado.
NO_PRINT_SUPPORT Seu Pinpad não tem suporte para impressão.
CANT_READ_CHIP_CARD O Pinpad não consegue ler o chip do cartão.
PINPAD_WITHOUT_STONE_KEY O Pinpad não tem a chave de criptografia da Stone.
EMAIL_EMPTY Email do cliente está vazio.
PINPAD_ALREADY_CONNECTED Pinpad já conectado.
CONNECTIVITY_ERROR Erro de conectividade.

Erros de Impressão do POS Android

PRINTER_PRINT_ERROR
PRINTER_BUSY_ERROR
PRINTER_INIT_ERROR
PRINTER_LOW_ENERGY_ERROR
PRINTER_OUT_OF_PAPER_ERROR
PRINTER_UNSUPPORTED_FORMAT_ERROR

Erros de Pedido do POS Android

PED_PASS_KEY_ERROR
PED_PASS_USER_CANCELED_ERROR
PED_PASS_NO_PIN_INPUT_ERROR
PED_PASS_TIMEOUT_ERROR

Erros na Transação do POS Android

TRANS_APP_BLOCKED_ERROR
TRANS_SELECT_TYPE_USER_CANCELED_ERROR
TRANS_INVALID_AMOUNT_ERROR
TRANS_PASS_MAG_BUT_IS_ICC_ERROR

Erro de Cartão no POS Android

CARD_ERROR
CARD_READ_ERROR
CARD_READ_TIMEOUT_ERROR
CARD_READ_CANCELED_ERROR
CARD_REMOVED_ERROR
CARD_UNSUPPORTED_ERROR
TRANSACTION_OBJECT_NULL_ERROR
Suggest Edits

Status do Cancelamento

 

Para ter acesso ao status do cancelamento, você deve utilizar o método:

provider.getResponseCodeEnum();

Que retornará um enum com os seguintes valores:

Valor Descrição
DECLINED Cancelamento negado.
APPROVED Cancelamento aprovada
o com sucesso.
PARTIALAPPROVED Cancelamento parcialmente aprovado.
TECHNICALERROR Erro técnico (ocorreu um erro ao processar a mensagem do autorizador).

Em caso de DECLINED, você pode capturar a mensagem do autorizador com o método:

getMessageFromAuthorize()

São mensagens como: “Saldo insuficiente”, “Cartão inválido”, “Violação de segurança”, etc.

Códigos de Retorno Autorizador

Todos os códigos possíveis retornados pelo autorizador Stone em produção se encontram na seção Códigos de Retorno do Autorizador Stone.

Suggest Edits

Status de Comandos

 
Valor ID Descrição
COMMAND_OK 0 Comando executado com sucesso.
NO_SECURE_COMMUNICATION 3 Não foi estabelecida uma conexão segura com o Pinpad.
PRESS_1 4 Pressione F1
PRESS_2 5 Pressione F2
PRESS_3 6 Pressione F3
PRESS_4 7 Pressione F4
PRESS_BACKSPACE 8 Pressione Espaço
DEC_ERROR 9 Erro de decodificação
INVALID_CALL 10 Chamada inválida
INVALID_PARAMETER 11 Parâmetro inválido
TIME_OUT 12 Time out
OPERATION_CANCELLED_BY_USER 13 Operação cancelada pelo usuário.
NOT_OPEN 15 Comando OPN não enviado.
PARAMETER_NOT_FOUND 19 Falta de um parâmetro mandatório.
DIFFERENT_TABLES_EMV 20 Tabelas AID e CAPK diferentes.
TABLES_UPLOAD_ERROR 21 Erro na carga de tabelas.
PINPAD_INTERNAL_ERROR 40 Erro interno do Pinpad.
MAGNETIC_CARD_ERROR 41 Erro na leitura da tarja.
MK_DUKPT_NOT_FOUND 42 DUKPT não encontrada.
NO_ICC_PRESENCE 43 Não há presença de ICC.
PINPAD_CANT_PROCESS_PIN_CAPTURE 44 O pinpad não conseguiu processar a captura da senha.
RESPONSE_DATA_LIMIT_EXCEEDED 45 Resposta excedeu o limite de informações.
SAM_NOT_FOUND 51 SAM não encontrado.
ICC_NOT_FOUND 60 ICC não encontrado.
COMMUNICATION_ICC_OR_CTLS_ERROR 61 Erro de comunicação ICC ou CTLS.
INVALID_CARD 67 Cartão inválido.
ICC_WITH_PROBLEM 68 Problemas no ICC.
INVALID_DATAS_IN_ICC 69 Informações inválidas no ICC.
ICC_EMV_WITHOUT_AVAILABLE_APPLICATION 70 ICC sem aplicação disponível.
SELECTED_APPLICATION_CANT_BE_USED 71 Aplicação selecionada não pode ser usada.
HIGH_ICC_EMV_ERROR 76 Alto erro no ICC.
MORE_THEN_ONE_CTLS_DETECTED 80 Mais de um CTLS detectado.
COMMUNICATION_BETWEEN_TERMINAL_CTLS_ERROR 81 Erro na comunicação com CTLS e o Pinpad.
INVALID_CTLS 82 CTLS inválido.
CTLS_WITH_PROBLEM 83 CTLS com problema.
CTLS_WITHOUT_APPLICATION_AVAILABLE 84 CTLS sem aplicação disponível.
APPLICATION_SELECTED_CANT_BE_USED 85 Aplicação selecionada não pode ser usada.
FILE_NOT_FOUND 100 Arquivo não encontrado.
FILE_FORMAT_ERROR 101 Erro no formato do arquivo.
FILE_UPLOAD_ERROR 102 Erro na carga do arquivo.
COMMAND_CONSTRUCTOR_ERROR 999 Erro no construtor da resposta.
Suggest Edits

Exemplo de Comprovante

 

Via do Estabelecimento

ID 123456789012345678901234567890123456789
1 STONE – Via Estabelecimento
2 VVVVVVVVVVVVVVVVVVVVVVV
3 *1234 DD/MM/YY HH:MM
4 EC:2100490717 AUT:
6 DOC:012345624112016151100
7 Stone Id:4598785265485698
8 AC:XXXXXXXXXXXXXXXX XXX-YYY
9 AID: A000000003101005
10 VISA CREDIT 3 APROVADO
11 CNE: XXXXXXXXXXXXXXXX
12 PARCELADO XXX JUROS: NN PARCELAS
13 TOTAL R$ 9,999,999,999.99
14 TOTAL ESTORNO: R$ 9.999.999.999,99
15 --------------------------------------
16 NOME DO PORTADOR
17 RECONHEÇO E PAGAREI A DÍVIDA
18 AQUI REPRESENTADA
19 TRANSAÇÃO APROVADA COM SENHA

Abaixo apresentamos exemplos de comprovantes (Via do Lojista) com as informações mínimas exigidas pela Stone, Bandeiras e Emissores:

Exemplo de comprovante de uma transação de *débito*

Exemplo de comprovante de uma transação de débito

Exemplo de comprovante de uma transação de *crédito*

Exemplo de comprovante de uma transação de crédito

Exemplo de comprovante de uma transação de *voucher*

Exemplo de comprovante de uma transação de voucher

Exemplo de comprovante de uma transação de *cancelamento*

Exemplo de comprovante de uma transação de cancelamento

Via do portador

ID 12345678901234567890123456789012345678
1 STONE – VIA CLIENTE
2 VVVVVVVVVVVVVVVVVVVVVVV
3 123456*1234 DD/MM/YY HH:MM
6 DOC: 012345624112016151100
20 AUT:000000 XXX-YYY
12 PARCELADO XXX JUROS: NN PARCELAS
13 TOTAL: R$ 9.999.999.999,99
14 TOTAL ESTORNO: R$ 9.999.999.999,99
21 SALDO DISPONÍVEL: R$ 9.999.999,99

Abaixo apresentamos exemplos de comprovantes (Via do Cliente) com as informações mínimas exigidas pela Stone, Bandeiras e Emissores:

Exemplo de comprovante de uma transação de *débito*

Exemplo de comprovante de uma transação de débito

Exemplo de comprovante de uma transação de *crédito*

Exemplo de comprovante de uma transação de crédito

Exemplo de comprovante de uma transação de *voucher*

Exemplo de comprovante de uma transação de voucher

Exemplo de comprovante de uma transação de *cancelamento*

Exemplo de comprovante de uma transação de cancelamento

Suggest Edits

Dúvidas frequentes

 

Qual a estrutura seguida pela SDK Stone?

A SDK é dividida em 4 módulos:

  1. Providers: todos os providers seguem o mesmo modelo. Todos herdam de uma classe modelo que extende da classe AsyncTask do Android, então toda escrita e leitura de comandos com o Pinpad, requisições de transações e ativações, conexões etc são executadas em uma thread secundária do método ‘doInBackground’.
  2. Utils: no módulo Utils você encontra ferramentas que podem ajudar na criação da sua aplicação.
  3. Comandos: Esse módulo contém os comandos de leitura e escrita que são utilizados para se comunicar com os Pinpads.
  4. Outros

Como eu posso enviar uma transação?

Passar transações com a nova SDK é simples e rápido. O primeiro passo é instanciar um objeto do tipo TransactionObject, e então populá-lo. Após fazer isso, você pode passá-lo para o TransactionProvider, que será o responsável por enviar a transação para o autorizador e trabalhar com a inserção e atualização no TransactionDAO.
É importante lembrar que TransactionProvider segue a mesma estrutura do ActiveApplicationProvider, BluetoothConnectionProvider e os demais. Esse provider pede uma Activity, o TransactionObject que foi criado anteriormente, o usuário atual do aplicativo e o pinpad que está sendo utilizado.
Para mais informações e exemplos, acesse a nossa documentação em:
http://sdkandroid.stone.com.br/docs/provedor-de-transação-1"

Como fazer a comunicação com o Pinpad?

Para criar uma conexão, basta instanciar um objeto do tipo PinpadObject e informar o nome e o mac address do dispositivo. Estas informações podem ser obtidas com os itens que são retornados da função BluetoothAdapter.getBondedDevices(); do Android.
Depois de fazer isso, com a conexão realizada com sucesso, o Pinpad então é adicionado em uma lista de Pinpads conectados na classe Stone. Para obter a lista, você pode utilizar o método Stone.getPinpadListSize(). Esse método é retornado como null caso o Bluetooth esteja desligado ou se não houver conexão.
Sempre que a SDK solicitar um Pinpad como parâmetro, você pode passar Stone.getPinpadFromListAt(0), se você estiver conectado somente com um Pinpad.

Eu consigo me comunicar com mais de um Pinpad ao mesmo tempo?

Sim, é possível conectar com mais de um Pinpad, sendo possível selecionar um deles no momento da transação.

Quais Pinpads são homologados com a Stone?

A SDK Mobile Android se comunica exclusivamente com Pinpads Bluetooth. Os Pinpads Bluetooth homologados conosco são:

  • Gertec MobiPin 10
  • PAX D180
  • PAX D200.

Consigo imprimir um QR Code?

Sim, disponibilizamos uma função que permite a impressão de QR Codes. Para ver mais instruções, acesse a nossa documentação em: http://sdkandroid.stone.com.br/docs/provedor-de-impressão-1

Como faço um cancelamento de uma transação?

O provider de Cancelamento, CancellationProvider, é um dos provedores mais simples.
Para efetuar um cancelamento, você deve instanciar o CancellationProvider e passar a sua Activity e o ID da transação que deseja cancelar (você pode obter todos os IDs das transações com o TransactionDAO).

Como consigo uma chave de acesso para iniciar a integração?

Para acessar o ambiente de integração é necessário, primeiro, se cadastrar no nosso programa de parcerias. Cadastre-se aqui.
Caso já tenha preenchido e ainda não recebeu nosso contato, você deve enviar um e-mail para o integracoes@stone.com.br com as seguintes informações:

  • O nome da empresa parceira que realizará transações na Stone;
  • O CNPJ da empresa;
  • Uma descrição sucinta do negócio parceiro (em uma frase);
  • E-mail para o qual a credencial deve ser enviada.

Quais bandeiras são aceitas?

  • Visa
  • Mastercard
  • Hiper
  • Elo
  • Amex
  • Alelo
  • VR
  • Sodexo

Como consigo consultar uma transação?

Quando você faz uma busca por TransactionID nós indicamos qual é o status atual daquela transação — isto é, se ela já foi compensada ou não.

Preciso usar o SAK?

Não, o SAK é uma informação utilizada pelo SDK Android conforme a ativação por meio do Stonecode.

Como ativo a solução de SDK Android no cliente final?

Depois de finalizada a integração/desenvolvimento no ambiente de testes, usando um StoneCode de teste, você precisa solicitar ao representante comercial um StoneCode de produção.
Caso você não tenha um representante comercial, é possível fazer essa solicitação pelo canal: meajuda@stone.com.br.

Existe um padrão que a filipeta segue?

Sim, o SDK monta todo o comprovante automaticamente (de acordo com o ID de transação fornecido e contanto que a transação exista no TransactionDAO).
Por padrão, todas as notinhas são impressas com a logo da Stone.

Existe um fluxo para aviso prévio de atualização das soluções?

Atualmente não temos um fluxo de aviso prévio das atualizações, porém estamos desenvolvendo isso. Para se manter atualizado das novas versões, acompanhe sempre as mudanças no changelog da documentação.

O provedor StoneTransaction foi removido da SDK?

Sim, hoje é possível preencher todas os dados necessários diretamente no provedor TransactionObject

Quais são as diferenças entre TransactionProvider e TransactionObject

O TransactionObject deve ser utilizado para instanciar dados como: Valor da transação, Modelo de operação, à vista/ Parcelado, etc. Já o provedor TransactionProvider e responsável pelo leitura do cartão inserido e por encaminhar efetivamente a transação ao autorizador Stone.

Quais são as diferenças entre PosTransactionProvider e TransactionProvider?

Deve-se utilizar o objeto PosTransactionProvider apenas para terminais POS com sistema operacional Android.

Suggest Edits

Xamarin. Como importar a SDK e suas dependências?

 

Quando uma aplicação nativa Android se integra na SDK, todas as dependências externas da SDK são importadas automaticamente através do Gradle, por serem da mesma plataforma.
Quando uma aplicação é desenvolvida em Xamarin, ela não tem essa compatibilidade para importar as dependências automaticamente. Dado isso, definimos uma solução para conseguir ajudar os parceiros a pegarem essas dependências e importarem manualmente para a aplicação deles.

Segue o passo a passo de como isso deve ser feito:

  1. Baixe o app demo da SDK neste link;
  2. Abra a demo no Android Studio;
  3. Abra a seção “Gradle” na lateral do lado direito, conforme imagem abaixo:
  1. Com a seção aberta, vá em demo-sdk-android > :app > Tasks > help e clique 2x em dependencies (Cuidado porque tem o demo-sdk-android e dentro tem outro demo-sdk-android (root) e o :app, você precisa entrar em :app)
  1. Ao clicar 2x em dependencies, será executado um comando no rodapé da IDE. Assim que o comando for finalizado, será exibido no output toda a árvore de dependências da SDK:
  1. Nessa árvore de dependências, procure por:
    a. br.com.stone:stone-sdk: para as dependências do core da SDK;
    b. br.com.stone:stone-sdk-posandroid: para as dependências do módulo de POS Android da SDK;
    c. br.com.stone:stone-sdk-posandroid-ingenico: caso você esteja utilizando o terminal APOS A8 da Ingenico;
    d. br.com.stone:stone-sdk-posandroid-pax: caso você esteja utilizando o terminal A920 da Pax;
    e. br.com.stone:stone-sdk-posandroid-nexgo: caso você esteja utilizando o terminal N5 da Nexgo.

Basicamente, você precisa procurar e baixar todas essas dependências (as que explicitamos acima e suas sub-dependências) na internet, que normalmente será no formato .jar/.aar, e importar para sua aplicação Xamarin.
O passo a passo de como fazer esse importe pode ser encontrado na internet, no fórum do Xamarin.

As dependências que possuem br.com.stone podem ser encontradas neste link.

Suggest Edits

Changelog

Alterações realizadas na aplicação

 

v3.0.4 (28/02/2019)

Correções

  • Corrigido o valor de cardSequenceNumber para todas as bandeiras.

v3.0.3 (20/02/2019)

Correções

  • Corrigido o fluxo de pagamento por meio de tarja magnética
  • Corrigido o fluxo de fallback
  • Corrigido o crash em dispositivos Android 4.1.2.
  • Corrigido o valor enviado ao autorizador quando cardSequenceNumber é 0.

v3.0.2 (04/02/2019)

Correções

  • Retirada a permissão de SYSTEM_ALERT_WINDOW.

v3.0.1 (25/01/2019)

Correções

  • Correção do bug onde a SDK perdia o pareamento com os pinpads com muita frequência.

v3.0.0 (22/01/2019)

Novas Implementações

  • Android gradle build tools atualizado para 3.2.1
  • Adicionado método getUserModel() no TransactionObject que retorna o objeto referente ao lojista que efetuou a transação (em caso de múltiplos stone codes ativos).
  • Adicionado método setCompanyLogo(Bitmap companyLogo) no SendEmailTransactionProvider
    para substituir a logo padrão da Stone por uma personalizada.
  • Adicionada variável boolean interest para verificar se a parcela é com ou sem juros no enum
    InstalmentTransactionEnum.
  • Adicionado COMMUNICATION_ERROR no enum `PinpadFeedback.
  • Adicionada classe TransactionsByCardProvider para obter as transações pelo PAN.
  • Adicionado método getPinpadObjectList à Stone.
  • Adicionado método setAppName em Stone . Obrigatório o preenchimento para transacionar.
  • Kotlin 1.2.51 adicionado às dependências.
  • OkHttp 3.9.1 adicionado às dependências.
  • Adicionado novos ENUMS de erro:
  • CARD_READ_ERROR Erro de leitura do cartão.
  • TRANSACTION_OBJECT_NULL_ERROR TransactionObject passado para o provider
  • INTERNAL_ERROR Erro interno no SDK
  • UNKNOWN_ERROR Erro desconhecido
  • EMAIL_RECIPIENT_EMPTY Nenhum destinatário do email foi adicionado
  • APPNAME_NOT_SET AppName não foi setado na classe Stone
  • TRANSACTION_FALLBACK_STARTED Erro adicional indicando que o fluxo de
    fallback foi iniciado.
  • TRANSACTION_FALLBACK_TIMEOUT Erro adicional indicando que o tempo de espera de um cartão de tarja foi expirado.
  • SDK_VERSION_OUTDATED Erro de versão do SDK abaixo da mínima obrigatória.

Alterações

  • Adicionado o Enum RECONNECT_WITH_PINPAD em ErrorsEnum.
  • Adicionados os seguintes Enums em CancellationReasonEnum:.
    CUSTOMER_CANCELLATION, UNSPECIFIED, SUSPECTED_MALFUNCTION, UNKNOWN.
  • Classe StoneTransaction removida. Para fazer transações, preencha diretamente o.
    TransactionObject com as informações necessárias.
  • Todos os erros que geravam o Enum GENERIC_ERROR foram movidos para UNKNOWN_ERROR.
  • Construtor ValidateTransactionByCardProvider(Context, PinpadObject, UserModel) depreciado, use ValidateTransactionByCardProvider(Context, PinpadObject).
  • Método getTransactionsWithCurrentCard de ValidateTransactionByCardProvider foi removido. Use TransactionsByCardProvider.
  • Classe SendEmailProvider removida. Use SendEmailTransactionProvider.
  • Enum ErrorsEnum.TRANSACTION_NOT_APPROVED disparado pelos providers de cancelamento e captura foi renomeado para ErrorsEnum.INVALID_TRANSACTION_STATUS.
  • Método isMerchantReceipt() , setMerchantReceipt(boolean) do SendEmailTransactionProvider removidos. Use setReceiptType(ReceiptType).
  • Construtor SendEmailTransactionProvider(Context, UserModel, TransactionObject) depreciado. Use SendEmailTransactionProvider(Context, TransactionObject)
  • TRANSACTION_WAITING_REMOVE renomeado para TRANSACTION_REMOVE_CARD no mum Action
  • AMERICAN_EXPRESS renomeado para AMEX no enum CardBrandEnum.
  • Classe EmailClient removida.
  • Atributo userModelSale de TransactionObject foi renomeado para saleAffiliationKey.
  • Atributo merchantSak de UserModel foi renomeado para saleAffiliationKey.
  • Classe Contact foi movida.
  • Na classe TransactionProvider :
  • Novo construtor TransactionProvider(Context, TransactionObject, UserModel, PinpadObject)
  • Método getAuthorizationCode() removido. A informação já retornada no TransactionObject
  • Método getGcrRequestCommand() removido.
  • Método removido getStatusAsString , você pode fazer o parse à sua maneiro do TransactionStatus que fica no TransactionObject.
  • Método writePinpadDisplay removido. Use o provider DisplayMessageProvider

Melhorias

  • Melhorias no layout do email do comprovante.

Correções

  • Correção do bug onde o status TRANSACTION_WAITING_PASSWORD era chamado antes do pinpad estar pronto para receber a senha.
  • Correção do bug onde a carga de tabela falhava no dispositivo Gertec Mobi Pin 10.
  • Correção do bug onde o SDK retornava um erro ao tentar transacionar com cartões
    provisórios de tarja.

v2.6.0 (01/11/2018)

  • Adição de campos na classe StoneTransaction para acrescentar as informações para sub.

  • stoneTransaction.setSubMerchantCity("city") //Cidade do sub-merchant

  • stoneTransaction.setSubMerchantPostalAddress("00000000") //CEP do sub-merchant (Apenas * números)
  • stoneTransaction.setSubMerchantRegisteredIdentifier("00000000") // Identificador do sub-merchant
  • stoneTransaction.setSubMerchantTaxIdentificationNumber("33368443000199") // CNPJ do sub-merchant (apenas números)

v2.5.9 (03/04/2018)

  • Agora não é mais necessário usar o LoadTablesProvider para efetuar a carga de tabelas no Pinpad, todo o gerenciamento será feito internamente pela SDK.
  • Enum TABLES_NOT_FOUND foi depreciado por não ser mais disparado.
  • Enum NEED_LOAD_TABLES foi depreciado por não ser mais disparado.
  • Provider DownloadTablesProvider removido por não ter mais utilidade.
  • Corrigido bug onde o enum PINPAD_ALREADY_CONNECTED não era chamado ao conectar com um pinpad já conectado.
  • Corrigido bug no BluetoothConnectionProvider que causava crash no app se ocorresse um erro desconhecido.
  • Melhoria na detecção das bandeiras.
  • Corrigido problema na migration do banco de pinpads quando atualizado de versões muito antigas da SDK.
  • Essa versão corrige o problema de atualização da mobox/sweda.

v2.5.8

  • Timeout das requests http aumentado para 1 minuto
  • Corrigido bug da SDK deixar 2 ou mais stone codes iguais ficarem ativos no ActiveApplicationProvider
  • Adicionado stacktrace das exceptions no BluetoothConnectionProvider

v2.5.7

  • Provider CancellationProvider agora retorna o actionCode do cancelamento pelo método cancellationProvider.getActionCode() e o status do cancelamento pelo cancellationProvider.getResponseCodeEnum().
  • Métodos getTransactionStatus() e getStatusAsString() do CancellationProvider foram removidos em prol dos novos métodos citados acima.
  • Corrigido bug onde a mensagem de "Transação Aprovada" não aparecia no pinpad em algumas transações
  • Novo método activate(String stoneCode) para ativar e adicionar um novo stone code na lista de stone codes ativos.
  • Novo método deactivate(String stoneCode) para desativar somente um stone code da lista de ativos
  • Corrigido bug onde versões anteriores da SDK recebiam NPE em pinpads já salvos sem o campo novo acqidx do PinpadObject.

v2.5.6

Nova dependência OkHttp para substituir o HttpUrlConnection nas requests da SDK para nossos servidores;
Forçando TLS >= 1.2 em todas as requests da SDK;
Novo Provider CaptureTransactionProvider para capturar transações cuja requisição foi feita com captura posterior (setando stoneTransaction.capture = false);
Correção na efetuação de transações da bandeira SODEXO;
Melhoria na captura do CVM do pinpad, forçando o retorno;
Gerenciando o uso da chave Elavon/Stone internamente. Não é mais necessário setar Stone.setAcquirer(Acquirer acquirer). Se o Pinpad não tiver nenhuma das duas chaves, a SDK retornará o erro ErrorsEnum.PINPAD_WITHOUT_KEY durante a conexão do pinpad no BluetoothConnectionProvider;
Novo ambiente INTERNAL_CERTIFICATION para validação do app pelo time de integrações da Stone;

v2.5.5

  • Adicionado campo subMerchantAddress no TransactionObject para editar o endereço do lojista que está efetuando a transação;
    *Adicionado campo subMerchantCategoryCode no TransactionObject para editar o mcc do lojista que está efetuando a transação;
  • Adicionado campo shortName no TransactionObject para armazenar em banco opção setada no campo shortName do StoneTransaction;
  • Adicionado campo capture no TransactionObject para armazenar em banco opção setada no campo capture do StoneTransaction;
  • Construtor CancellationProvider(Context context, int idFromTransactionInBase, UserModel userModel) depreciado. Em vez dele, use CancellationProvider(Context context, TransactionObject transaction)
  • Correção no migration da tabela de Transaction onde algumas colunas não estavam sendo inseridas quando atualizadas de versões muito antigas da SDK;

  • Novos Enums de erro:
    /** SWIPE_INCORRECT, TOO_MANY_CARDS, UNKNOWN_ERROR, INTERNAL_ERROR, // Erros de impressão do POS PRINTER_PRINT_ERROR, PRINTER_BUSY_ERROR, PRINTER_INIT_ERROR, PRINTER_LOW_ENERGY_ERROR, PRINTER_OUT_OF_PAPER_ERROR, PRINTER_UNSUPPORTED_FORMAT_ERROR, // PED ERROR PED_PASS_KEY_ERROR, PED_PASS_USER_CANCELED_ERROR, PED_PASS_NO_PIN_INPUT_ERROR, PED_PASS_TIMEOUT_ERROR, // TRANS ERROR TRANS_APP_BLOCKED_ERROR, TRANS_SELECT_TYPE_USER_CANCELED_ERROR, TRANS_INVALID_AMOUNT_ERROR, TRANS_PASS_MAG_BUT_IS_ICC_ERROR, TRANS_NO_TRANS_TYPE_ERROR, TRANS_WRONG_TRANS_TYPE_ERROR, // CARD ERROR CARD_ERROR, CARD_READ_ERROR, CARD_READ_TIMEOUT_ERROR, CARD_READ_CANCELED_ERROR, CARD_REMOVED_ERROR, CARD_UNSUPPORTED_ERROR, TRANSACTION_OBJECT_NULL_ERROR,

  • android gradle build tools atualizado para 3.0.1

v2.5.4-1

  • Corrigido bug onde a transação era efetuada mas não era salva no banco.

v2.5.4

  • Correção na leitura de informações de cartões ELO.
  • Enum GENERIC_ERROR utilizado pelo ActiveApplicationProvider para quando o stone code não é reconhecido foi alterado para INVALID_STONE_CODE_OR_UNKNOWN.
  • Melhoria na estrutura interna e na performance do TransactionProvider.
  • Correção no envio do comprovante por email, colocando campo "assinatura" quando não era necessário.
  • Corrigido bug onde eventualmente o método getListOfErrors() retornava null

v2.5.3

  • Corrigido bug quando o BluetoothConnectionProvider disparava o evento onSuccess duplicado.
  • Corrigido bug da SDK baixando tabelas toda vez que abria o app.
  • Support Library atualizado para 27.0.2.

v2.5.2

  • Adicionado campo cancellationDate no TransactionObject para armazenar a data do cancelamento;
  • Adicionado campo lastConnectionAt no PinpadObject para armazenar a data da última vez que houve conexão com o pinpad;
  • Todos os erros durante a conexão com o device bluetooth que retornavam em dialog. Agora os erros são adicionados no array de erros do provider. Segue exemplo de uso:
BluetoothConnectionProvider.setConnectionCallback(new StoneCallbackInterface() {

    public void onSuccess() {
        //handle success
    }

    public void onError() {
        List<ErrorsEnum> listOfErrors = bluetoothConnectionProvider.getListOfErrors();
        if (listOfErrors.contains(ErrorsEnum.PINPAD_ALREADY_CONNECTED)) {
            //Do something
        } else if (listOfErrors.contains(ErrorsEnum.TIME_OUT)) {
            //Do something
        } else if (listOfErrors.contains(ErrorsEnum.DEVICE_NOT_COMPATIBLE)) {
            //Do something
        } else if (listOfErrors.contains(ErrorsEnum.IO_ERROR_WITH_PINPAD)) {
            //Do something
        } else if (listOfErrors.contains(ErrorsEnum.SDK_VERSION_IS_OUTDATED)) {
            //Do something
        }

    }
});
  • O método Stone.getPinpadListSize() não mais retorna null quando a lista de pinpads estiver vazia
  • Refatorado o gerenciamento das versões das tabelas, corrigindo o problema de carregar tabelas a cada transação;
  • Construtores LoadTablesProvider(Context, GcrRequestCommand, PinpadObject) e LoadTablesProvider(Context, String, PinpadObject) depreciados. Use LoadTablesProvider(Context context, PinpadObject) em vez disso;

v2.5.1

  • SendEmailProvider depreciado em prol do uso do SendEmailTransactionProvider
  • Adicionado flag merchantReceipt (default false) pra informar se é pra enviar a via do cliente ou do estabelecimento no SendEmailTransactionProvider
  • Método setEmailToSent e setEmailsToSent da classe SendEmailTransactionProvider depreciado, usar addTo()/setTo() para setar o destinatário do email
  • Possibilidade de definir o remetente do email no SendEmailTransactionProvider no método setFrom
  • Adicionado campo balance no TransactionObject pra transações voucher (SODEXO, Ticket, etc...)
  • Bug de cartões (principalmente HIPER) retornando UNKNOWN fixed
  • Novos métodos (findTransactionWithAuthorizationCode(), findTransactionWithInitiatorTransactionKey() e findTransactionByFilter() ) no TransactionDAO para busca das transações no banco local da SDK.

v2.5.0

  • Permissões android.permission.VIBRATE e android.permission.ACCESS_WIFI_STATE removidas da SDK
  • Novos campos cvm e serviceCode no TransactionObject
  • appcompat-v7 atualizado para 26.1.0
  • Enum de feedback CARD_REMOVE deprecated por não ser uma mensagem alterável.
  • Enum de feedback REVERSAL deprecated pois não mandamos nenhuma mensagem para o pinpad
  • Revertendo transações quando negado pelo cartão
  • Bug de mostrar mensagem RETIRE O CARTÃO em cartões mágnéticos fixed
  • gson atualizado de 2.8.1 para 2.8.2
  • Várias melhorias de performance

v2.4.8

  • Adicionando REVERSING_TRANSACTION_WITH_ERROR ao enum Action
  • Revertendo transações automaticamente, quando ocorrer um erro

As transações que não foram processadas por um erro de conexão devem ter canceladas utilizando o ReversalProvider

v2.4.7

  • Adicionando o status WITH_ERROR para transações com erro e que precisam ser canceladas (ex: timeout)
  • Adicionando o ReversalProvider para varrer o banco de transações e cancelar as transações com o status WITH_ERROR
  • Correção no cancelamento de transações
ReversalProvider reversalProvider = new ReversalProvider(this);
reversalProvider.setDialogMessage("Cancelando transação com erro");
reversalProvider.isDefaultUI();
reversalProvider.setConnectionCallback(new StoneCallbackInterface() {
      @Override
      public void onSuccess() {
        // code code code
      }

      @Override
      public void onError() {
        // code code code
      }
});

v2.4.6

  • Downgrade da targetSdkVersion de 26 para 25 devido a problemas de compatibilidade com APIs antigas
  • URL de ativação do ambiente CERTIFICATION alterada
  • Corrigido bug ao executar a migration de versões anteriores à 2.3.0
  • Downgrade da XStream para 1.4.7 devido a problemas com Java8 nas versões mais novas
  • Remoção da permissão READ_PHONE_STATE da SDK!

v2.4.5

Localização do BluetoothConnectionProvider corrigida.

v2.4.4

  • Melhoria e update das dependências
  • Personalização das mensagens exibidas no Pinpad. No TransactionProvider, dois novos métodos foram implementados
  • Novos Métodos:
setPinpadFeedbackMessage(PinpadFeedback key, String message) para customizar uma mensagem específica
setPinpadFeedbackMessages(Map<PinpadFeedback, String> pinpadFeedbackMessages) para personalizar todas as mensagens de uma vez
Mensagens disponíveis para personalização e suas mensagens default (em comentário):

PinpadFeedback.DENIED //"TRANSAC NEGADA"
PinpadFeedback.PROCESSING //"PROCESSANDO.."
PinpadFeedback.APPROVED //"TRANSAC APROVADA"
PinpadFeedback.CARD_REMOVE //"RETIRE O CARTAO"
PinpadFeedback.CARD_WITH_PROBLEMS //"ICC COM PROBLEMAS"
PinpadFeedback.DENIED_BY_NET //"TRANSAC NEGADA PELA REDE"
PinpadFeedback.CARD_INVALIDATED //"CARTAO ESTA INVALIDADO"
PinpadFeedback.DENIED_BY_CARD //"TRANSAC NEGADA PELO CARTAO"

v2.4.2

  • Melhorias de perfomance

v2.4.1

  • Adicionando suporte para conexões via cabo (ethernet)

  • Campo signature em caso de necessidade de armazenar a assinatura da transação.

  • Melhorias de perfomance

v2.4.0

  • Agora a SDK está em no artifactory! siga as instruções de instalação no readme.

  • Possibilidade de escolher o uso de Pinpads Elavon (que não possuem chaves Stone)

  • Todos os Providers recebem Context em vez de Activity no construtor

  • Nova interface StoneActionCallback com um método void onStatusChanged(Action action) para receber eventos adicionais do provider. Esta interface herda de StoneCallbackInterface, então seu uso é opcional. Por enquanto existem somente eventos para transação, mas em breve terá eventos para outros providers.

Eventos disponíveis:

  • TRANSACTION_WAITING_CARD Esperando cartão ser inserido/passado

  • TRANSACTION_WAITING_PASSWORD Esperando senha do cartão (se houver)

  • TRANSACTION_SENDING Enviando transação para o servidor

  • TRANSACTION_WAITING_REMOVE Esperando a remoção do cartão do pinpad (se for chip)

v2.3.2

  • Agora você pode desativar a SDK usando deactivate() em ActiveApplicationProvider

  • Método execute() do ActiveApplicationProvider descontinuado. Em vez disso, use o método activate(List<String> stoneCodes)

  • Corrigido bug em LoadTablesProvider no qual pedia um objeto desnecessário no construtor.

  • Novo campo entryMode no model da transação informando se a transação foi efetuada com chip ou tarja.

  • Campos e métodos descontinuados.

v2.3.1

  • Corrigido problema na seleção do ambiente de SANDBOX

Para atualizar o projeto para transacionar no ambiente de integração deve-se fazer os seguintes passos:

  • Baixar o arquivo sdk_stone_2.3.1.aar no nosso repositório do GitHub

  • Após baixado o arquivo deve ser colocado na pasta "SEU_PROJETO"\app\libs

  • Com seu projeto aberto acrescente o código abaixo:

No build.grandle (Project):

allprojects {
    repositories {
        jcenter()
        flatDir {
            dirs 'libs'
        }
    }
}

No build.grandle (Module:App):

dependencies {
    compile name: 'sdk_stone_2.3.1', ext: 'aar'
}

É recomendado utilizar o comando Clean Project e Rebuild Project antes dos testes caso esteja utilizando a IDE Android Studio.

v2.3.0

  • Nova forma de instalação da lib, utilizando aar, em breve teremos um repositório para distribuir nossas bibliotecas!
  • Agora você pode definir qual ambiente você quer usar em runtime, usando:
// para integração
Stone.setEnvironment(Environment.SANDBOX)

// produção
Stone.setEnvironment(Environment.PRODUCTION)
  • Stone.developerMode() deprecated em prol do novo modo de escolha de ambiente mencionado acima.
  • Suporte para novas bandeiras: Elo, Alelo. (Verifique disponibilidade da bandeira no seu stone code com o time de integrações)
  • Correções no envio de algumas transações para stone.
  • Bug ao desconectar o pinpad fixed.

v2.2.10

  • Hot fix do endpoint do TMS.
  • Correções de erro na ativação e download das tabelas AID e CAPK.

v2.2.9

  • Correção do ambiente de homologação.

v2.2.8

  • Suportando a bandeira Ticket.

v2.2.7

  • Correções do erro ClassNotFoundExceptionem algumas classes da SDK.

v2.2.6

  • Opção de enviar uma transação não capturada:
StoneTransaction stoneTransaction = new StoneTransaction();
// set dos valores da transação
stoneTransaction.disableCapture(); // desabilita a captura da transação

Default

Por padrão, a transação é capturada!

v2.2.5

  • Transações com tarja sem senha e com senha.
  • Correções nas conexões com a internet.
Suggest Edits

Formulário Parceiro Stone

 

Evolua ao nosso lado!

Ficamos muito felizes com o seu interesse em se tornar um parceiro Stone :D

Para fins de organização dos nossos parceiros, precisamos que você me responda algumas perguntinhas bem rápidas, tudo bem?

Com essas informações, vamos buscar lhe encaminhar a melhor solução possível.