Documentação para Integração SDK A910/920
PayStore Android
Documentação da Integração Android da PayStore
Uma das formas de se integrar com a aplicação de pagamentos da Cielo é via IPC. Para isto, é fornecida uma biblioteca, a payments-api-x.x.x.x.aar, contendo todo o código necessário a ser usado para tais chamadas.
Usando esta API, é possível realizar todo o fluxo de pagamento, ou seja, a confirmação (ou o desfazimento) e o estorno. O pagamento pode ser realizado com um valor pré-definido ou com um valor em aberto, a ser digitado pelo operador do terminal. Além disso, pode-se informar uma lista de tipos de pagamentos (débito, crédito à vista, crédito parcelado, etc.) permitidos.
Ainda que esta integração se dê através de uma API, a aplicação de pagamentos da Cielo pode exibir informações na interface do terminal, tais como mensagens (e.g., “Insira ou passe o cartão”), ou mesmo solicitar informações do operador (e.g., CVV). Assim sendo, durante a realização de qualquer operação, a aplicação que solicitou a operação não deve interagir com a interface do dispositivo até que a operação seja concluída.
A seguir, temos a especificação detalhada das operações disponíveis.
Para integração com a API de pagamentos, é fornecida a interface PaymentClient presente na biblioteca.
Arquitetura
A Plataforma Android da PayStore é composta por várias aplicações Android com o propósito de prover uma Arquitetura modular que forneça as seguintes capacidades:
● Fácil adição de novos Adquirentes sem comprometer as funcionalidades e certificação dos restantes.
● Fácil customização da identidade visual e funcionalidades básicas de acordo com as necessidades de cada Cliente.
● Controle sobre o uso das funcionalidades de sistema para garantir uma maior segurança dos seus usuários.
● Plataforma de desenvolvimento de aplicações integradas com o sistema de pagamentos.
A figura abaixo ilustra de forma macro a arquitetura da plataforma PayStore em cima dos terminais SmartPOS com sistema operacional Android:
Apks PayStore
A seguir, temos uma visão geral mostrando os principais tipos de aplicações participantes da plataforma bem como a forma como elas interagem entre si. Em diagramas específicos de cada aplicação, poderá ser visto o que exatamente cada aplicação disponibiliza é responsável por fazer.
Payments App (Payments.apk)
Esta aplicação executa como serviço no Android e é a responsável por realizar todas as operações referentes a pagamentos (TEF), seja o pagamento em si, estornos (cancelamentos) ou mesmo consultas a pagamentos já realizados para, por exemplo, a geração de relatórios.
A seguir, temos uma lista com as principais funcionalidades da aplicação:
● Prover interface (API) para outras aplicações executarem operações de pagamento via IPC, Intent e ContentProvider;
● Prover interface gráfica com o usuário para a realização das operações;
● Prover acesso à “calculadora” para a realização de pagamentos;
● Disponibilização de relatórios;
● Interface para seleção de pagamento para realização de estorno;
● Visualização de transações pendentes com possibilidade de resolução manual (confirmação ou desfazimento);
● Re exibição de comprovantes do último pagamento ou de um pagamento selecionado;
● Visualização de informações do Pinpad;
● Visualização de bandeiras disponíveis para pagamento;
● Realização do processo de credenciamento, quando a aplicação é instalada pela primeira vez;
● Acessar o PayStore Server para obter configurações do terminal;
● Enviar ao PayStore Server as informações referentes aos pagamentos efetuados;
● Enviar ao PayStore Server as informações referentes aos pagamentos pendentes;
● Controlar os agendamentos para:
● Envio de informações dos pagamentos para o PayStore Server;
● Execução de processo de resolução de pendência;
● Execução de processo de expurgo de dados.
Módulos de Payments
O módulo payments-app é responsável pela geração da aplicação Payments APP, referenciando dependências e fazendo a montagem dos componentes. Os demais são libs utilizadas pela aplicação ou módulos que agrupam funcionalidades que podem ser usadas em outras aplicações.
payments-api: Lib disponibilizada para terceiros se integrarem com a plataforma para a realização de operações, tais como pagamento (débito/crédito/voucher), estorno, desfazimento, busca de informações de pagamentos realizados, etc.
Acquirer Specific App (.apk)
Esta aplicação executa como serviço no Android e é a responsável por realizar as integrações junto a uma adquirente específica. Assim, para cada adquirente habilitada para um terminal, deverá haver uma aplicação deste tipo executando.
A seguir, temos uma lista com as principais funcionalidades da aplicação:
● Prover interface via IPC para aplicativo de pagamento (Payments App) para as transações com a adquirente;
● Armazenar informações referentes aos pagamentos;
● Prover interface via ContentProvider para acesso às informações dos pagamentos.
Módulos de Acquirer
Platform App (platform.apk)
Esta é a aplicação principal da plataforma, uma vez que é a responsável por gerenciar o dispositivo (telefone) e exibir as principais telas de interação com o usuário (operador).
Este aplicativo só estará presente em terminais que sejam de propriedade da rede de captura, ou seja, terminais utilizados exclusivamente para serem meios de pagamento.
A seguir, temos uma lista com as principais funcionalidades da aplicação:
● Ser launcher do dispositivo, exibindo tela com aplicações instaladas;
● Gerenciamento de economia de energia do terminal, ativando e desativando dispositivos, como WiFi e Bluetooth quando o terminal estiver em modo ocioso;
● Implementação de barra de tarefas própria;
● Tela para visualização de notificações do terminal;
● Gerenciamento de meio de comunicação (automático ou manual), ativando/desativando WiFi e comunicação por operadora (GPRS, 3G, 4G, etc.);
● Manutenção de operadores do terminal;
● Interface para visualização de informações gerais do terminal;
Módulos do Plataform
Paystore Client App (paystore-client.apk)
Esta é a aplicação responsável pelo gerenciamento das instalações e atualizações de todas as aplicações da plataforma e de terceiros.
Este aplicativo só estará presente em terminais que sejam de propriedade da rede de captura, ou seja, terminais utilizados exclusivamente para serem meios de pagamento.
A seguir, temos uma lista com as principais funcionalidades da aplicação:
● Listar aplicativos disponíveis na PayStore para instalação;
● Listar aplicativos instalados no terminal;
● Gerenciar atualizações das aplicações, conforme informações da PayStore.
Módulos do PayStore Client
Esta aplicação possui um único módulo, ou seja, o paystore-client-app que contém todo o código dessa aplicação.
Acquirer Receipt Provider App (.apk)
Esta é a aplicação responsável pelo gerenciamento das impressões dos comprovantes de pagamento. Assim, para cada adquirente habilitada para um terminal, deverá haver uma aplicação deste tipo executando.
Cada adquirente tem o seu layout de impressão, esse aplicativo recebe a solicitação de impressão de uma determinada adquirente e realiza a impressão do comprovante com layout específico daquela adquirente.
A seguir, temos uma lista com as principais funcionalidades da aplicação:
● Gerenciar o layout do comprovante de cada adquirente;
● Gerenciar a impressão da via do Cliente;
● Gerenciar a reimpressão do comprovante.
Terminais Homologados
Modelo | Sistema Operacional | Fabricante |
---|---|---|
A920/A910 | PayDroid based on Android 5.1 | PAX |
Publicar Aplicativo
Para publicar um aplicativo, é necessário logar no Portal da PayStore como desenvolvedor. Para exemplificar usaremos o ambiente de desenvolvimento. Após realizar o login, acesse o menu Aplicativos -> Rascunhos.
Nova versão
Se for a primeira vez que o aplicativo é publicado, clique no botão Novo Aplicativo. Após isso, será exibida uma tela, conforme mostrado abaixo:
Forneça as informações sobre o aplicativo. Ao preencher as palavras chaves, pressione Enter ao final, e clique em Salvar rascunho. Se tudo estiver certo, clique em Publicar Aplicação.
Será exibida uma tela para selecionar qual Facilitador deverá aprovar sua aplicação. Observe que, a cada nova etapa do fluxo de publicação da aplicação, será necessária uma aprovação do Facilitador indicado. A cada mudança de etapa, o desenvolvedor será notificado por email
Para o Facilitador, o aplicativo estará no menu Aplicativos -> Candidatos. O Facilitador deve aprovar ou reprovar o aplicativo. Em caso de aprovação, o aplicativo segue para a etapa de Homologação.
Uma vez homologado, o aplicativo estará apto para ser publicado. Dessa forma, estará disponível para ser baixado pela rede de terminais do Facilitador. Para publicar a aplicação, selecione-a e clique no botão Publicar.
Após publicar a aplicação, será exibida uma tela com os filtros de publicação. São esses filtros que vão definir que terminais irão receber a sua aplicação. Veja imagem abaixo:
Parabéns, sua aplicação está publicada!
Atualizar Versão
Se você possui uma aplicação já publicada e deseja atualizar sua versão, siga as etapas abaixo:
1 - No projeto de sua aplicação, abra o arquivo build.gradle (Modulo App). Em defaultConfig, incremente o VersionCode e o versionName, dessa forma sua aplicação será aceita pelo Portal para substituir a versão já publicada.
2 - Gere o apk da nova versão. Acesse o Portal da PayStore como descrito em Plubicar Aplicativo
3 - Selecione a opção Nova versão do aplicativo, conforme imagem abaixo:
4 - Faça o upload do novo apk que se deseja publicar e clique em Publicar Aplicativo
Os próximos passos são semelhantes ao de publicar uma nova aplicação.
Parabéns, sua versão foi atualizada!
Temas
Customização de Temas
Através do Portal da PayStore, é possível customizar o tema da aplicação de Pagamento, contudo isso também é possível via programação.
Métodos
Assinatura | Descrição |
---|---|
void setTheme(String theme, PaymentCallback paymentCallback) | Define um tema para a aplicação de pagamentos. |
setTheme() Este método deve ser chamado para definir um tema com padrões de cores para as telas de captura na aplicação de Pagamentos.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
theme | String | Sim | Nome do tema que será definido (case-sensitive). |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros:
theme
Callback
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | Método para notificação em caso de sucesso | ||
onError | Método para notificação em caso de erro. | ||
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa do erro. |
Exemplo
public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute() {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials("demo-app", "TOKEN-KEY-DEMO"));
appInfo.setSoftwareVersion("1.0.0.0");
try {
paymentClient.setTheme("GreyTheme", this);
} catch (ClientException e) {
Log.e(TAG, "Error setting theme", e);
}
}
@Override
public void onError(Object data) {
Log.e(TAG, "Error: " + ((ErrorData) data).getResponseMessage());
}
@Override
public void onSuccess(Object data) {
Log.i(TAG, "Success!");
}
}
Pré-requisitos
IDE
Android Studio
Recomendamos a utilização do Android Studio
Terminal físico
Chaves (Desenvolvimento/Produção)
Para iniciar o desenvolvimento, é necessário um terminal físico com chaves válidas de desenvolvimento ou produção. As chaves utilizadas devem ser de DEV, se o objetivo for o desenvolvimento de aplicativos. As chaves utilizadas devem ser de PROD, se o objetivo for capturar transações com as aplicações já existentes. As chaves devem ser adquiridas junto aos fabricantes dos terminais.
Veja quais terminais estão homologados
Warning: Atualmente não é possível utilizar a integração de pagamento em emuladores Android ou SmartPhones. Essa solução foi desenvolvida para terminais POS (Point Off Service)
Portal da PayStore
Cadastros (Facilitador, Estabelecimento, Terminal)
É necessário acessar o Portal da PayStore ambiente de desenvolvimento para esse primeiro contato e realizar os cadastros necessários para inicializar o terminal pela primeira vez. Nesse processo entre em contato com a equipe de suporte.
APKs PayStore necessários
Sequência de Instalação
Os aplicativos PayStore devem estar instalados no terminal. A instalação deve ser feita na seguinte ordem:
Aplicativos | Descrição |
---|---|
1.payments (Pagamentos) | Operações de pagamento. |
2.platform (Terminal) | Gerenciar terminal |
3.receipt (Comprovante) | Impressão |
4.acquirer (Adquirente) | Integração com as adquirentes |
5.client (Loja) | Loja PayStore |
Para mais informações sobre as aplicações da PayStore, veja Apks PayStore
Com o ADB devidamente instalado e configurado na sua máquina, abra o prompt dentro do diretório com os arquivos, e execute o comando conforme ordem acima:
adb install -r [arquivo]
Se preferir utilize o programa PayDroid
Inicializar o terminal
Inicialização PayStore
Warning: Para continuar é importante que, nesse ponto, seu terminal já esteja inicializado com a PayStore. Caso tenha dúvidas sobre esse procedimento, entre em contato com a equipe de suporte
Tour pela documentação
Ler a documentação
Antes de iniciar de fato, é importante conhecer quais ferramentas estão disponíveis para o desenvolvimento. Por isso deve-se entender a arquitetura, os aplicativos envolvidos e como eles se comunicam. Veja as Referências API e explore todo o poder dessa integração.
App Demo Android
Para facilitar sua integração, criamos um projeto demo desenvolvido em Android já integrado com app Pagamentos. Explore esse projeto para visualizar a integração em ação.
App Demo React-Native
Criamos esse projeto demo para você ter liberdade de escolher qual tecnologia usar no desenvolvimento de sua aplicação. É possível integrar suas aplicações que não foram desenvolvidas, necessariamente em Android com nossas soluções de pagamento.
Iniciar Integração
Parabéns!
Se você chegou até aqui, é porque já possui todas as informações necessárias de para iniciar o desenvolvimento do seu aplicativo integrado à nossa solução de pagamento. Caso tenha dúvidas, entre em contato com a equipe de suporte.
Configurando Projeto
Adicionando lib de Integração ao Projeto
Entre em \app do seu projeto e crie uma pasta chamada libs. Baixe a última versão da lib payments-api-x.x.x.x.aar e copie para a pasta criada no seu projeto.
Após isso, abra o arquivo build.gradle (Module app) e adicione as seguintes dependências em destaque:
implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
implementation 'org.parceler:parceler-api:1.1.12'
annotationProcessor 'org.parceler:parceler:1.1.12'
implementation 'com.google.code.gson:gson:2.8.5'
Pronto! Seu projeto já está configurado e terá acesso às classes disponíveis na lib. Vide Referências API.
Apontamento 3 - esse link aponta pra o fornecedor
Configurando projeto para debug
Se o seu aplicativo está sendo desenvolvido para rodar em terminais POS (Point Of Service), é importante que seu aplicativo seja publicado na Paystore o quanto antes, mesmo que ainda esteja no começo.
Isso é necessário para que o terminal não remova o seu aplicativo automaticamente ao identificar que o app não está presente na loja da Paystore. Por isso não perca tempo e faça a publicação do seu app assim que possível. Veja como é simples aqui, caso necessário entre em contato com nosso suporte.
Telas do Fluxo de Pagamento
Ao realizar a integração do seu app com a aplicação de pagamento da PayStore e invocar o método que inicia o fluxo de pagamento startPaymentV2(), por exemplo, o fluxo da aplicação passa a ser controlado por payments. Neste processo, algumas telas serão apresentadas para o usuário, conforme a seguir:
Tela de captura de valor
Caso o aplicativo que chamou a integração de pagamento não informe o valor, este será solicitado ao usuário. Essa tela também possui uma calculadora integrada para outras operações.
Tela de seleção de tipo de pagamento
Essas opções também podem ser configuradas na integração.
Tela de seleção de operação de crédito
Essas opções também podem ser configuradas na integração.
Tela de solicitação de leitura do cartão
O cliente ou o operador deve inserir ou passar o cartão.
Tela de solicitação de digitação da senha do cartão
Tela de solicitação para retirar o cartão inserido, se for este o caso
Tela de impressão da Via do Cliente
Ao final, o fluxo de pagamento será retornado para a aplicação que o chamou através do
onSuccess() ou onError().
App Demo
repositório: App Demo Android
Aplicativo desenvolvido em Android integrado com a API de Pagamento da PayStore. Através desse aplicativo é possível realizar: Pagamento -> Confirmação ou Desfazimento -> Impressão do comprovante, desfazimento de pagamento ou estorno, Estorno de Pagamento e consultar Pagamento. Seguem algumas observações:
Tela principal com as opções possíveis do App Demo
No menu no canto superior direito, é possível definir a adquirente corrente. Os tipos de pagamento serão definidos de acordo com a adquirente selecionada.
Tela com opções para realizar o pagamento, onde é possível informar as seguintes informações:
● Digitar o valor do pagamento. Caso o valor não seja digitado será solicitado pela integração;
● Digitar número de parcelas (opcional) para pagamentos parcelados;
● Digitar e-mail para criar token do cartão. Isso é usado para pagamentos recorrentes;
● Selecionar os tipos de pagamento. É possível escolher quais opções serão exibidas pelo App de pagamentos.
Após realizar o pagamento através da opção Fazer Pagamento, é necessário fazer a confirmação ou o desfazimento.
A opção Fazer Pagamento de ponta a ponta realiza o fluxo de pagamento completo ou seja pagamento, confirmação e impressão.
Tela de seleção de operação de crédito
E essas opções também podem ser configuradas na integração.
Tela de confirmação e desfazimento do pagamento
Lista o pagamento com o status de pendente para ser confirmado.
Tela de estorno do pagamento
Lista todos os pagamentos confirmados. O usuário deve selecionar o pagamento que deseja estornar.
Tela de desfazimento do estorno
Lista todos os estornos. O usuário deve selecionar o estorno que deseja realizar o desfazimento.
Warning: A depender do comportamento de cada adquirente, é possível que não haja desfazimento para a transação de estorno.
Listar Pagamentos
Realiza uma consulta dos pagamentos de acordo com os filtros escolhidos.
Resolver Pendências
Realiza a confirmação de todos os pagamentos que estão pendentes.
Definir Tema da Aplicação
Define o Tema da aplicação de pagamentos. Dessa maneira, é possível mudar a cor da aplicação. As opções disponíveis são:
Definir Aplicação Principal
Através dessa opção, o Facilitador pode definir o apk desenvolvido por ele como o principal. Dessa forma, quando o terminal for ligado, a aplicação do Facilitador será chamada ao invés da aplicação padrão de pagamento da PayStore.
Referências API
Credenciais para Integração
Para realizar a integração entre aplicativos e a solução de pagamento da PayStore, é necessário adquirir algumas credenciais. As credenciais são geradas ao realizar a publicação do aplicativo no Portal da PayStore, através da opção Aplicativos -> Publicados -> Detalhes da aplicação. Serão exibidos o APLICATION_ID e o SECRET_TOKEN. Estas informações devem ser adicionadas ao aplicativo em desenvolvimento que deseja realizar a integração de pagamento.
Warning |
---|
As credenciais para o ambiente de desenvolvimento são |
public static final String TEST_APPLICATION_ID = “0”; public static final String TEST_SECRET_TOKEN = “000000000000000000000000”; |
A classe CredentialsUtils.java presente no projeto demo mostra uma forma de implementar as credenciais que serão usadas no request do pagamento através da classe PaymentRequestV2.java que está presente na lib de integração payments-api-x.x.x.x.aar. Para mais detalhes, veja o projeto demo.
Pagamento
[DEPRECATED] Integração com Pagamentos V1**
Uma das formas de se integrar com a aplicação de pagamentos da Cielo é via IPC. Para isto, é fornecida uma biblioteca, a payments-api-x.x.x.x.aar, contendo todo o código necessário a ser usada para tais chamadas.
Usando esta API, é possível realizar todo o fluxo de pagamento, ou seja, a confirmação (ou o desfazimento) e o estorno. O pagamento pode ser realizado com um valor pré-definido ou com um valor em aberto, a ser digitado pelo operador do terminal. Além disso, pode-se informar uma lista de tipos de pagamentos (débito, crédito à vista, crédito parcelado, etc.) permitidos.
Ainda que esta integração se dê através de uma API, a aplicação de pagamentos pode exibir informações na interface do terminal, tais como mensagens (e.g., “Insira ou passe o cartão”), ou mesmo solicitar informações do operador (e.g., CVV). Assim sendo, durante a realização de qualquer operação, a aplicação que solicitou a operação não deve interagir com a interface do dispositivo até que a operação seja concluída.
A seguir, temos a especificação detalhada das operações disponíveis.
Para integração com a API de pagamentos, é fornecida a interface PaymentClient.
Warning: O método PaymentClient.Bind(_callback) deve ser chamado, obrigatoriamente, antes de chamar qualquer método da Integração de Pagamento. O bind é assíncrono, ou seja, a próxima linha após o bind() será executada antes de receber a sua resposta, por isso, garanta que, antes de chamar os métodos de integração, o bind esteja conectado.**
Métodos
Aqui está a tabela transformada em Markdown:
markdown Copiar código | Assinatura | Descrição | |—————————————————————————|————————————————————————————————-| | void startPayment(PaymentRequest paymentRequest, PaymentCallback paymentCallback) | Realiza o processo de autorização de pagamento. (DEPRECATED: Utilizar startPaymentV2) | | void confirmPayment(String paymentId, PaymentCallback paymentCallback) | Confirma uma autorização de pagamento realizada anteriormente. | | void cancelPayment(String paymentId, PaymentCallback paymentCallback) | Desfaz uma autorização de pagamento realizada anteriormente. |
startPayment() (DEPRECATED: Utilizar startPaymentV2)
Este método deve ser chamado quando se deseja fazer uma solicitação de autorização de pagamento. Durante sua execução, os dados do pagamento serão validados, informações adicionais serão solicitadas ao operador (e.g. senha e CVV), e a autorização junto à adquirente será feita.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | PaymentRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição do pagamento. Note que nem todos os parâmetros são obrigatórios. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de pagamento. |
Detalhe dos Parâmetros request (PaymentRequest)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
value | BigDecimal | Não | Valor do pagamento solicitado. Caso não seja preenchido (null), a interface solicitará o valor ao operador. |
paymentTypes | List | Não | Tipos de pagamentos (Débito, Crédito, Voucher, etc.) permitidos para este pagamento. Caso seja vazio, ou seja, null, significa que todos os tipos são permitidos. Caso contenha apenas um, este tipo será o utilizado (se possível) e não será perguntado nada ao operador. |
installments | Integer | Não | Quantidade de parcelas. Usado apenas para tipos de pagamentos que suportem parcelamento e neste caso é obrigatório. Valor deve ser entre 2 e 99. |
appTransactionId | String | Sim | Identificador da transação integrada. O Identificador referido é aquele utilizado na aplicação que originou a solicitação de pagamento. Não deve se repetir. |
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String | Sim | Versão da aplicação que está solicitando o pagamento. |
showReceiptView (DEPRECATED) | Boolean | Não | A Solução sempre irá imprimir o comprovante depois que a confirmação for executada. |
callback (PaymentCallback)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | Método para notificação em caso de sucesso. | ||
Payment.value | BigDecimal | Sim | Valor do pagamento. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro, pois há adquirentes que, para algumas situações, aprovam valores diferentes dos solicitados. |
Payment.paymentType | PaymentType | Sim | Tipo de pagamento (Débito, Crédito, Voucher, etc.). |
Payment.installments | Integer | Não | Quantidade de parcelas do pagamento. |
Payment.acquirer | String | Sim | Adquirente que autorizou o pagamento. |
Payment.paymentId | String | Sim | Identificador da transação para a aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento. |
Payment.brand | String | Sim | Bandeira do cartão. |
Payment.bin | String | Sim | BIN do cartão. |
Payment.panLast4Digits | String | Sim | Últimos 4 dígitos do PAN do cartão. |
Payment.captureType | CaptureType | Sim | Forma de captura do cartão. |
Payment.paymentStatus | PaymentStatus | Sim | Situação do pagamento. No caso de solicitações retornadas com sucesso, esta informação sempre será PENDING, requerendo uma confirmação ou desfazimento para a sua conclusão definitiva. |
Payment.paymentDate | Date | Sim | Data/hora do pagamento para a aplicação de pagamentos. |
Payment.acquirerId | String | Sim | Identificador da transação para a adquirente. Este é o identificador que consta no arquivo que a adquirente fornece (EDI). Desta forma, é possível realizar a conciliação do pagamento com a transação integrada. |
Payment.acquirerResponseCode | String | Sim | Código de resposta da adquirente. |
Payment.acquirerResponseDate | String | Sim | Data/hora retornada pela adquirente. |
Payment.acquirerAuthorizationNumber | String | Sim | Número da autorização fornecido pela adquirente (consta no comprovante do Portador do Cartão). |
Payment.Receipt.clientVia | String | Não | Conteúdo do comprovante - via do cliente. |
Payment.Receipt.merchantVia | String | Não | Conteúdo do comprovante - via do estabelecimento. |
onError | Método para notificação em caso de erro. | ||
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta. |
ErrorData.acquirerResponseCode | String | Não | Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente. |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. |
confirmPayment()
Este método deve ser chamado para confirmar uma transação que o terminal conseguiu processar completamente a perna de autorização enviada pelo Autorizador.
Este método não deve ser chamado para uma transação já confirmada, ou seja, em que já se executou o método confirmPayment() anteriormente.
Este método não deve ser chamado para uma transação já desfeita, ou seja, em que já se executou o método cancelPayment() anteriormente.
Este método não deve ser chamado para uma transação que foi negada pelo Autorizador, ou seja, a transação precisa ter sido autorizada pelo Autorizador.
Após a execução desta confirmação, a transação só poderá ser cancelada através de uma operação de estorno. O estorno é a operação executada pelo menu CANCELAMENTO do terminal.
Caso o App consumidor desta API tenha finalizado o seu processo de negócio com êxito, porém não tenha chamado o método confirmPayment(), a transação permanecerá com o seguinte status: Situação PayStore = “Pendente”. Resolução no Adquirente = “Pendente”.
Como resultado, poderemos ter uma inconsistência transacional, visto que, na virada do dia, algumas redes adquirentes confirmam automaticamente as transações que não receberam a perna de confirmação. Outras redes adquirentes trabalham apenas com duas pernas, sem a necessidade de perna de confirmação. Neste caso, se houver algum problema na conclusão da transação no lado do terminal, é imperativo que a solução de captura execute o método cancelPayment(), a fim de desfazer a transação no adquirente e evitar cobrança para o cliente Portador do Cartão.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será confirmada. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | Método para notificação em caso de sucesso. | ||
onError | Método para notificação em caso de erro. | ||
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta. |
ErrorData.acquirerResponseCode | String | Não | Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente. |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. |
cancelPayment()
Este método deve ser sempre chamado para desfazer uma transação que o terminal não conseguiu processar completamente a perna de autorização enviada pelo Autorizador.
Este método não deve ser chamado para uma transação já confirmada, ou seja, em que já se executou o método confirmPayment() anteriormente.
Este método não deve ser chamado para desfazer uma transação já desfeita, ou seja, em que já se executou o método cancelPayment() anteriormente.
Este método não deve ser chamado para uma transação que foi negada pelo Autorizador.
Este método não é um estorno. O estorno é a operação executada pelo menu CANCELAMENTO do terminal. O estorno é executado em transações que foram concluídas com êxito, ou seja, foram confirmadas.
Após a execução do desfazimento, cancelPayment(), a transação não poderá ser mais confirmada pela aplicação do terminal, ou seja, não se pode mais executar o método confirmPayment().
Caso o App consumidor desta API não tenha finalizado o seu processo de negócio com êxito, é imprescindível a chamada do método cancelPayment(). A consequência de não cancelar uma transação que não teve seu processo de negócio concluído é semelhante à consequência de não confirmar. Porém, nesse caso, com um agravante, pois provavelmente o cliente não levará o produto/serviço associado à transação financeira, ou uma nova tentativa de venda poderá ser feita, resultando em uma cobrança em duplicidade para o cliente Portador do Cartão.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será desfeita. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | Método para notificação em caso de sucesso. | ||
onError | Método para notificação em caso de erro. | ||
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta. |
ErrorData.acquirerResponseCode | String | Não | Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente. |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. |
Exemplo do fluxo de Pagamento
package com.example.appmanoel;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.math.BigDecimal;
import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;
import br.com.phoebus.android.payments.api.ErrorData;
import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentRequest;
import br.com.phoebus.android.payments.api.exception.ClientException;
public class MainActivity extends AppCompatActivity implements
View.OnClickListener, PaymentClient.PaymentCallback<Payment> {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = "0";
public static final String TEST_SECRET_TOKEN =
"000000000000000000000000";
public static final String TAG = "TAG_DEMO";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
}
@Override
public void onClick(View view) {
CLASSIFICAÇÃO: PÚBLICA 56 / 236
doExecute();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
PaymentRequest request = new PaymentRequest();
request.setValue(new BigDecimal(50));
request.setAppTransactionId("123456");
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion("1.0");
request.setAppInfo(applicationInfo);
try {
paymentClient.startPayment(request, this);
} catch (ClientException e) {
Log.e(TAG, "Error starting payment", e);
}
}
@Override
public void onSuccess(Payment payment) {
Log.i(TAG, payment.toString());
doConfirmPayment(payment);
/*
Se, na sua regra de negócio, for preciso desfazer a transação por
algum motivo,
chame o método doCancelPayment()
**/
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(this, errorData.getResponseMessage(),
Toast.LENGTH_LONG).show();
}
private void doConfirmPayment(Payment payment) {
try {
paymentClient.confirmPayment(payment.getPaymentId(),
new PaymentClient.PaymentCallback<Payment>() {
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(MainActivity.this,
errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(Payment payment) {
Log.i(TAG, payment.toString());
}
});
} catch (ClientException e) {
Log.e(TAG, "Error confirmPayment", e);
}
}
private void doCancelPayment(Payment payment) {
try {
paymentClient.cancelPayment(payment.getPaymentId(),
new PaymentClient.PaymentCallback<Payment>() {
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(MainActivity.this,
errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(Payment payment) {
Log.i(TAG, payment.toString());
}
});
} catch (ClientException e) {
Log.e(TAG, "Error cancelPayment", e);
}
}
}
Integração com Pagamentos V2
Uma das formas de se integrar com a aplicação de pagamentos da Cielo é via IPC. Para isto, é fornecida uma biblioteca, a payments-api-x.x.x.x.aar, contendo todo o código necessário a ser usado para tais chamadas.
Usando esta API, é possível realizar todo o fluxo de pagamento, ou seja, a confirmação (ou o desfazimento) e o estorno. O pagamento pode ser realizado com um valor pré-definido ou com um valor em aberto, a ser digitado pelo operador do terminal. Além disso, pode-se informar uma lista de tipos de pagamentos (débito, crédito à vista, crédito parcelado, etc.) permitidos.
Ainda que esta integração se dê através de uma API, a aplicação de pagamentos da Cielo pode exibir informações na interface do terminal, tais como mensagens (e.g., “Insira ou passe o cartão”), ou mesmo solicitar informações do operador (e.g., CVV). Assim sendo, durante a realização de qualquer operação, a aplicação que solicitou a operação não deve interagir com a interface do dispositivo até que a operação seja concluída.
A seguir, temos a especificação detalhada das operações disponíveis.
Para integração com a API de pagamentos, é fornecida a interface PaymentClient presente na biblioteca.
Warning: O método PaymentClient.Bind(_callback) deve ser chamado, obrigatoriamente, antes de chamar qualquer método da Integração de Pagamento. O bind é assíncrono, ou seja, a próxima linha após o bind() será executada antes de receber a sua resposta, por isso garanta que, antes de chamar os métodos de integração, o bind esteja conectado.
Fluxo de Pagamento
Passos | Sucesso | Erro |
---|---|---|
1.Solicitação de pagamento | O pagamento foi realizado e seu status é Pendente | O pagamento não foi realizado. A resposta contém informações do erro. |
2.Resposta solicitação de pagamento | A resposta contém informações do pagamento realizado. | A resposta contém informações do erro da solicitação. |
3.Solicitação de confirmação | Confirmação realizada, seu status é Confirmada, não pode ser desfeita. | Confirmação não realizada. A resposta contém informações do erro. |
4.Resposta da confirmação | A resposta contém informações da confirmação realizada. Impressão do Comprovante | A resposta contém informações do erro da solicitação. Nesse ponto pode ser enviado o desfazimento. |
5.Solicitação de desfazimento | Desfazimento realizado, seu status é Desfeita. Não pode ser confirmada. | A resposta contém informações do erro da solicitação. O status continua Pendente. |
6.Resposta do desfazimento | A resposta contém informações do desfazimento realizado. | A resposta contém informações do erro da solicitação. |
O pagamento só é finalizado quando existe uma confirmação ou um cancelamento (desfazimento). Em caso de confirmação, o comprovante estará disponível para impressão ou envio por SMS/e-mail, dependendo das funcionalidades do terminal.
A partir da versão 3.1.4.3
Quando uma transação é feita e o app solicita sua confirmação (confirmPayment()) ou desfazimento (cancelPayment()), a resposta solicitação será enviada ao app assim que a transação for resolvida localmente pelo terminal, eliminando a necessidade de o app esperar a resolução com o autorizador para dar continuidade ao fluxo.
Após isto, o terminal tentará resolver a transação com o autorizador. Isto pode ocorrer imediatamente ao finalizar a transação, ou posteriormente, na resolução de pendências.
Métodos
Assinatura | Descrição |
---|---|
void startPaymentV2(PaymentRequestV2 paymentRequest, PaymentCallback paymentCallback) | Realiza o processo de autorização de pagamento. |
void confirmPayment(String paymentId, PaymentCallback paymentCallback) | Confirma uma autorização de pagamento realizada anteriormente. |
void cancelPayment(String paymentId, PaymentCallback paymentCallback) | Desfaz uma autorização de pagamento realizada anteriormente. |
void getPayment(String paymentId, PaymentCallback paymentCallback) | Realiza consulta dos dados de uma transação diretamente no servidor connecta. |
startPaymentV2()
Este método deve ser chamado quando se deseja fazer uma solicitação de autorização de pagamento. Durante sua execução, os dados do pagamento serão validados, informações adicionais serão solicitadas ao operador (e.g. senha e CVV), e a autorização junto à adquirente será feita.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | PaymentRequestV2 | Sim | Objeto de transferência de dados que conterá as informações da requisição do pagamento. Note que nem todos os parâmetros são obrigatórios. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de pagamento. |
Detalhe dos Parâmetros request (PaymentRequestV2)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
value | BigDecimal | Não | Valor do pagamento solicitado. Caso não seja preenchido (null), a interface solicitará o valor ao operador. O valor deverá ser formatado com duas casas decimais. |
additionalValueType | AdditionalValueType | Não | Tipo de valor adicional (Cashback, TIP, etc.). Se não estiver preenchido (nulo), deve-se ignorar o campo “additionalValue”. Para FastTrack, apenas o valor CASHBACK é permitido. |
additionalValue | BigDecimal | Não | Valor adicionado ao valor da transação. Se “additionalValueType” for relatado e “additionalValue” não foi preenchido (nulo) ou é igual a 0 (zero), a interface irá pedir ao operador o valor adicional. |
paymentTypes | List | Não | Tipos de pagamentos (Débito, Crédito, Voucher, etc.) permitidos para este pagamento. Caso seja vazio, ou seja, null, significa que todos os tipos são permitidos. |
installments | Integer | Não | Quantidade de parcelas. Usado apenas para tipos de pagamentos que suportem parcelamento e neste caso é obrigatório. Valor deve ser entre 2 e 99. |
accountTypeId | String | Não | Tipo de conta. Se não for preenchido (nulo), a interface pode perguntar ao operador o tipo de conta. |
planId | String | Não | Identificação do plano de pagamento. Pode ter um ou dois caracteres, a depender da regra da adquirente selecionada. |
appTransactionId | String | Sim | Identificador da transação integrada para o software. O Identificador referido é aquele utilizado na aplicação que originou a solicitação de pagamento. Não deve se repetir. |
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. |
ApplicationInfo.softwareVersion | String | Sim | Versão da aplicação que está solicitando o pagamento. |
showReceiptView (DEPRECATED) | Boolean | Não | A Solução irá utilizar o valor dos parâmetros printMerchantReceipt e printCustomerReceipt para executar a impressão depois que a confirmação for executada. |
printMerchantReceipt | Boolean | Não | Indica se o comprovante do estabelecimento deve ser impresso ou não depois da confirmação da transação. O valor padrão é true, isto é, o comprovante é impresso. |
printCustomerReceipt | Boolean | Não | Indica se o comprovante do cliente deve ser impresso ou não depois da confirmação da transação. O valor padrão é true, isto é, o comprovante é impresso. |
tokenizeCard | Boolean | Não | Indica se deve ser feita ou não a tokenização do cartão após a aprovação do pagamento. O valor padrão é false, isto é, não será feita a tokenização. |
tokenizeEmail | String | Se tokenizeCard for true, caso contrário, não. | E-mail do portador do cartão. Se “tokenizeCard” for false, este parâmetro é ignorado. |
tokenizeNationalDocument | String | Não | CPF ou CNPJ do portador do cartão. Se “tokenizeCard” for false, este parâmetro é ignorado. |
productShortName | String | Não | Identificação resumida do produto de bandeira do cartão. |
note | String | Não | Texto adicional que é inserido como Nota. (pode ser o número da fatura) |
dni | String | Não | Número do Documento. |
operationMethodAllowed | Integer | Sim | Indica o método de operação de pagamento, anulação e devolução. Admita os seguintes valores: 0 - Apenas com cartão físico (lido ou digitado); 1 - Somente com QRCode. |
allowBenefit (OBSOLETO) | Boolean | Não | Indica se o QRCode deve ser gerado com as opções do produto associadas aos benefícios. O valor padrão é ‘verdadeiro’, ou seja, os benefícios serão adicionados. |
previewMerchantReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do estabelecimento deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
previewCustomerReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do cliente deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
callback (PaymentCallback)
| Nome | Tipo | Obrigatório | Descrição | |—————————————-|———————-|————-|——————————————————————————————————————————————————————————————————————————–| | onSuccess | Método | - | Método para notificação em caso de sucesso. | | Payment.value | BigDecimal | Sim | Valor do pagamento. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro. | | Payment.additionalValueType | AdditionalValueType | Não | Presente apenas quando existe um valor adicional no contexto da transação executada. | | Payment.additionalValue | BigDecimal | Não | Presente apenas quando existe um valor adicional no contexto da transação executada. | | Payment.paymentType | PaymentType | Sim | Tipo de pagamento (Débito, Crédito, Voucher, etc.). | | Payment.installments | Integer | Não | Quantidade de parcelas do pagamento. | | Payment.accountTypeId | String | Não | Presente apenas quando existe um tipo de conta no contexto da transação executada. | | Payment.planId | String | Não | Presente apenas quando existe um plano no contexto da transação executada. | | Payment.productShortName | String | Sim | Corresponde ao productShortName correspondente ao produto principal no contexto da transação. | | Payment.ticketNumber | String | Não | ticketNumber gerado pelo terminal para a transação. | | Payment.batchNumber | String | Sim | Número de lote. | | Payment.nsuTerminal | String | Sim | NSU gerado pelo terminal para a transação. | | Payment.acquirer | String | Sim | Adquirente que autorizou o pagamento. | | Payment.paymentId | String | Sim | Identificador da transação para a aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento. | | Payment.brand | String | Sim | Bandeira do cartão. | | Payment.bin | String | Sim | BIN do cartão. | | Payment.panLast4Digits | String | Sim | Últimos 4 dígitos do PAN do cartão. | | Payment.captureType | CaptureType | Sim | Forma de captura do cartão. | | Payment.paymentStatus | PaymentStatus | Sim | Situação do pagamento. No caso de solicitações retornadas com sucesso, esta informação sempre será PENDING, requerendo uma confirmação ou desfazimento para a sua conclusão definitiva. | | Payment.paymentDate | Date | Sim | Data/hora do pagamento para a aplicação de pagamentos. | | Payment.acquirerId | String | Sim | Identificador da transação para a adquirente. Este é o identificador que consta no arquivo que a adquirente fornece (EDI). Desta forma, é possível realizar a conciliação do pagamento com a transação integrada. | | Payment.acquirerResponseCode | String | Sim | Código de resposta da adquirente. | | Payment.acquirerResponseDate | String | Sim | Data/hora retornada pela adquirente. | | Payment.acquirerAdditionalMessage | String | Não | Mensagem adicional enviada pela adquirente na resposta da transação. | | Payment.acquirerAuthorizationNumber | String | Sim | Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão). | | Payment.Receipt.clientVia | String | Não | Conteúdo do comprovante - via do cliente. | | Payment.Receipt.merchantVia | String | Não | Conteúdo do comprovante - via do estabelecimento. | | Payment.cardToken | String | Não | Token do cartão utilizado na transação. | | Payment.cardholderName | String | Não | Nome do portador do cartão. | | Payment.terminalId | String | Sim | Identificação do terminal. | | Payment.note | String | Sim | Valor adicional que é inserido como Nota. (pode ser o número da fatura) Este campo só virá na resposta caso tenha sido preenchido na requisição do pagamento pela API. | | Payment.dni | String | Sim | Número do Documento. Este campo só virá na resposta caso tenha sido preenchido na requisição do pagamento pela API. | | Payment.qrId | String | Não | Identificador QrCode gerado pelo terminal de captura. | | Payment.originalValue | BigDecimal | Não | Valor original da venda. Presente em pagamentos com QRCode, cujo benefício foi aplicado ao valor da venda. | | Payment.acquirerNsu | String | Não | NSU Adquirente para consulta e identificação de transações. | | onError | Método | - | Método para notificação em caso de erro. | | ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta. | | ErrorData.acquirerResponseCode | String | Não | Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente. | | ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. | | ErrorData.acquirerAdditionalMessage | String | Não | Mensagem adicional enviada pela adquirente na resposta da transação. | —–
confirmPayment()
Este método deve ser chamado para confirmar uma transação que o terminal conseguiu processar completamente a perna de autorização enviada pelo Autorizador.
Este método não deve ser chamado para uma transação já confirmada, ou seja, em que já se executou o método confirmPayment() anteriormente.
Este método não deve ser chamado para uma transação já desfeita, ou seja, em que já se executou o método cancelPayment() anteriormente.
Este método não deve ser chamado para uma transação que foi negada pelo Autorizador, ou seja, a transação precisa ter sido autorizada pelo Autorizador.
Após a execução desta confirmação, a transação só poderá ser cancelada através de uma operação de estorno (o estorno é a operação executada pelo menu CANCELAMENTO do terminal).
Caso o App consumidor desta API tenha finalizado o seu processo de negócio com êxito, porém não tenha chamado o método confirmPayment(), a transação permanecerá com o seguinte status: Situação PayStore = “Pendente”. Resolução no Adquirente = “Pendente”.
Como resultado, poderemos ter uma inconsistência transacional, visto que, na virada do dia, algumas redes adquirentes confirmam automaticamente as transações que não receberam a perna de confirmação. Outras redes adquirentes trabalham apenas com duas pernas, sem a necessidade de perna de confirmação. Neste caso, se houver algum problema na conclusão da transação no lado do terminal, é imperativo que a solução de captura execute o método cancelPayment(), a fim de desfazer a transação no adquirente e evitar cobrança para o cliente Portador do Cartão.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será confirmada. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | Método | - | Método para notificação em caso de sucesso. |
onError | Método | - | Método para notificação em caso de erro. |
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta. |
ErrorData.acquirerResponseCode | String | Não | Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente. |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. |
cancelPayment()
Este método deve ser sempre chamado para desfazer uma transação que o terminal não conseguiu processar completamente a perna de autorização enviada pelo Autorizador.
Este método não deve ser chamado para uma transação já confirmada, ou seja, em que já se executou o método confirmPayment() anteriormente.
Este método não deve ser chamado para desfazer uma transação já desfeita, ou seja, em que já se executou o método cancelPayment() anteriormente
Este método não deve ser chamado para uma transação que foi negada pelo Autorizador.
Este método não é um estorno. O estorno é a operação executada pelo menu CANCELAMENTO do terminal. O estorno é executado em transações que foram concluídas com êxito, ou seja, foram confirmadas.
Após a execução do desfazimento, cancelPayment(), a transação não poderá ser mais confirmada pela aplicação do terminal, ou seja, não se pode mais executar o método confirmPayment().
Caso o App consumidor desta API não tenha finalizado o seu processo de negócio com êxito, é imprescindível a chamada do método cancelPayment(). A consequência de não cancelar uma transação que não teve seu processo de negócio concluído é semelhante à consequência de não confirmar. Porém, nesse caso, com um agravante, pois provavelmente o cliente não levará o produto/serviço associado à transação financeira, ou uma nova tentativa de venda poderá ser feita, resultando em uma cobrança em duplicidade para o cliente Portador do Cartão.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será desfeita. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | Método | - | Método para notificação em caso de sucesso. |
onError | Método | - | Método para notificação em caso de erro. |
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta. |
ErrorData.acquirerResponseCode | String | Não | Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente. |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. |
Campo adicional api_pending
Além dos métodos para resolução de pagamentos (confirmPayment e cancelPayment), há a possibilidade de se configurar um campo adicional no Portal Paystore para realizar esta resolução automaticamente, em determinado tempo. Para isto, deve ser criado um campo adicional no Portal Paystore com o tipo JSON e a chave api_pending.
Valor do campo
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
confirmationTime | String | Sim | Intervalo, em minutos, para resolução das pendências. |
transactionConfirmation | String | Sim | Ação a ser tomada. Permite os valores CONFIRM (Confirma a transação) ou UNDO (Desfaz a transação). |
Exemplo JSON:
{
"confirmationTime": "10",
"transactionConfirmation": "CONFIRM"
}
EXEMPLO DO FLUXO DE PAGAMENTO
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.math.BigDecimal;
import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;
import br.com.phoebus.android.payments.api.ErrorData;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentRequestV2;
import br.com.phoebus.android.payments.api.PaymentV2;
import br.com.phoebus.android.payments.api.exception.ClientException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener,
PaymentClient.PaymentCallback<PaymentV2> {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = "0";
public static final String TEST_SECRET_TOKEN = "000000000000000000000000";
public static final String TAG = "TAG_DEMO";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
}
@Override
public void onClick(View view) {
doExecute();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
PaymentRequestV2 request = new PaymentRequestV2();
BigDecimal value = BigDecimal.valueOf(5000).movePointLeft(2);
request.setValue(value);
request.setAppTransactionId("123456");
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion("1.0");
request.setAppInfo(applicationInfo);
try {
paymentClient.startPaymentV2(request, this);
} catch (ClientException e) {
Log.e(TAG, "Error starting payment", e);
}
}
@Override
public void onSuccess(PaymentV2 paymentV2) {
Log.i(TAG, paymentV2.toString());
doConfirmPayment(paymentV2);
/*
Se, na sua regra de negócio, for preciso desfazer a transação por algum motivo,
chame o método doCancelPayment(paymentV2)
**/
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
private void doConfirmPayment(PaymentV2 paymentV2) {
try {
paymentClient.confirmPayment(paymentV2.getPaymentId(),
new PaymentClient.PaymentCallback<PaymentV2>() {
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(MainActivity.this, errorData.getResponseMessage(),
Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(PaymentV2 payment) {
Log.i(TAG, payment.toString());
}
});
} catch (ClientException e) {
Log.e(TAG, "Error confirmPayment", e);
}
}
private void doCancelPayment(PaymentV2 paymentV2) {
try {
paymentClient.cancelPayment(paymentV2.getPaymentId(),
new PaymentClient.PaymentCallback<PaymentV2>() {
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(MainActivity.this, errorData.getResponseMessage(),
Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(PaymentV2 payment) {
Log.i(TAG, payment.toString());
}
});
} catch (ClientException e) {
Log.e(TAG, "Error cancelPayment", e);
CLASSIFICAÇÃO: PÚBLICA 80 / 236
}
}
}
getPayment()
Este método é usado para obter as informações de uma transação. Durante sua execução, os dados serão solicitados via API do connecta, sendo obrigatório a conexão com a internet.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será localizada. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | Método | Sim | Método para notificação em caso de sucesso. |
onError | Método | Sim | Método para notificação em caso de erro. |
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta. |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não localizado. |
Exemplo de chamada de
private fun doGetPayment(payment: Payment, callback: (Boolean) -> Unit) {
try {
paymentClient.getPayment(payment.paymentId, object : PaymentCallback<Any?> {
override fun onSuccess(data: Any?) {
val toast: Toast = Toast.makeText(
this@MainActivity,
"Dados retornardo com sucesso",
Toast.LENGTH_SHORT
)
toast.show()
callback(true)
}
override fun onError(errorData: ErrorData) {
val toast: Toast = Toast.makeText(
this@MainActivity,
R.string.payment_not_get,
Toast.LENGTH_SHORT
)
toast.show()
callback(true)
}
})
} catch (e: Exception) {
Toast.makeText(
this@MainActivity,
e.message,
Toast.LENGTH_LONG
).show()
callback(true)
}
}
Exemplo do retorno de dados getPayment()
{
"MerchantOrderId": "20180204",
"Customer": {
"Name": "[Guest]"
},
"Payment": {
"Installments": 1,
"Interest": "ByMerchant",
"CreditCard": {
"ExpirationDate": "12/2020",
"BrandId": 1,
"IssuerId": 2,
"TruncateCardNumberWhenPrinting": true,
"InputMode": "Emv",
"AuthenticationMethod": "OnlineAuthentication",
"EmvData": "112233445566778899011AABBC012D3456789E0123FF45678AB901234C5D112233445566778800",
"PinBlock": {
"EncryptedPinBlock": "2280F6BDFD0C038D",
"EncryptionType": "Dukpt3Des",
"KsnIdentification": "1231vg31fv231313123"
}
},
"PaymentDateTime": "2019-04-15T12:00:00Z",
"ServiceTaxAmount": 0,
"SoftDescriptor": "Description",
"ProductId": 1,
"PinPadInformation": {
"TerminalId": "10000001",
"SerialNumber": "ABC123",
"PhysicalCharacteristics": "PinPadWithChipReaderWithSamModule",
"ReturnDataInfo": "00"
},
"Amount": 15798,
"ReceivedDate": "2019-04-15T12:00:00Z",
"CapturedAmount": 15798,
"Provider": "Cielo",
"ConfirmationStatus": 0,
"InitializationVersion": 1558708320029,
"EmvResponseData": "123456789ABCD1345DEA",
"Status": 2,
"IsSplitted": false,
"ReturnCode": 0,
"ReturnMessage": "Successful",
CLASSIFICAÇÃO: PÚBLICA 83 / 236
"PaymentId": "f15889ea-5719-4e1a-a2da-f4e50d5bd702",
"Type": "PhysicalDebitCard",
"Currency": "BRL",
"Country": "BRA",
"Links": [
{
"Method": "GET",
"Rel": "self",
"Href": "<https://api.cieloecommerce.cielo.com.br/1/physicalSales/f15889ea-5719-4e1a-a2daf4e50d5bd702>"
},
{
"Method": "DELETE",
"Rel": "self",
"Href": "<https://api.cieloecommerce.cielo.com.br/1/physicalSales/f15889ea-5719-4e1a-a2daf4e50d5bd702>"
},
{
"Method": "PUT",
"Rel": "self",
"Href": "<https://api.cieloecommerce.cielo.com.br/1/physicalSales/f15889ea-5719-4e1a-a2daf4e50d5bd702/confirmation>"
}
],
"PrintMessage": [
{
"Position": "Top",
"Message": "Transação autorizada"
},
{
"Position": "Bottom",
"Message": "Obrigado e volte sempre!"
}
],
"ReceiptInformation": [
{
"Field": "MERCHANT_NAME",
"Label": "NOME DO ESTABELECIMENTO",
"Content": "Estabelecimento"
},
{
"Field": "MERCHANT_ADDRESS",
"Label": "ENDEREÇO DO ESTABELECIMENTO",
"Content": "Rua Sem Saida, 0"
},
{
"Field": "MERCHANT_CITY",
"Label": "CIDADE DO ESTABELECIMENTO",
"Content": "Cidade"
},
{
"Field": "MERCHANT_STATE",
"Label": "ESTADO DO ESTABELECIMENTO",
"Content": "WA"
},
{
"Field": "MERCHANT_CODE",
"Label": "COD.ESTAB.",
"Content": 1234567890123456
},
{
"Field": "TERMINAL",
"Label": "POS",
"Content": 12345678
},
{
"Field": "NSU",
CLASSIFICAÇÃO: PÚBLICA 85 / 236
"Label": "DOC",
"Content": 123456
},
{
"Field": "DATE",
"Label": "DATA",
"Content": "01/01/20"
},
{
"Field": "HOUR",
"Label": "HORA",
"Content": "01:01"
},
{
"Field": "ISSUER_NAME",
"Label": "EMISSOR",
"Content": "NOME DO EMISSOR"
},
{
"Field": "CARD_NUMBER",
"Label": "CARTÃO",
"Content": 5432123454321234
},
{
"Field": "TRANSACTION_TYPE",
"Label": "TIPO DE TRANSAÇÃO",
"Content": "VENDA A CREDITO"
},
{
"Field": "AUTHORIZATION_CODE",
"Label": "AUTORIZAÇÃO",
"Content": 123456
},
{
"Field": "TRANSACTION_MODE",
"Label": "MODO DA TRANSAÇÃO",
"Content": "ONL"
},
{
"Field": "INPUT_METHOD",
"Label": "MODO DE ENTRADA",
"Content": "X"
},
{
"Field": "VALUE",
"Label": "VALOR",
"Content": "1,23"
},
{
"Field": "SOFT_DESCRIPTOR",
"Label": "SOFT DESCRIPTOR",
"Content": "Simulado"
}
],
"Receipt": {
"MerchantName": "Estabelecimento",
"MerchantAddress": "Rua Sem Saida, 0",
"MerchantCity": "Cidade",
"MerchantState": "WA",
"MerchantCode": 1234567890123456,
"Terminal": 12345678,
"Nsu": 123456,
"Date": "01/01/20",
"Hour": "01:01",
"IssuerName": "NOME DO EMISSOR",
"CardNumber": 5432123454321234,
"TransactionType": "VENDA A CREDITO",
"AuthorizationCode": 123456,
"TransactionMode": "ONL",
CLASSIFICAÇÃO: PÚBLICA 87 / 236
"InputMethod": "X",
"Value": "1,23",
"SoftDescriptor": "Simulado"
}
}
}
getPaymentByMerchantOrderId()
Este método é usado para obter as informações de uma transação. Durante sua execução, os dados serão solicitados via API do Connecta, sendo obrigatório a conexão com a internet.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
merchantOrderId | String | Sim | ID Externo do pagamento gerado pelo usuário no formato string de 15 posições. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
Call-back *
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | Método | Sim | Método para notificação em caso de sucesso. |
onError | Método | Sim | Método para notificação em caso de erro. |
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta. |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização ou localização. |
Exemplo de chamada de getPaymentByMerchantOrderId()
paymentClient.getPaymentByMerchantOrderId("123456", new PaymentCallback<Any?>() {
@Override
public void onSuccess(Any? data) {
Toast toast = Toast.makeText(this@MainActivity, "Dados retornados com sucesso",
Toast.LENGTH_SHORT);
toast.show();
callback(true);
}
@Override
public void onError(ErrorData errorData) {
Toast toast = Toast.makeText(this@MainActivity, R.string.payment_not_get, Toast.LENGTH_SHORT);
toast.show();
callback(false);
}
});
Exemplo do retorno de dados getPaymentMerchantOrderId()
{
"MerchantOrderId": "20180204",
"Customer": {
"Name": "[Guest]"
},
"Payment": {
"Installments": 1,
"Interest": "ByMerchant",
"CreditCard": {
"ExpirationDate": "12/2020",
"BrandId": 1,
"IssuerId": 2,
"TruncateCardNumberWhenPrinting": true,
"InputMode": "Emv",
"AuthenticationMethod": "OnlineAuthentication",
"EmvData": "112233445566778899011AABBC012D3456789E0123FF45678AB901234C5D112233445566778800",
"PinBlock": {
"EncryptedPinBlock": "2280F6BDFD0C038D",
"EncryptionType": "Dukpt3Des",
"KsnIdentification": "1231vg31fv231313123"
}
},
"PaymentDateTime": "2019-04-15T12:00:00Z",
"ServiceTaxAmount": 0,
"SoftDescriptor": "Description",
"ProductId": 1,
"PinPadInformation": {
"TerminalId": "10000001",
"SerialNumber": "ABC123",
"PhysicalCharacteristics": "PinPadWithChipReaderWithSamModule",
"ReturnDataInfo": "00"
},
"Amount": 15798,
"ReceivedDate": "2019-04-15T12:00:00Z",
"CapturedAmount": 15798,
"Provider": "Cielo",
"ConfirmationStatus": 0,
"InitializationVersion": 1558708320029,
"EmvResponseData": "123456789ABCD1345DEA",
"Status": 2,
"IsSplitted": false,
"ReturnCode": 0,
"ReturnMessage": "Successful",
"PaymentId": "f15889ea-5719-4e1a-a2da-f4e50d5bd702",
"Type": "PhysicalDebitCard",
"Currency": "BRL",
"Country": "BRA",
"Links": [
{
"Method": "GET",
"Rel": "self",
"Href": "<https://api.cieloecommerce.cielo.com.br/1/physicalSales/f15889ea-5719-4e1a-a2daf4e50d5bd702>"
},
{
"Method": "DELETE",
"Rel": "self",
"Href": "<https://api.cieloecommerce.cielo.com.br/1/physicalSales/f15889ea-5719-4e1a-a2daf4e50d5bd702>"
},
{
"Method": "PUT",
"Rel": "self",
"Href": "<https://api.cieloecommerce.cielo.com.br/1/physicalSales/f15889ea-5719-4e1a-a2daf4e50d5bd702/confirmation>"
}
],
"PrintMessage": [
{
"Position": "Top",
"Message": "Transação autorizada"
},
{
"Position": "Bottom",
"Message": "Obrigado e volte sempre!"
}
],
"ReceiptInformation": [
{
"Field": "MERCHANT_NAME",
"Label": "NOME DO ESTABELECIMENTO",
"Content": "Estabelecimento"
},
{
"Field": "MERCHANT_ADDRESS",
"Label": "ENDEREÇO DO ESTABELECIMENTO",
"Content": "Rua Sem Saida, 0"
},
{
"Field": "MERCHANT_CITY",
"Label": "CIDADE DO ESTABELECIMENTO",
"Content": "Cidade"
},
{
"Field": "MERCHANT_STATE",
"Label": "ESTADO DO ESTABELECIMENTO",
"Content": "WA"
},
{
"Field": "MERCHANT_CODE",
"Label": "COD.ESTAB.",
"Content": 1234567890123456
},
{
"Field": "TERMINAL",
"Label": "POS",
"Content": 12345678
},
{
"Field": "NSU",
"Label": "DOC",
"Content": 123456
},
{
"Field": "DATE",
"Label": "DATA",
CLASSIFICAÇÃO: PÚBLICA 92 / 236
"Content": "01/01/20"
},
{
"Field": "HOUR",
"Label": "HORA",
"Content": "01:01"
},
{
"Field": "ISSUER_NAME",
"Label": "EMISSOR",
"Content": "NOME DO EMISSOR"
},
{
"Field": "CARD_NUMBER",
"Label": "CARTÃO",
"Content": 5432123454321234
},
{
"Field": "TRANSACTION_TYPE",
"Label": "TIPO DE TRANSAÇÃO",
"Content": "VENDA A CREDITO"
},
{
"Field": "AUTHORIZATION_CODE",
"Label": "AUTORIZAÇÃO",
"Content": 123456
},
{
"Field": "TRANSACTION_MODE",
"Label": "MODO DA TRANSAÇÃO",
"Content": "ONL"
},
{
"Field": "INPUT_METHOD",
"Label": "MODO DE ENTRADA",
"Content": "X"
},
{
"Field": "VALUE",
"Label": "VALOR",
"Content": "1,23"
},
{
"Field": "SOFT_DESCRIPTOR",
"Label": "SOFT DESCRIPTOR",
"Content": "Simulado"
}
],
"Receipt": {
"MerchantName": "Estabelecimento",
"MerchantAddress": "Rua Sem Saida, 0",
"MerchantCity": "Cidade",
"MerchantState": "WA",
"MerchantCode": 1234567890123456,
"Terminal": 12345678,
"Nsu": 123456,
"Date": "01/01/20",
"Hour": "01:01",
"IssuerName": "NOME DO EMISSOR",
"CardNumber": 5432123454321234,
"TransactionType": "VENDA A CREDITO",
"AuthorizationCode": 123456,
"TransactionMode": "ONL",
"InputMethod": "X",
"Value": "1,23",
"SoftDescriptor": "Simulado"
}
}
}
Estorno
[DEPRECATED] Integração com Estorno V1
Uma das formas de se integrar com a aplicação de pagamentos da Cielo é via IPC. Para isto, é fornecida uma biblioteca, a payments-api-x.x.x.x.aar, contendo todo o código necessário a ser usado para tais chamadas.
Usando esta API, é possível realizar todo o fluxo de pagamento, ou seja, a confirmação (ou o desfazimento) e o estorno. O pagamento pode ser realizado com um valor pré-definido ou com um valor em aberto, a ser digitado pelo operador do terminal. Além disso, pode-se informar uma lista de tipos de pagamentos (débito, crédito à vista, crédito parcelado, etc.) permitidos.
Ainda que esta integração se dê através de uma API, a aplicação de pagamentos pode exibir informações na interface do terminal, tais como mensagens (e.g., “Insira ou passe o cartão”), ou mesmo solicitar informações do operador (e.g., CVV). Assim sendo, durante a realização de qualquer operação, a aplicação que solicitou a operação não deve interagir com a interface do dispositivo até que a operação seja concluída.
A seguir, temos a especificação detalhada das operações disponíveis.
Para integração com a API de pagamentos, é fornecida a interface PaymentClient.
Warning: O método PaymentClient.Bind(_callback) deve ser chamado obrigatoriamente, antes de chamar qualquer método da Integração de Pagamento. O bind é assíncrono, ou seja, a próxima linha após o bind() será executada antes de receber a sua resposta, por isso garanta que antes de chamar os métodos de integração, o bind esteja conectado.
Métodos
Assinatura | Descrição |
---|---|
void reversePayment(ReversePaymentRequest paymentRequest, PaymentCallback paymentCallback) |
Realiza o processo de estorno de pagamento. (DEPRECATED: Utilizar reversePaymentV2 ) |
void cancelReversePayment(String paymentId, PaymentCallback paymentCallback) |
Desfaz uma solicitação de estorno de pagamento. |
reversePayment() (DEPRECATED: Utilizar reversePaymentV2)
Este método deve ser chamado quando se deseja fazer uma solicitação de estorno de pagamento. Durante sua execução, os dados do estorno serão validados, informações adicionais serão solicitadas ao operador (e.g. cartão) e a autorização junto à adquirente será feita.
Note que a transação de estorno não possui confirmação, mas apenas desfazimento. Assim, a confirmação ocorrerá naturalmente com o não envio do desfazimento, a depender do comportamento de cada adquirente.
Também a depender do comportamento de cada adquirente, é possível que não haja desfazimento para a transação de estorno. Neste caso, estornos aprovados retornarão o valor false no campo “ReversePayment.cancelable”. Além disto, caso seja chamado o método cancelReversePayment(), um erro específico será retornado informando que não é possível executar tal operação (vide Códigos de Resposta).
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | ReversePaymentRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição do estorno do pagamento. Note que nem todos os parâmetros são obrigatórios. |
callback | ReversePaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de estorno. |
Detalhe dos parâmetros
request (ReversePaymentRequest)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
value | BigDecimal |
Não | Valor da transação a ser estornada. Caso não seja preenchido (null), a interface solicitará o valor ao operador. Esta informação é utilizada para validar a integridade da transação que está sendo estornada. |
paymentId | String |
Sim | Identificador da transação que será estornada. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
appTransactionId | String |
Sim | Identificador da transação integrada. O Identificador referido é o da aplicação que originou a solicitação de estorno. Deve ser o mesmo valor enviado na transação de pagamento. |
ApplicationInfo.credentials | Credentials |
Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String |
Sim | Versão da aplicação que está solicitando o pagamento. |
showReceiptView (DEPRECATED) | Boolean |
Não | A Solução sempre irá imprimir o comprovante. |
callback (ReversePaymentCallback)
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | Método | Sim | Método para notificação em caso de sucesso. |
ReversePayment.paymentId | String |
Sim | Identificador da transação de estorno para a aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento. |
ReversePayment.acquirerId | String |
Sim | Identificador da transação de estorno para a adquirente. Este é o identificador que consta no arquivo que a adquirente fornece (EDI). Desta forma, é possível realizar a conciliação do estorno com a transação integrada. |
ReversePayment.cancelable | Boolean |
Sim | True, caso esta transação possa ser desfeita; False, caso contrário. |
ReversePayment.acquirerResponseCode | String |
Sim | Código de resposta da adquirente. |
ReversePayment.acquirerResponseDate | String |
Sim | Data/hora retornada pela adquirente. |
ReversePayment.acquirerAuthorizationNumber | String |
Sim | Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão). |
ReversePayment.Receipt.clientVia | String |
Não | Conteúdo do comprovante - via do cliente. |
ReversePayment.Receipt.merchantVia | String |
Não | Conteúdo do comprovante - via do estabelecimento. |
onError | Método | Sim | Método para notificação em caso de erro. |
ErrorData.paymentsResponseCode | String |
Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta. |
ErrorData.acquirerResponseCode | String |
Não | Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente. |
ErrorData.responseMessage | String |
Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. |
cancelReversePayment()
Este método deve ser chamado para desfazer uma transação de estorno anteriormente autorizada. Esta transação deve não ter sido desfeita ainda e deve ter sido autorizada (não negada) previamente.
Como dito na descrição dereversePayment(), é possível que não haja desfazimento para a transação de estorno para uma determinada adquirente. Assim, o método cancelReversePayment() pode retornar um erro específico informando que não é possível executar tal operação (vide Códigos de Resposta).
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será desfeita. O Identificador referido é aquele utilizado pela aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
Exemplo do fluxo de Estorno
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.math.BigDecimal;import br.com.phoebus.android.payments.api.Credentials;
import br.com.phoebus.android.payments.api.ErrorData;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.ReversePayment;
import br.com.phoebus.android.payments.api.ReversePaymentRequest;
import br.com.phoebus.android.payments.api.exception.ClientException;public class MainActivity extends AppCompatActivity implements View.OnClickListener, PaymentClient.PaymentCallback {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
}
@Override
public void onClick(View view) {
doExecute();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ReversePaymentRequest request = new ReversePaymentRequest();
request.setValue(new BigDecimal(50));
request.setAppTransactionId(“123456”);
request.setPaymentId(“999999”);
request.setShowReceiptView(true);
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
request.setCredentials(credentials);
try {
paymentClient.reversePayment(request, this);
} catch (ClientException e) {
Log.e(TAG, “Error reversePayment”, e);
}
}
@Override
public void onSuccess(ReversePayment reversePayment) {
Log.i(TAG, reversePayment.toString());
/*
Se, na sua regra de negócio, for preciso desfazer a transação por algum motivo,
chame o método cancelReversePayment()
**/
//doCancelReversePayment(reversePayment);
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
private void doCancelReversePayment(ReversePayment reversePayment) {
try {
paymentClient.cancelReversePayment(reversePayment.getPaymentId(),
new PaymentClient.PaymentCallback() {
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(MainActivity.this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(ReversePayment reversePayment) {
Log.i(TAG, reversePayment.toString());
}
});
} catch (ClientException e) {
Log.e(TAG, “Error cancelReversePayment”, e);
}
}
}|
| :- |
—–
Integração com Estorno V2
Apontamento 5 - links payments-api-xxx aponta para repositório do fornecedor.
Uma das formas de se integrar com a aplicação de pagamentos da Cielo é via IPC. Para isto, é fornecida uma biblioteca, a payments-api-x.x.x.x.aar, contendo todo o código necessário a ser usado para tais chamadas.
Usando esta API, é possível realizar todo o fluxo de pagamento, ou seja, a confirmação (ou o desfazimento) e o estorno. O pagamento pode ser realizado com um valor pré-definido ou com um valor em aberto, a ser digitado pelo operador do terminal. Além disso, pode-se informar uma lista de tipos de pagamentos (débito, crédito à vista, crédito parcelado, etc.) permitidos.
Ainda que esta integração se dê através de uma API, a aplicação de pagamentos pode exibir informações na interface do terminal, tais como mensagens (e.g., “Insira ou passe o cartão”), ou mesmo solicitar informações do operador (e.g., CVV). Assim sendo, durante a realização de qualquer operação, a aplicação que solicitou a operação não deve interagir com a interface do dispositivo até que a operação seja concluída.
A seguir, temos a especificação detalhada das operações disponíveis.
Para integração com a API de pagamentos, é fornecida a interface PaymentClient.
Fluxo de Estorno
Passos | Sucesso | Erro |
---|---|---|
1.Solicitação de estorno do pagamento | O estorno do pagamento foi realizado e seu status é Estornado | O estorno do pagamento não foi realizado. A resposta contém informações do erro. |
2.Resposta solicitação de estorno do pagamento | A resposta contém informações do estorno do pagamento realizado. | A resposta contém informações do erro da solicitação. |
3.Solicitação de desfazimento do estorno | Desfazimento realizado, seu status é Desfeita. | A resposta contém informações do erro da solicitação. |
4.Resposta do desfazimento do estorno | A resposta contém informações do desfazimento realizado. | A resposta contém informações do erro da solicitação. |
O estorno só é finalizado quando existe uma confirmação ou um desfazimento. Em caso de confirmação, o comprovante será impresso.
|Warning| | :-: | |O método PaymentClient.Bind(_callback) deve ser chamado, obrigatoriamente, antes de chamar qualquer método da Integração de Pagamento. O bind é assíncrono, ou seja, a próxima linha após o bind() será executada antes de receber a sua resposta, por isso garanta que, antes de chamar os métodos de integração, o bind esteja conectado.|
A partir da versão 3.1.5.0
Quando uma transação é feita, anteriormente, poderia ser confirmado realizando sua impressão (ou via printReceipt), ou ao realizar uma nova transação. Agora, o estorno também pode ser confirmado ao usar o novo parâmetro autoconfiram - indicando se deve ou não confirmar independente da impressão - ou utilizando o novo método confirmReversePayment().
Métodos
|Assinatura|Descrição| | :- | :- | |void reversePaymentV2(ReversePaymentRequestV2 paymentRequest, PaymentCallback paymentCallback)|Realiza o processo de estorno de pagamento.| |void confirmReversePayment(String paymentId, PaymentCallback paymentCallback)|Confirma uma autorização de estorno de pagamento realizada anteriormente.| |void cancelReversePayment(String paymentId, PaymentCallback paymentCallback)|Desfaz uma solicitação de estorno de pagamento.|
reversePaymentV2()
Este método deve ser chamado quando se deseja fazer uma solicitação de estorno de pagamento. Durante sua execução, os dados do estorno serão validados, informações adicionais serão solicitadas ao operador (e.g. cartão) e a autorização junto à adquirente será feita.
Note que a transação de estorno não possui confirmação, mas apenas desfazimento. Assim, a confirmação ocorrerá naturalmente com o não envio do desfazimento, a depender do comportamento de cada adquirente. Caso haja impressão do comprovante do estorno, quando for passado algum dos parâmetros printMerchantReceipt ou printCustomerReceipt com valor true, o estorno será confirmado automaticamente. Neste caso, o desfazimento não será permitido.
Também a depender do comportamento de cada adquirente, é possível que não haja desfazimento para a transação de estorno. Neste caso, estornos aprovados retornarão o valor false no campo “ReversePayment.cancelable”. Além disto, caso seja chamado o método cancelReversePayment(), um erro específico será retornado informando que não é possível executar tal operação (vide Códigos de Resposta).
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | ReversePaymentRequestV2 | Sim | Objeto de transferência de dados que conterá as informações da requisição do estorno do pagamento. Note que nem todos os parâmetros são obrigatórios. |
callback | ReversePaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de estorno. |
Detalhe dos parâmetros
request (ReversePaymentRequestV2)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
value | BigDecimal | Não | Valor da transação a ser estornada. Caso não seja preenchido (null), a interface solicitará o valor ao operador. Esta informação é utilizada para validar a integridade da transação que está sendo estornada.O valor deverá ser formatado com duas casas decimais. |
paymentId | String | Sim | Identificador da transação que será estornada. O identificador referido é aquele utilizado na aplicação de pagamentos. |
appTransactionId | String | Sim | Identificador da transação integrada. O identificador referidoé o da aplicação que originou a solicitação de estorno. Deve ser o mesmo valor enviado na transação de pagamento. |
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String | Sim | Versão da aplicação que está solicitando o pagamento. |
showReceiptView (DEPRECATED) | Boolean | Não | A Solução irá utilizar o valor dos parâmetros printMerchantReceipt e printCustomerReceipt para executar a impressão. |
printMerchantReceipt | Boolean | Não | Indica se o comprovante do estabelecimento deve ser impresso ou não. O valor padrão é false, isto é, o comprovante não é impresso. |
printCustomerReceipt | Boolean | Não | Indica se o comprovante do cliente deve ser impresso ou não. O valor padrão é false, isto é, o comprovante não é impresso. |
previewMerchantReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do estabelecimento deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
previewCustomerReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do cliente deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
autoConfirm (v3.1.5.0) | Boolean | Não | Indica se a transação deve ser confirmada automaticamente.Valores possíveis:1. null (padrão) : confirma automaticamente caso ocorra a impressão do comprovante.2. true : confirma automaticamente independente da regra de impressão.3. false : não confirma automaticamente, ficando pendente aguardando confirmação. |
callback (ReversePaymentCallback)
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |ReversePayment.paymentId|String|Sim|Identificador da transação de estorno. O Identificador referido é aquele utilizado na aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento.| |ReversePayment.acquirerId|String|Sim|Identificador da transação de estorno para a adquirente. Este é o identificador que consta no arquivo que a adquirente fornece (EDI). Desta forma, é possível realizar, a conciliação do estorno com a transação integrada.| |ReversePayment.cancelable|Boolean|Sim|True, caso esta transação possa ser desfeita; False, caso contrário.| |ReversePayment.acquirerResponseCode|String|Sim|Código de resposta da adquirente.| |ReversePayment.acquirerResponseDate|String|Sim|Data/hora retornada pela adquirente.| |ReversePayment.acquirerAuthorizationNumber|String|Sim|Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão).| |ReversePayment.Receipt.clientVia|String|Não|Conteúdo do comprovante - via do cliente.| |ReversePayment.Receipt.merchantVia|String|Não|Conteúdo do comprovante - via do estabelecimento.| |ReversePayment.acquirerAdditionalMessage|String|Não|Mensagem adicional enviada pela adquirente na resposta da transação.| |ReversePayment.ticketNumber|String|Não|Número do cupom gerado pelo terminal para a transação.| |ReversePayment.batchNumber|String|Sim|Número do Lote.| |ReversePayment.nsuTerminal|String|Sim|NSU gerado pelo terminal para a transação.| |ReversePayment.cardholderName|String|Não|Nome do portador do cartão.| |ReversePayment.cardBin|String|Sim|Seis primeiros dígitos do cartão.| |ReversePayment.panLast4Digits|String|Sim|Quatro últimos dígitos do cartão.| |ReversePayment.terminalId|String|Sim|Identificação do terminal.| | | | | | |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.acquirerAdditionalMessage|String|Não|Mensagem adicional enviada pela adquirente na resposta da transação.| |ErrorData.responseMessage|String|Sim**|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
confirmReversePayment()
Este método deve ser chamado para confirmar um estorno que o terminal conseguiu processar completamente a perna de autorização enviada pelo Autorizador.
Este método não deve ser chamado para um estorno já confirmado, ou seja, em que já se executou o método confirmReversePayment() anteriormente.
Este método não deve ser chamado para um estorno já desfeito, ou seja, em que já se executou o método cancelReversePayment() anteriormente.
Este método não deve ser chamado para um estorno que foi negada pelo Autorizador, ou seja, a transação precisa ter sido autorizada pelo Autorizador.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será confirmada. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
cancelReversePayment()
Este método deve ser chamado para desfazer uma transação de estorno anteriormente autorizada. Esta transação deve não ter sido desfeita ainda e deve ter sido autorizada (não negada) previamente.
Como dito na descrição dereversePayment(), é possível que não haja desfazimento para a transação de estorno para uma determinada adquirente. Assim, o método cancelReversePayment() pode retornar um erro específico informando que não é possível executar tal operação (vide Códigos de Resposta).
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será desfeita. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
Exemplo do fluxo de Estorno
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.math.BigDecimal;import br.com.phoebus.android.payments.api.Credentials;
import br.com.phoebus.android.payments.api.ErrorData;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.ReversePayment;
import br.com.phoebus.android.payments.api.ReversePaymentRequestV2;
import br.com.phoebus.android.payments.api.exception.ClientException;public class MainActivity extends AppCompatActivity implements View.OnClickListener, PaymentClient.PaymentCallback {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
}
@Override
public void onClick(View view) {
doExecute();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ReversePaymentRequestV2 request = new ReversePaymentRequestV2();
BigDecimal value = BigDecimal.valueOf(5000).movePointLeft(2);
request.setValue(value);
request.setAppTransactionId(“123456”);
request.setPaymentId(“999999”);
request.setPrintCustomerReceipt(true);
request.setPrintMerchantReceipt(true);
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
request.setCredentials(credentials);
try {
paymentClient.reversePaymentV2(request, this);
} catch (ClientException e) {
Log.e(TAG, “Error reversePaymentV2”, e);
}
}
@Override
public void onSuccess(ReversePayment reversePayment) {
Log.i(TAG, reversePayment.toString());
/*
Se, na sua regra de negócio, for preciso desfazer a
transação por algum motivo, chame o método
cancelReversePayment()
**/
//doCancelReversePayment(reversePayment);
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
private void doCancelReversePayment(ReversePayment reversePayment) {
try {
paymentClient.cancelReversePayment(reversePayment.getPaymentId(),
new PaymentClient.PaymentCallback() {
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, errorData.getResponseMessage());
Toast.makeText(MainActivity.this, errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(ReversePayment reversePayment) {
Log.i(TAG, reversePayment.toString());
}
});
} catch (ClientException e) {
Log.e(TAG, “Error cancelReversePayment”, e);
}
}
}|
| :- |
Enums
Status de Pagamento
Código | Nome | Descrição |
---|---|---|
1 | PENDING | Pagamento pendente |
2 | CONFIRMED | Pagamento confirmado |
3 | CANCELLED | Desfeita/Cancelada |
4 | REVERSED | Pagamento estornado |
5 | PROCESSING | Pagamento em processamento |
6 | DENIED | Pagamento negado |
7 | UNREACHABLE | Transação substituída (pré-autorização) |
8 | WAITING_VALIDATION | Aguardando validação |
9 | WAITING_CAPTURE | Aguardando captura |
10 | REFUNDED_DEVOLUTION | Devolução não referenciada |
11 | REFUNDED | Devolvida |
12 | APPROVED | Pagamento aprovado |
Status de Estorno
Código | Nome | Descrição |
---|---|---|
1 | PROCESSING | Estorno em processamento |
2 | PENDING | Estorno pendente, pode não ter havido resposta, ou ter a resposta aprovada, mas sem impressão de comprovante, inibida da chamada de reversePaymentV2 |
3 | CONFIRMED | Estorno aprovado |
4 | CANCELLED | Estorno negado |
Tipos de Pagamento
Código | Nome | Descrição |
---|---|---|
1 | CREDIT | Crédito à vista |
2 | DEBIT | Débito |
3 | CREDIT_STORE | Crédito parcelado sem juros |
4 | CREDIT_ADMIN | Crédito parcelado com juros |
5 | PRE_AUTHORIZATION | Pré-autorização |
6 | PRE_AUTHORIZATION_CONFIRMATION | Confirmação de pré-autorização |
7 | PRE_AUTHORIZATION_CREDIT_STORE | Pré autorização sem Juros |
8 | PRE_AUTHORIZATION_CREDIT_ADMIN | Pré autorização com Juros |
9 | PRE_AUTHORIZATION_SUBSTITUTIVE | Pré autorização substitutiva |
10 | DEBIT_POSTDATED | Débito pré datado |
11 | VOUCHER | Vale |
12 | VOUCHER_MEAL | Vale refeição |
13 | VOUCHER_FEED | Vale alimentação |
14 | VOUCHER_FLEET | Vale Frota |
15 | PRIVATE_LABEL | Bandeira privada |
16 | PRIVATE_LABEL_QUERY | Bandeira privada |
17 | PARCELED_CREDIT | Crédito parcelado |
Tipos de Captura
Código | Nome | Descrição |
---|---|---|
1 | MANUAL | Manual |
2 | MAGNETIC_STRIP | Tarja |
3 | CHIP | Chip |
4 | FALLBACK_MANUAL | Fallback digitado |
5 | FALLBACK_MAGNETIC_STRIP | Fallback de tarja |
6 | CHIP_CONTACTLESS | Chip sem contato |
7 | MAGNETIC_STRIP_CONTACTLESS | Tira magnética sem contato |
8 | QR_CODE | QR Code |
Consultas
Estruturas de dados retornada
Payments
|Nome|Tipo|Descrição| | :- | :- | :- | |id|String|Identificador da transação para a aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento.| |value|BigDecimal|Valor do pagamento. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro, pois há adquirentes que, para algumas situações, aprovam valores diferentes dos solicitados.| |paymentType|PaymentType|Tipo de pagamento (Débito, Crédito, Voucher, etc.).| |installments|Integer|Quantidade de parcelas do pagamento.| |acquirerName|String|Adquirente que autorizou o pagamento.| |cardBrand|String|Bandeira do cartão.| |cardBin|String|BIN do cartão.| |cardPanLast4Digits|String|Últimos 4 dígitos do PAN do cartão.| |captureType|CaptureType|Forma de captura do cartão.| |status|PaymentStatus|Situação do pagamento.| |date|Date|Data/hora do pagamento para a aplicação de pagamentos.| |acquirerId|String|Identificador da transação para a adquirente. Este é o identificador que consta no arquivo que a adquirente fornece (EDI). Desta forma, é possível realizar a conciliação do pagamento com a transação integrada.| |acquirerResponseCode|String|Código de resposta da adquirente.| |acquirerResponseDate|String|Data/hora retornada pela adquirente.| |acquirerAuthorizationNumber|String|Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão).| |clientVia|String|Conteúdo do comprovante - via do cliente.| |merchantVia|String|Conteúdo do comprovante - via do estabelecimento.| |additionalValueType|AdditionalValueType|Presente apenas quando existe um valor adicional no contexto da transação executada.| |additionalValue|BigDecimal|Presente apenas quando existe um valor adicional no contexto da transação executada.| |accountTypeId|String|Presente apenas quando existe um tipo de conta no contexto da transação executada.| |planId|String|Presente apenas quando existe um plano no contexto da transação executada.| |productShortName|String|Identificador de produto, retorna apenas transações de um produto.| |batchNumber|String|Número de lote.| |nsuTerminal|String|NSU gerado pelo terminal para a transação.| |cardHolderName|String|Nome do cliente no cartão.| |lastTrx|Boolean|Indica ‘true’ se é a última transação aprovada, e ‘falso’ caso contrário.| |terminalId|String|Identificação do terminal.| |originalValue|BigDecimal|Valor original da venda. Presente em pagamentos com QrCode, cujo beneficio foi aplicado ao valor da venda.| |appTransactionId|String|Identificador de transação para o aplicativo de pagamento. Esta é a informação que será usada para confirmar e desfazer o pagamento.| |acquirerNsu|String|NSU Adquirente para consulta e identificação de transações.| |ticketNumber|String|ticketNumber gerado pelo terminal para a transação.| |acquirerAdditionalMessage|String|Mensagem adicional enviada pela adquirente na resposta da transação.| |note|String|Texto adicional que é inserido como Nota. (pode ser o número da fatura)| |dni|String|Número do Documento.| |qrId|String|Identificador QrCode gerado pelo terminal de captura.| |ErrorData.paymentsResponseCode|String|Código de resposta para o erro que ocorreu. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Mensagem descritiva da causa da não autorização. Se a transação foi negada pela adquirente, conterá a mensagem retornada pela adquirente.|
Reversal
|Nome|Tipo|Descrição| | :- | :- | :- | |paymentId|String|Identificador da transação para a aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento.| |cancelable|Boolean|Indica ‘true’, caso esta transação possa ser desfeita e ‘false’ caso contrário.| |acquirerResponseCode|String|Código de resposta da adquirente.| |acquirerAuthorizationNumber|String|Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão).| |Receipt.clientVia|String|Conteúdo do comprovante - via do cliente.| |Receipt.merchantVia|String|Conteúdo do comprovante - via do estabelecimento.| |acquirerAdditionalMessage|String|Mensagem adicional enviada pela adquirente na resposta da transação.| |ticketNumber|String|ticketNumber gerado pelo terminal para a transação.| |batchNumber|String|Número de lote.| |nsuTerminal|String|NSU gerado pelo terminal para a transação.| |cardholderName|String|Nome do cliente no cartão.| |cardBin|String|BIN do cartão.| |panLast4Digits|String|Últimos 4 dígitos do PAN do cartão.| |terminalId|String|Identificação do terminal.| |value|BigDecimal|Valor da transação. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro, pois há adquirentes que, para algumas situações, aprovam valores diferentes dos solicitados.| |captureType|CaptureType|Forma de captura do cartão.| |status|PaymentStatus|Situação do pagamento.| |date|Date|Data/hora do pagamento para a aplicação de pagamentos.| |additionalValueType|AdditionalValueType|Presente apenas quando existe um valor adicional no contexto da transação executada.| |additionalValue|BigDecimal|Presente apenas quando existe um valor adicional no contexto da transação executada.| |lastTrx|Boolean|Indica ‘true’ se é a última transação aprovada, e ‘false’ caso contrário.| |appTransactionId|String|Identificador de transação para o aplicativo de pagamento. Esta é a informação que será usada para confirmar e desfazer o pagamento.| |acquirerNsu|String|NSU Adquirente para consulta e identificação de transações.| |ErrorData.paymentsResponseCode|String|Código de resposta para o erro que ocorreu. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Mensagem descritiva da causa da não autorização. Se a transação foi negada pela adquirente, conterá a mensagem retornada pela adquirente.|
Refund
Nome | Tipo | Descrição |
---|---|---|
id | String | Identificador da transação para a aplicação de pagamentos. |
value | BigDecimal | Valor da transação. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro, pois há adquirentes que, para algumas situações, aprovam valores diferentes dos solicitados. |
paymentType | PaymentType | Tipo de pagamento (Débito, Crédito, Voucher, etc.). |
acquirerName | String | Adquirente que autorizou o pagamento. |
cardBrand | String | Bandeira do cartão. |
cardBin | String | BIN do cartão. |
cardPanLast4Digits | String | Últimos 4 dígitos do PAN do cartão. |
captureType | CaptureType | Forma de captura do cartão. |
status | PaymentStatus | Situação do pagamento. |
date | Date | Data/hora do pagamento para a aplicação de pagamentos. |
acquirerId | String | Identificador da transação para a adquirente. Este é o identificador que consta no arquivo que a adquirente fornece (EDI). Desta forma, é possível realizar a conciliação do pagamento com a transação integrada. |
acquirerResponseCode | String | Código de resposta da adquirente. |
acquirerResponseDate | String | Data/hora retornada pela adquirente. |
acquirerAuthorizationNumber | String | Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão). |
clientVia | String | Conteúdo do comprovante - via do cliente. |
merchantVia | String | Conteúdo do comprovante - via do estabelecimento. |
accountTypeId | String | Presente apenas quando existe um tipo de conta no contexto da transação executada. |
productShortName | String | Identificador de produto, retorna apenas transações de um produto. |
batchNumber | String | Número de lote. |
nsuTerminal | String | NSU gerado pelo terminal para a transação. |
cardholderName | String | Nome do cliente no cartão. |
lastTrx | Boolean | Indica ‘true’ se é a última transação aprovada, e ‘false’ caso contrário. |
terminalId | String | Identificação do terminal. |
appTransactionId | String | Identificador de transação para o aplicativo de pagamento. Esta é a informação que será usada para confirmar e desfazer o pagamento. |
acquirerNsu | String | NSU Adquirente para consulta e identificação de transações. |
ErrorData.paymentsResponseCode | String | Código de resposta para o erro que ocorreu. Vide Códigos de Resposta |
ErrorData.responseMessage | String | Mensagem descritiva da causa da não autorização. Se a transação foi negada pela adquirente, conterá a mensagem retornada pela adquirente. |
Consulta de Devolução não referenciada via API
Esta é uma consulta via Content Provider que possibilita que outros aplicativos possam consultar informações sobre devoluções não referenciadas, sendo possível realizar filtros e obter diversos dados das devoluções não referenciadas, conforme objeto de retorno.
Integração com Aplicação de Pagamentos via Content Provider
Só será permitido listar pagamentos feitos pela própria aplicação que está realizando a consulta.
Declare essa permissão no AndroidManifest.xml do seu Aplicativo para ter acesso ao Content Provider.
**
content://br.com.phoebus.android.payments.provider/payments/refunds
URI (Uniform Resource Identifier) para obtenção de informações de devoluções não referenciadas.
Para realizar o request da consulta de pagamento por período entre datas é necessário adicionar essa dependência.
implementation ‘com.jakewharton.threetenabp:threetenabp:1.0.3’
Parâmetros de entrada
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |applicationId|Credentials|Sim|Identificação da aplicação que está realizando a consulta.| |secretToken|Credentials|Sim|Token de acesso da aplicação que está realizando a consulta.| |softwareVersion|String|Sim|Versão da aplicação que está solicitando a consulta.|
Filtros
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |status|ReversalStatus|Não|Filtra as devoluções não referenciadas cuja situação está na lista passada (aceita mais de um valor).| |startDate|Date|Não|Filtra as devoluções não referenciadas cuja data seja maior ou igual ao valor passado.| |finishDate|Date|Não|Filtra as devoluções não referenciadas cuja data seja menor ou igual ao valor passado.| |lastUpdateQuery|Boolean|Não|Indica se a consulta será feita com base na data e hora da devolução não referenciada (caso esse campo não seja preenchido ou receba ‘false’) ou na data e hora da última atualização da devolução não referenciada (caso esse campo receba ‘true’).| |startValue|BigDecimal|Não|Filtra as devoluções não referenciadas cujo valor seja maior ou igual ao valor passado.| |finishValue|BigDecimal|Não|Filtra as devoluções não referenciadas cujo valor seja menor ou igual ao valor passado.| |refundId|String|Não|Filtra as devoluções não referenciadas cujo identificador para a aplicação de pagamentos seja o valor passado.| |lastDigits|String|Não|Filtra as devoluções não referenciadas cujos últimos 4 dígitos do PAN do cartão usado na transação seja igual ao valor passado.| |productShortName|String|Não|Identificador de produto, retorna apenas as devoluções não referenciadas feitas com um produto específico.| |ticketNumber|String|Não|ticketNumber gerado pelo terminal para a devolução.| |batchPend|Boolean|Não|Filtra as devoluções não referenciadas que ainda estão estão no lote pendente (devoluções novas).| |lastBatch|Boolean|Não|Filtra as devoluções não referenciadas do último lote fechado.| |batchNumber|String|Não|Filtra as devoluções não referenciadas de um lote com número específico (fechado ou aberto).| |acquirerResponseCode|String|Não|Filtra as devoluções não referenciadas com base no código de resposta do host.| |appTransactionId|String|Não|Filtra as devoluções não referenciadas com um Identificador especifico, informado pelo app integrado em reversePaymentV2(), no campo appTransactionId.|
Retorno
A consulta de devolução não referenciada, retorna as devoluções não referenciadas que obedecerem aos filtros informados.
Os filtros informados são aplicados apenas aos campos das devoluções não referenciadas.
A lista de devoluções não referenciadas retornadas deve estar ordenada de forma ascendente pelo campo date.
|Nome|Tipo|Descrição| | :- | :- | :- | |id|String|Identificador da transação para a aplicação de pagamentos.| |value|BigDecimal|Valor da transação. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro, pois há adquirentes que, para algumas situações, aprovam valores diferentes dos solicitados.| |paymentType|PaymentType|Tipo de pagamento (Débito, Crédito, Voucher, etc.).| |acquirerName|String|Adquirente que autorizou o pagamento.| |cardBrand|String|Bandeira do cartão.| |cardBin|String|BIN do cartão.| |cardPanLast4Digits|String|Últimos 4 dígitos do PAN do cartão.| |captureType|CaptureType|Forma de captura do cartão.| |status|PaymentStatus|Situação do pagamento.| |date|Date|Data/hora do pagamento para a aplicação de pagamentos.| |acquirerId|String|Identificador da transação para a adquirente. Este é o identificador que consta no arquivo que a adquirente fornece (EDI). Desta forma, é possível realizar a conciliação do pagamento com a transação integrada.| |acquirerResponseCode|String|Código de resposta da adquirente.| |acquirerResponseDate|String|Data/hora retornada pela adquirente.| |acquirerAuthorizationNumber|String|Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão).| |clientVia|String|Conteúdo do comprovante - via do cliente.| |merchantVia|String|Conteúdo do comprovante - via do estabelecimento.| |accountTypeId|String|Presente apenas quando existe um tipo de conta no contexto da transação executada.| |productShortName|String|Identificador de produto, retorna apenas transações de um produto.| |batchNumber|String|Número de lote.| |nsuTerminal|String|NSU gerado pelo terminal para a transação.| |cardholderName|String|Nome do cliente no cartão.| |lastTrx|Boolean|Indica ‘true’ se é a última transação aprovada, e ‘false’ caso contrário.| |terminalId|String|Identificação do terminal.| |appTransactionId|String|Identificador de transação para o aplicativo de pagamento. Esta é a informação que será usada para confirmar e desfazer o pagamento.| |acquirerNsu|String|NSU Adquirente para consulta e identificação de transações.| |ErrorData.paymentsResponseCode|String|Código de resposta para o erro que ocorreu. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Mensagem descritiva da causa da não autorização. Se a transação foi negada pela adquirente, conterá a mensagem retornada pela adquirente.|
EXEMPLO DE RETORNO
A estrutura “refund” é a mesma usada na consulta de última transação aprovada e confirmada;
● Quando 2 devoluções obedecem aos critérios informados:
|{
[
{
“refund”: {
…
}
},
{
“refund”: {
…
}
}
]
}|
| :- |
|Info| | :-: |
Para facilitar o uso, são disponibilizadas classes de acesso ao provider:
● RefundProviderRequest
● PaymentProviderApi
EXEMPLO
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.jakewharton.threetenabp.AndroidThreeTen;import java.math.BigDecimal;import java.text.SimpleDateFormat;
import java.util.Arrays;import java.util.Date;
import java.util.List;
import java.util.TimeZone;import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentStatus;
import br.com.phoebus.android.payments.api.provider.PaymentContract;
import br.com.phoebus.android.payments.api.provider.PaymentProviderApi;
import br.com.phoebus.android.payments.api.provider.PaymentProviderRequest;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
AndroidThreeTen.init(getApplication());
}
@Override
public void onClick(View view) {
doExecute();
}
public void doExecute() {
//definindo as credenciais
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion(“1.0”);
//criando objeto de request para o payment content provider
RefundProviderRequest request = createRequest(applicationInfo);
try {
//solicitando a lista de devolução não referenciada
List refundList = PaymentProviderApi.create(this).findAllRefunds(request);
//********* Outra forma de realizar a consulta ******************************************
// Cursor cursor = getApplicationContext().getContentResolver().query(request.getUriBuilder().build(), null, null, null, null);
// List refundList = RefundProviderResponse.fromCursor(cursor);
//***************************************************************************************
Toast.makeText(this, paymentsList.size()+””, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
}
private RefundProviderRequest createRequest(ApplicationInfo appInfo) {
RefundProviderRequest refundRequest = new RefundProviderRequest();
refundRequest.setApplicationInfo(appInfo);
//filtrando pelo refundId
refundRequest.setRefundId(“000000000”);
//filtrando por período
SimpleDateFormat isoFormat = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss.SSS”);
isoFormat.setTimeZone(TimeZone.getTimeZone(“UTC”));
try {
Date dateStart = isoFormat.parse(“2020-04-06T00:00:00.000”);
Date dateFinish =isoFormat.parse(“2020-04-06T23:59:59.000”);
refundRequest.setStartDate(dateStart);
refundRequest.setFinishDate(dateFinish);
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
//filtrando por faixa de valores de pagamento
refundRequest.setStartValue(new BigDecimal(“0.00”));
refundRequest.setFinishValue(new BigDecimal(“1000.00”));
//filtrando pelos 4 últimos dígitos do cartão
refundRequest.setLastDigits(“9636”);
//filtrando pelos 4 últimos dígitos do cartão
List status = Arrays.asList(new ReversalStatus[]{
ReversalStatus.PENDING,
ReversalStatus.PROCESSING,
ReversalStatus.CONFIRMED,
ReversalStatus.CANCELLED
});
return refundRequest;
}
}|
| :- |
—–
Consulta de Estornos via API
Esta é uma consulta via Content Provider que possibilita que outros aplicativos possam consultar informações sobre os estornos, sendo possível realizar filtros e obter diversos dados dos estornos conforme objeto de retorno.
Integração com Aplicação de Pagamentos via Content Provider
Só será permitido listar pagamentos feitos pela própria aplicação que está realizando a consulta.
Declare essa permissão no AndroidManifest.xml do seu Aplicativo para ter acesso ao Content Provider.
**
content://br.com.phoebus.android.payments.provider/payments/reversals
URI (Uniform Resource Identifier) para obtenção de informações de estornos.
Para realizar o request da consulta por período entre datas é necessário adicionar essa dependência.
implementation ‘com.jakewharton.threetenabp:threetenabp:1.0.3’
Parâmetros de entrada
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |applicationId|Credentials|Sim|Identificação da aplicação que está realizando a consulta.| |secretToken|Credentials|Sim|Token de acesso da aplicação que está realizando a consulta.| |softwareVersion|String|Sim|Versão da aplicação que está solicitando a consulta.|
Filtros
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |status|ReversalStatus|Não|Filtra os estornos cuja situação está na lista passada (aceita mais de um valor).| |startDate|Date|Não|Filtra os estornos cuja data seja maior ou igual ao valor passado.| |finishDate|Date|Não|Filtra os estornos cuja data seja menor ou igual ao valor passado.| |lastUpdateQuery|Boolean|Não|Indica se a consulta será feita com base na data e hora do estorno (caso esse campo não seja preenchido ou receba ‘false’) ou na data e hora da última atualização do estorno (caso esse campo receba “TRUE”).| |startValue|BigDecimal|Não|Filtra os estornos cujo valor seja maior ou igual ao valor passado.| |finishValue|BigDecimal|Não|Filtra os estornos cujo valor seja menor ou igual ao valor passado.| |paymentId|String|Não|Filtra os estornos cujo identificador do pagamento para a aplicação de pagamentos seja o valor passado.| |lastDigits|String|Não|Filtra os estornos cujos últimos 4 dígitos do PAN do cartão seja igual ao valor passado.| |productShortName|String|Não|Identificador de produto, retorna apenas estornos feitos com um produto específico.| |ticketNumber|String|Não|ticketNumber gerado pelo terminal para o estorno.| |batchPend|Boolean|Não|Filtra os estornos que ainda estão estão no lote pendente (estornos novos).| |lastBatch|Boolean|Não|Filtra os estornos do último lote fechado.| |batchNumber|String|Não|Filtra os estornos de um lote com número específico (fechado ou aberto).| |acquirerResponseCode|String|Não|Filtra estornos com base no código de resposta do host.| |appTransactionId|String|Não|Filtra estornos com um Identificador especifico, informado pelo app integrado em reversePaymentV2(), no campo appTransactionId.|
Retorno
A consulta de estornos, retorna os estornos referenciados que obedecerem aos filtros informados, e os seus pagamentos associados.
Não retorna estornos que não obedecem aos filtros informados.
Os filtros informados são aplicados apenas aos campos dos estornos.
A lista de pagamentos retornados deve estar ordenada de forma ascendente pelo campo date do pagamento.
Em cada pagamento, a lista de estornos retornados deve estar ordenada de forma ascendente pelo campo date do estorno. Não retorna devoluções não referenciadas.
|Nome|Tipo|Descrição| | :- | :- | :- | |paymentId|String|Identificador da transação para a aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento.| |cancelable|Boolean|Indica ‘true’, caso esta transação possa ser desfeita e ‘false’ caso contrário.| |acquirerResponseCode|String|Código de resposta da adquirente.| |acquirerAuthorizationNumber|String|Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão).| |Receipt.clientVia|String|Conteúdo do comprovante - via do cliente.| |Receipt.merchantVia|String|Conteúdo do comprovante - via do estabelecimento.| |acquirerAdditionalMessage|String|Mensagem adicional enviada pela adquirente na resposta da transação.| |ticketNumber|String|ticketNumber gerado pelo terminal para a transação.| |batchNumber|String|Número de lote.| |nsuTerminal|String|NSU gerado pelo terminal para a transação.| |cardholderName|String|Nome do cliente no cartão.| |cardBin|String|BIN do cartão.| |panLast4Digits|String|Últimos 4 dígitos do PAN do cartão.| |terminalId|String|Identificação do terminal.| |value|BigDecimal|Valor da transação. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro, pois há adquirentes que, para algumas situações, aprovam valores diferentes dos solicitados.| |captureType|CaptureType|Forma de captura do cartão.| |status|PaymentStatus|Situação do pagamento.| |date|Date|Data/hora do pagamento para a aplicação de pagamentos.| |additionalValueType|AdditionalValueType|Presente apenas quando existe um valor adicional no contexto da transação executada.| |additionalValue|BigDecimal|Presente apenas quando existe um valor adicional no contexto da transação executada.| |lastTrx|Boolean|Indica ‘true’ se é a última transação aprovada, e ‘false’ caso contrário.| |appTransactionId|String|Identificador de transação para o aplicativo de pagamento. Esta é a informação que será usada para confirmar e desfazer o pagamento.| |acquirerNsu|String|NSU Adquirente para consulta e identificação de transações.| |ErrorData.paymentsResponseCode|String|Código de resposta para o erro que ocorreu. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Mensagem descritiva da causa da não autorização. Se a transação foi negada pela adquirente, conterá a mensagem retornada pela adquirente.|
EXEMPLO DE RETORNO
As estruturas “payment” e “reversals” são as mesmas usadas na consulta de última transação aprovada e confirmada;
● Quando dois estornos de um pagamento, e um estorno de outro pagamento obedecem aos critérios informados (por exemplo, filtro com status = CANCELLED):
|[
{
“payment”: {
…
},
“reversals”: [
{
…
},
{
…
}
]
},
{
“payment”: {
…
},
“reversals”: [
{
…
}
]
}
]|
| :- |
|Info| | :-: |
Para facilitar o uso, são disponibilizadas classes de acesso ao provider:
● ReversalProviderRequest
● PaymentProviderApi
EXEMPLO
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.jakewharton.threetenabp.AndroidThreeTen;
import java.math.BigDecimal;import java.text.SimpleDateFormat;
import java.util.Arrays;import java.util.Date;
import java.util.List;
import java.util.TimeZone;import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentStatus;
import br.com.phoebus.android.payments.api.provider.PaymentContract;
import br.com.phoebus.android.payments.api.provider.PaymentProviderApi;
import br.com.phoebus.android.payments.api.provider.PaymentProviderRequest;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
AndroidThreeTen.init(getApplication());
}
@Override
public void onClick(View view) {
doExecute();
}
public void doExecute() {
//definindo as credenciais
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion(“1.0”);
//criando objeto de request para o payment content provider
ReversalProviderRequest request = createRequest(applicationInfo);
try {
//solicitando a lista de estornos
List transactionsList = PaymentProviderApi.create(this).findAllReversals(request);
//********* Outra forma de realizar a consulta ******************************************
// Cursor cursor = getApplicationContext().getContentResolver().query(request.getUriBuilder().build(), null, null, null, null);
// List transactionsList = TransactionProviderResponse.fromCursor(cursor);
//***************************************************************************************
Toast.makeText(this, transactionsList.size()+””, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
}
private ReversalProviderRequest createRequest(ApplicationInfo appInfo) {
ReversalProviderRequest reversalRequest = new ReversalProviderRequest();
reversalRequest.setApplicationInfo(appInfo);
//filtrando pelo paymentId
reversalRequest.setPaymentId(“000000000”);
//filtrando por período
SimpleDateFormat isoFormat = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss.SSS”);
isoFormat.setTimeZone(TimeZone.getTimeZone(“UTC”));
try {
Date dateStart = isoFormat.parse(“2020-04-06T00:00:00.000”);
Date dateFinish =isoFormat.parse(“2020-04-06T23:59:59.000”);
reversalRequest.setStartDate(dateStart);
reversalRequest.setFinishDate(dateFinish);
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
//filtrando por faixa de valores de pagamento
reversalRequest.setStartValue(new BigDecimal(“0.00”));
reversalRequest.setFinishValue(new BigDecimal(“1000.00”));
//filtrando pelos 4 últimos dígitos do cartão
reversalRequest.setLastDigits(“9636”);
//filtrando pelos 4 últimos dígitos do cartão
List status = Arrays.asList(new ReversalStatus[]{
ReversalStatus.PENDING,
ReversalStatus.PROCESSING,
ReversalStatus.CONFIRMED,
ReversalStatus.CANCELLED
});
return reversalRequest;
}
}|
| :- |
Consulta de Lotes via API
Esta é uma consulta via Content Provider que possibilita que outros aplicativos possam consultar informações sobre os lotes, sendo possível realizar filtros exclusivos e obter diversos dados dos lotes conforme objeto de retorno (vide Fechamento de lote).
Integração com Aplicação de Pagamentos via Content Provider
Só será permitido listar pagamentos feitos pela própria aplicação que está realizando a consulta.
Declare essa permissão no AndroidManifest.xml do seu Aplicativo para ter acesso ao Content Provider.
**
content://br.com.phoebus.android.payments.provider/periodBatch content://br.com.phoebus.android.payments.provider/batchNumber content://br.com.phoebus.android.payments.provider/currentBatch
URI (Uniform Resource Identifier) para obtenção de informações de lote.
Para realizar o request da consulta por período entre datas é necessário adicionar essa dependência.
implementation ‘com.jakewharton.threetenabp:threetenabp:1.0.3’
Filtros
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |batchFilter|BatchFilter|Sim|Informa qual o tipo de filtro de lote é solicitado.| |startDate|Date|Não|Filtra os lotes cuja data seja maior ou igual ao valor passado, necessário quando BatchFilter.TIME_BATCH.| |finishDate|Date|Não|Filtra os lotes cuja data seja menor ou igual ao valor passado, necessário quando BatchFilter.TIME_BATCH.| |batchNumber|Long|Não|Filtra os lotes por número específico, campo necessário quando BatchFilter.NUMBER_BATCH.|
BatchFilter
|Nome|Descrição| | :- | :- | |CURRENT_BATCH|Lote atual.| |LAST_CLOSED_BATCH|Último lote fechado.| |BATCH_NUMBER|Número do lote específico.| |PERIOD_BATCH|Lote por data e hora inicial e data/hora final.|
Retorno
O objeto de resposta é o List (vide Fechamento de lote).
|Info| | :-: |
Para facilitar o uso, são disponibilizadas classes de acesso ao provider:
● BatchProviderRequest
● BatchProviderApi
● BatchContract
EXEMPLO
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.jakewharton.threetenabp.AndroidThreeTen;import java.math.BigDecimal;import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentStatus;
import br.com.phoebus.android.payments.api.provider.PaymentContract;
import br.com.phoebus.android.payments.api.provider.PaymentProviderApi;
import br.com.phoebus.android.payments.api.provider.PaymentProviderRequest;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
AndroidThreeTen.init(getApplication());
}
@Override
public void onClick(View view) {
doExecute();
}
public void doExecute() {
//definindo as credenciais
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion(“1.0”);
//criando objeto de request para o batch content provider
BatchProviderRequest request = createRequest(applicationInfo);
//selecionando propriedades retornadas
String[] columns = new String[]{
BatchContract.column.batchData
};
try {
//solicitando a lista de lotes
request.setColumns(columns);
List batchList = BatchProviderApi.create(this).findAll(request);
//********* Outra forma de realizar a consulta ******************************************
// Cursor cursor = getApplicationContext().getContentResolver().query(request.getUriBuilder().build(), columns, null, null, null);
// List batchList = SettleRequestResponseV2.fromCursor(cursor);
//***************************************************************************************
Toast.makeText(this, batchList.size()+””, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
}
private BatchProviderRequest createRequest(ApplicationInfo appInfo) {
BatchProviderRequest batchRequest = new BatchProviderRequest();
batchRequest.setApplicationInfo(appInfo);
//filtrando por período
SimpleDateFormat isoFormat = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss.SSS”);
isoFormat.setTimeZone(TimeZone.getTimeZone(“UTC”));
try {
batchRequest.setBatchFilter(BatchFilter.PERIOD_BATCH);
Date dateStart = isoFormat.parse(“2020-04-06T00:00:00.000”);
Date dateFinish =isoFormat.parse(“2020-04-06T23:59:59.000”);
batchRequest.setStartDate(dateStart);
batchRequest.setFinishDate(dateFinish);
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
return batchRequest;
}
}|
| :- |
—–
Consulta de Pagamentos via API
Uma das formas de se integrar com a aplicação de pagamentos da Cielo é via IPC. Para isto, é fornecida uma biblioteca, a payments-api-x.x.x.x.aar, contendo todo o código necessário para realizar as chamadas de integração.
Usando esta API, é possível realizar todo o fluxo de pagamento, ou seja, a confirmação (ou o desfazimento). Além disso, pode-se informar uma lista de tipos de pagamentos (débito, crédito à vista, crédito parcelado, etc.) permitidos.
Ainda que esta integração se dê através de uma API, a aplicação de pagamentos pode exibir informações na interface do terminal, tais como mensagens (e.g., “Insira ou passe o cartão”), ou mesmo solicitar informações do operador (e.g., CVV). Assim sendo, durante a realização de qualquer operação, a aplicação que solicitou a operação não deve interagir com a interface do dispositivo até que a operação seja concluída.
A seguir, temos a especificação detalhada das operações disponíveis.
Para integração com a API de pagamentos, é fornecida a interface PaymentClient.
Integração com Aplicação de Pagamentos via Content Provider
A integração via Content Provider possibilita que outros aplicativos possam consultar informações a respeito de pagamentos efetuados, sendo possível realizar filtros e obter diversos dados dos pagamentos, inclusive sua situação.
Só será permitido listar pagamentos feitos pela própria aplicação que está realizando a consulta.
Declare essa permissão no AndroidManifest.xml do seu Aplicativo para ter acesso ao Content Provider.
**
content://br.com.phoebus.android.payments.provider/payments
URI (Uniform Resource Identifier) para obtenção de informações de pagamentos.
Para realizar o request da consulta de pagamento por período entre datas é necessário adicionar essa dependência.
implementation ‘com.jakewharton.threetenabp:threetenabp:1.0.3’
Filtros
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |status|PaymentStatus|Não|Filtra os pagamentos cuja situação está na lista passada (aceita mais de um valor).| |startDate|Date|Não|Filtra os pagamentos cuja data seja maior ou igual ao valor passado.| |finishDate|Date|Não|Filtra os pagamentos cuja data seja menor ou igual ao valor passado.| |lastUpdateQuery|Boolean|Não|Indica se a consulta será feita com base na data e hora da transação (caso esse campo não seja preenchido ou receba ‘false’) ou na data e hora da última atualização dela (caso esse campo receba ‘true’).| |startValue|BigDecimal|Não|Filtra os pagamentos cujo valor seja maior ou igual ao valor passado.| |finishValue|BigDecimal|Não|Filtra os pagamentos cujo valor seja menor ou igual ao valor passado.| |paymentId|String|Não|Filtra os pagamentos cujo identificador da transação para a aplicação de pagamentos seja o valor passado.| |lastDigits|String|Não|Filtra os pagamentos cujos últimos 4 dígitos do PAN do cartão usado na transação seja igual ao valor passado.| |applicationId|Credentials|Sim|Identificação da aplicação que está realizando a consulta.| |secretToken|Credentials|Sim|Token de acesso da aplicação que está realizando a consulta.| |softwareVersion|String|Sim|Versão da aplicação que está solicitando a consulta.| |productShortName|String|Não|Identificador de produto, retorna apenas transações de um produto.| |ticketNumber|String|Não|ticketNumber gerado pelo terminal para a transação.| |batchPend|Boolean|Não|Filtra as transações que ainda estão estão no lote pendente (transações novas).| |lastBatch|Boolean|Não|Filtra as transações do último lote fechado.| |batchNumber|String|Não|Filtra as transações de um lote.| |acquirerResponseCode|String|Não|Filtra transações com base no código de resposta do host.| |lastTrx|Boolean|Não|Filtra a última transação aprovada.| |trxType|String|Não|Filtra as transações por tipo (“1” - Venda, “2” - Devolução não Referenciada).| |note|String|Não|Texto adicional que é inserido como Nota. (pode ser o número da fatura)| |dni|String|Não|Número do Documento.| |qrId|String|Não|Identificador QrCode gerado pelo terminal de captura.| |operationMethod|Integer|Não|Filtra transações segundo a forma de operação. Admita os seguintes valores: 0 - Apenas com cartão físico (ler ou datilografado); 1 - Somente com QRCode.| |appTransactionId|String|Não|Identificador da transação integrada para o software. O Identificador referido é aquele utilizado na aplicação que originou a solicitação de pagamento.|
Retorno
Nome | Tipo | Descrição |
---|---|---|
id | String | Identificador da transação para a aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento. |
value | BigDecimal | Valor do pagamento. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro, pois há adquirentes que, para algumas situações, aprovam valores diferentes dos solicitados. |
paymentType | PaymentType | Tipo de pagamento (Débito, Crédito, Voucher, etc.). |
installments | Integer | Quantidade de parcelas do pagamento. |
acquirerName | String | Adquirente que autorizou o pagamento. |
cardBrand | String | Bandeira do cartão. |
cardBin | String | BIN do cartão. |
cardPanLast4Digits | String | Últimos 4 dígitos do PAN do cartão. |
captureType | CaptureType | Forma de captura do cartão. |
status | PaymentStatus | Situação do pagamento. |
date | Date | Data/hora do pagamento para a aplicação de pagamentos. |
acquirerId | String | Identificador da transação para a adquirente. Este é o identificador que consta no arquivo que a adquirente fornece (EDI). Desta forma, é possível realizar a conciliação do pagamento com a transação integrada. |
acquirerResponseCode | String | Código de resposta da adquirente. |
acquirerResponseDate | String | Data/hora retornada pela adquirente. |
acquirerAuthorizationNumber | String | Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão). |
receiptClient | String | Conteúdo do comprovante - via do cliente. |
receiptMerchant | String | Conteúdo do comprovante - via do estabelecimento. |
additionalValueType | AdditionalValueType | Presente apenas quando existe um valor adicional no contexto da transação executada. |
additionalValue | BigDecimal | Presente apenas quando existe um valor adicional no contexto da transação executada. |
accountTypeId | String | Presente apenas quando existe um tipo de conta no contexto da transação executada. |
planId | String | Presente apenas quando existe um plano no contexto da transação executada. |
productShortName | String | Identificador de produto, retorna apenas transações de um produto. |
batchNumber | String | Número de lote. |
nsuTerminal | String | NSU gerado pelo terminal para a transação. |
cardholderName | String | Nome do cliente no cartão. |
lastTrx | Boolean | Indica ‘true’ se é a última transação aprovada, e ‘falso’ caso contrário. |
terminalId | String | Identificação do terminal. |
originalValue | BigDecimal | Valor orginal da venda. Presente em pagamentos com QRCode, cujo beneficio foi aplicado ao valor da venda. |
appTransactionId | String | Identificador de transação para o aplicativo de pagamento. Esta é a informação que será usada para confirmar e desfazer o pagamento. |
acquirerNsu | String | NSU Adquirente para consulta e identificação de transações. |
|Info| | :-: |
É possível customizar quais informações estarão presentes na resposta. Para isso, deve ser passado um array de Strings com as colunas desejadas para o método query() do Content Resolver. Caso use a API de acesso ao provider, pode utilizar o método setColumns() do PaymentProviderRequest.
|Info| | :-: |
Para facilitar o uso, são disponibilizadas classes de acesso ao provider:
● PaymentProviderRequest
● PaymentProviderApi
● PaymentContract
EXEMPLO
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.jakewharton.threetenabp.AndroidThreeTen;import java.math.BigDecimal;import java.text.SimpleDateFormat;
import java.util.Arrays;import java.util.Date;
import java.util.List;
import java.util.TimeZone;import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentStatus;
import br.com.phoebus.android.payments.api.provider.PaymentContract;
import br.com.phoebus.android.payments.api.provider.PaymentProviderApi;
import br.com.phoebus.android.payments.api.provider.PaymentProviderRequest;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
AndroidThreeTen.init(getApplication());
}
@Override
public void onClick(View view) {
doExecute();
}
public void doExecute() {
//definindo as credenciais
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion(“1.0”);
//criando objeto de request para o payment content provider
PaymentProviderRequest request = createRequest(applicationInfo);
//selecionando propriedades retornadas
String[] columns = new String[]{
PaymentContract.column.ID,
PaymentContract.column.VALUE,
PaymentContract.column.PAYMENT_STATUS,
PaymentContract.column.PAYMENT_DATE,
PaymentContract.column.CARD_BRAND,
};
try {
//solicitando a lista de pagamentos
request.setColumns(columns);
List paymentsList = PaymentProviderApi.create(this).findAll(request);
//********* Outra forma de realizar a consulta ******************************************
// Cursor cursor = getApplicationContext().getContentResolver().query(request.getUriBuilder().build(), columns, null, null, null);
// List paymentsList = Payment.fromCursor(cursor);
//***************************************************************************************
Toast.makeText(this, paymentsList.size()+””, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
}
private PaymentProviderRequest createRequest(ApplicationInfo appInfo) {
PaymentProviderRequest paymentRequest = new PaymentProviderRequest();
paymentRequest.setApplicationInfo(appInfo);
//filtrando pelo paymentId
paymentRequest.setPaymentId(“000000000”);
//filtrando por período
SimpleDateFormat isoFormat = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss.SSS”);
isoFormat.setTimeZone(TimeZone.getTimeZone(“UTC”));
try {
Date dateStart = isoFormat.parse(“2020-04-06T00:00:00.000”);
Date dateFinish =isoFormat.parse(“2020-04-06T23:59:59.000”);
paymentRequest.setStartDate(dateStart);
paymentRequest.setFinishDate(dateFinish);
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
//filtrando por faixa de valores de pagamento
paymentRequest.setStartValue(new BigDecimal(“0.00”));
paymentRequest.setFinishValue(new BigDecimal(“1000.00”));
//filtrando pelos 4 últimos dígitos do cartão
paymentRequest.setLastDigits(“9636”);
//filtrando pelos 4 últimos dígitos do cartão
List status = Arrays.asList(new PaymentStatus[]{
PaymentStatus.PENDING,
PaymentStatus.CONFIRMED,
PaymentStatus.CANCELLED,
PaymentStatus.REVERSED
});
return paymentRequest;
}
}|
| :- |
—–
Consulta de Pagamentos V2 via API
Esta é uma consulta via Content Provider que possibilita que outros aplicativos possam consultar informações sobre os pagamentos efetuados, sendo possível realizar filtros e obter diversos dados dos pagamentos, inclusive sua situação.
Integração com Aplicação de Pagamentos via Content Provider
Só será permitido listar pagamentos feitos pela própria aplicação que está realizando a consulta.
Declare essa permissão no AndroidManifest.xml do seu Aplicativo para ter acesso ao Content Provider.
**
content://br.com.phoebus.android.payments.provider/payments/transactions
URI (Uniform Resource Identifier) para obtenção de informações de pagamentos.
Para realizar o request da consulta de pagamento por período entre datas é necessário adicionar essa dependência.
implementation ‘com.jakewharton.threetenabp:threetenabp:1.0.3’
Parâmetros de entrada
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |applicationId|Credentials|Sim|Identificação da aplicação que está realizando a consulta.| |secretToken|Credentials|Sim|Token de acesso da aplicação que está realizando a consulta.| |softwareVersion|String|Sim|Versão da aplicação que está solicitando a consulta.|
Filtros
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |status|PaymentStatus|Não|Filtra os pagamentos cuja situação está na lista passada (aceita mais de um valor).| |startDate|Date|Não|Filtra os pagamentos cuja data seja maior ou igual ao valor passado.| |finishDate|Date|Não|Filtra os pagamentos cuja data seja menor ou igual ao valor passado.| |lastUpdateQuery|Boolean|Não|Indica se a consulta será feita com base na data e hora da transação (caso esse campo não seja preenchido ou receba ‘false’) ou na data e hora da última atualização dela (caso esse campo receba ‘true’).| |startValue|BigDecimal|Não|Filtra os pagamentos cujo valor seja maior ou igual ao valor passado.| |finishValue|BigDecimal|Não|Filtra os pagamentos cujo valor seja menor ou igual ao valor passado.| |paymentId|String|Não|Filtra os pagamentos cujo identificador da transação para a aplicação de pagamentos seja o valor passado.| |lastDigits|String|Não|Filtra os pagamentos cujos últimos 4 dígitos do PAN do cartão usado na transação seja igual ao valor passado.| |productShortName|String|Não|Identificador de produto, retorna apenas transações de um produto.| |ticketNumber|String|Não|ticketNumber gerado pelo terminal para a transação.| |batchPend|Boolean|Não|Filtra as transações que ainda estão estão no lote pendente (transações novas).| |lastBatch|Boolean|Não|Filtra as transações do último lote fechado.| |batchNumber|String|Não|Filtra as transações de um lote.| |acquirerResponseCode|String|Não|Filtra transações com base no código de resposta do host.| |note|String|Não|Texto adicional que é inserido como Nota. (pode ser o número da fatura)| |dni|String|Não|Número do Documento.| |qrId|String|Não|Identificador QrCode gerado pelo terminal de captura.| |operationMethod|Integer|Não|Filtra transações segundo a forma de operação. Admita os seguintes valores: 0 - Apenas com cartão físico (ler ou datilografado); 1 - Somente com QrCode.| |appTransactionId|String|Não|Identificador da transação integrada para o software. O Identificador referido é aquele utilizado na aplicação que originou a solicitação de pagamento.|
Retorno
A consulta de pagamentos, retorna os pagamentos que obedecerem aos filtros informados, e os estornos associados a eles (inclusive estornos negados).
Os filtros informados são aplicados apenas aos campos dos pagamentos.
A lista de pagamentos retornados deve estar ordenada de forma ascendente pelo campo date do pagamento.
Em cada pagamento, a lista de estornos retornados deve estar ordenada de forma ascendente pelo campo date do estorno. Não retorna devoluções não referenciadas.
|Nome|Tipo|Descrição| | :- | :- | :- | |id|String|Identificador da transação para a aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento.| |value|BigDecimal|Valor do pagamento. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro, pois há adquirentes que, para algumas situações, aprovam valores diferentes dos solicitados.| |paymentType|PaymentType|Tipo de pagamento (Débito, Crédito, Voucher, etc.).| |installments|Integer|Quantidade de parcelas do pagamento.| |acquirerName|String|Adquirente que autorizou o pagamento.| |cardBrand|String|Bandeira do cartão.| |cardBin|String|BIN do cartão.| |cardPanLast4Digits|String|Últimos 4 dígitos do PAN do cartão.| |captureType|CaptureType|Forma de captura do cartão.| |status|PaymentStatus|Situação do pagamento.| |date|Date|Data/hora do pagamento para a aplicação de pagamentos.| |acquirerId|String|Identificador da transação para a adquirente. Este é o identificador que consta no arquivo que a adquirente fornece (EDI). Desta forma, é possível realizar a conciliação do pagamento com a transação integrada.| |acquirerResponseCode|String|Código de resposta da adquirente.| |acquirerResponseDate|String|Data/hora retornada pela adquirente.| |acquirerAuthorizationNumber|String|Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão).| |clientVia|String|Conteúdo do comprovante - via do cliente.| |merchantVia|String|Conteúdo do comprovante - via do estabelecimento.| |additionalValueType|AdditionalValueType|Presente apenas quando existe um valor adicional no contexto da transação executada.| |additionalValue|BigDecimal|Presente apenas quando existe um valor adicional no contexto da transação executada.| |accountTypeId|String|Presente apenas quando existe um tipo de conta no contexto da transação executada.| |planId|String|Presente apenas quando existe um plano no contexto da transação executada.| |productShortName|String|Identificador de produto, retorna apenas transações de um produto.| |batchNumber|String|Número de lote.| |nsuTerminal|String|NSU gerado pelo terminal para a transação.| |cardHolderName|String|Nome do cliente no cartão.| |lastTrx|Boolean|Indica ‘true’ se é a última transação aprovada, e ‘falso’ caso contrário.| |terminalId|String|Identificação do terminal.| |originalValue|BigDecimal|Valor original da venda. Presente em pagamentos com QrCode, cujo beneficio foi aplicado ao valor da venda.| |appTransactionId|String|Identificador de transação para o aplicativo de pagamento. Esta é a informação que será usada para confirmar e desfazer o pagamento.| |acquirerNsu|String|NSU Adquirente para consulta e identificação de transações.| |ticketNumber|String|ticketNumber gerado pelo terminal para a transação.| |acquirerAdditionalMessage|String|Mensagem adicional enviada pela adquirente na resposta da transação.| |note|String|Texto adicional que é inserido como Nota. (pode ser o número da fatura)| |dni|String|Número do Documento.| |qrId|String|Identificador QrCode gerado pelo terminal de captura.| |ErrorData.paymentsResponseCode|String|Código de resposta para o erro que ocorreu. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Mensagem descritiva da causa da não autorização. Se a transação foi negada pela adquirente, conterá a mensagem retornada pela adquirente.|
EXEMPLO DE RETORNO QUANDO DOIS PAGAMENTOS OBEDECEM AOS CRÍTERIOS INFORMADOS
As estruturas “payment” e “reversals” são as mesmas usadas na consulta de última transação aprovada e confirmada;
|[
{
“payment”: {
…
},
“reversals”: [
{
…
},
{
…
},
{
…
}
]
},
{
“payment”: {
…
},
“reversals”: [
{
…
},
{
…
},
{
…
}
]
}
]|
| :- |
|Info| | :-: |
É possível customizar quais informações estarão presentes na resposta. Para isso, deve ser passado um array de Strings com as colunas desejadas para o método query() do Content Resolver. Caso use a API de acesso ao provider, pode utilizar o método setColumns() do PaymentProviderRequest.
|Info| | :-: |
Para facilitar o uso, são disponibilizadas classes de acesso ao provider:
● PaymentProviderRequest
● PaymentProviderApi
● PaymentContract
EXEMPLO
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.jakewharton.threetenabp.AndroidThreeTen;import java.math.BigDecimal;import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentStatus;
import br.com.phoebus.android.payments.api.provider.PaymentContract;
import br.com.phoebus.android.payments.api.provider.PaymentProviderApi;
import br.com.phoebus.android.payments.api.provider.PaymentProviderRequest;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
AndroidThreeTen.init(getApplication());
}
@Override
public void onClick(View view) {
doExecute();
}
public void doExecute() {
//definindo as credenciais
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion(“1.0”);
//criando objeto de request para o payment content provider
PaymentProviderRequest request = createRequest(applicationInfo);
//selecionando propriedades retornadas
String[] columns = new String[]{
PaymentContract.column.ID,
PaymentContract.column.VALUE,
PaymentContract.column.PAYMENT_STATUS,
PaymentContract.column.PAYMENT_DATE,
PaymentContract.column.CARD_BRAND,
};
try {
//solicitando a lista de pagamentos
request.setColumns(columns);
List paymentsList = PaymentProviderApi.create(this).findAllTransactions(request);
//********* Outra forma de realizar a consulta ******************************************
// Cursor cursor = getApplicationContext().getContentResolver().query(request.getUriBuilder().build(), columns, null, null, null);
// List paymentsList = Payment.fromCursor(cursor);
//***************************************************************************************
Toast.makeText(this, paymentsList.size()+””, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
}
private PaymentProviderRequest createRequest(ApplicationInfo appInfo) {
PaymentProviderRequest paymentRequest = new PaymentProviderRequest();
paymentRequest.setApplicationInfo(appInfo);
//filtrando pelo paymentId
paymentRequest.setPaymentId(“000000000”);
//filtrando por período
SimpleDateFormat isoFormat = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss.SSS”);
isoFormat.setTimeZone(TimeZone.getTimeZone(“UTC”));
try {
Date dateStart = isoFormat.parse(“2020-04-06T00:00:00.000”);
Date dateFinish =isoFormat.parse(“2020-04-06T23:59:59.000”);
paymentRequest.setStartDate(dateStart);
paymentRequest.setFinishDate(dateFinish);
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
//filtrando por faixa de valores de pagamento
paymentRequest.setStartValue(new BigDecimal(“0.00”));
paymentRequest.setFinishValue(new BigDecimal(“1000.00”));
//filtrando pelos 4 últimos dígitos do cartão
paymentRequest.setLastDigits(“9636”);
//filtrando pelos 4 últimos dígitos do cartão
List status = Arrays.asList(new PaymentStatus[]{
PaymentStatus.PENDING,
PaymentStatus.CONFIRMED,
PaymentStatus.CANCELLED,
PaymentStatus.REVERSED
});
return paymentRequest;
}
}|
| :- |
—–
Consulta da Última transação aprovada via API
Esta é uma consulta via Content Provider que possibilita que outros aplicativos possam consultar informações sobre a última transação aprovada.
A última transação confirmada pode ser um pagamento, um estorno ou uma devolução não referenciada. Não possui filtros. Retorna a estrutura completa de pagamentos + estornos (aprovados ou negados). Pode retornar vazia se não houver transações aprovadas no terminal.
Integração com Aplicação de Pagamentos via Content Provider
Só será permitido listar pagamentos feitos pela própria aplicação que está realizando a consulta.
Declare essa permissão no AndroidManifest.xml do seu Aplicativo para ter acesso ao Content Provider.
content://br.com.phoebus.android.payments.provider/payments/lastTransactions
URI (Uniform Resource Identifier) para obtenção de informações da última transação aprovada.
Para realizar o request da consulta por período entre datas é necessário adicionar essa dependência.
implementation ‘com.jakewharton.threetenabp:threetenabp:1.0.3’
Parâmetros de entrada
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |applicationId|Credentials|Sim|Identificação da aplicação que está realizando a consulta.| |secretToken|Credentials|Sim|Token de acesso da aplicação que está realizando a consulta.| |softwareVersion|String|Sim|Versão da aplicação que está solicitando a consulta.|
Estrutura Retornada
● Quando a Última transação aprovada é um pagamento, é retornado o objeto de pagamento e a lista de todos os estornos associados a ele;
● Quando a Última transação aprovada é um estorno, é retornado o objeto de estorno, o pagamento associado a esse estorno, e, caso existam, outros estornos associados ao mesmo pagamento;
● Quando a Última transação aprovada é uma devolução não referenciada, é retornado o objeto Refund.
A estrutura retornada segue conforme os exemplos abaixo:
Exemplo quando a última transação é um pagamento
Todos Campos de retorno dos objetos estão disponíveis na estrutura retornada. O último pagamento confirmado será identificado através do campo “lastTrx”: true.
|{
“payment”:{
“id”:””,
“value”:50,
“captureType”:”MANUAL”,
“status”:”CONFIRMED”,
“date”:”01/06/2023 10:45”,
“nsuTerminal”:123,
“lastTrx”:true
…
},
“reversals”:[
{
…
}
]
}|
| :- |
Exemplo quando a última transação é um estorno
Todos Campos de retorno dos objetos estão disponíveis na estrutura retornada.
O último estorno confirmado será identificado através do campo “lastTrx”: true.
|{
“payment”:{
…
},
“reversals”:[
{
“paymentId”:””,
“value”:50,
“captureType”:”MANUAL”,
“status”:”CONFIRMED”,
“date”:”01/06/2023 10:45”,
“lastTrx”:true
…
}
]
}|
| :- |
Exemplo quando a última transação é uma devolução não referenciada
Todos Campos de retorno dos objetos estão disponíveis na estrutura retornada.
A último Devolução não referenciada confirmado será identificado através do campo “lastTrx”: true.
|{
“refund”:{
“id”:””,
“value”:50,
“captureType”:”MANUAL”,
“status”:”CONFIRMED”,
“date”:”01/06/2023 10:45”,
“nsuTerminal”:123,
“lastTrx”:true,
…
}
}|
| :- |
|Info| | :-: |
Para facilitar o uso, são disponibilizadas classes de acesso ao provider:
● PaymentProviderApi
EXEMPLO
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.jakewharton.threetenabp.AndroidThreeTen;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Arrays;import java.util.Date;
import java.util.List;
import java.util.TimeZone;import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentStatus;
import br.com.phoebus.android.payments.api.provider.PaymentContract;
import br.com.phoebus.android.payments.api.provider.PaymentProviderApi;
import br.com.phoebus.android.payments.api.provider.PaymentProviderRequest;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
AndroidThreeTen.init(getApplication());
}
@Override
public void onClick(View view) {
doExecute();
}
public void doExecute() {
//definindo as credenciais
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion(“1.0”);
try {
//solicitando a última transação
ProviderResponse lastTransaction = PaymentProviderApi.create(this).findLastTransaction(applicationInfo);
Toast.makeText(this, lastTransaction.size()+””, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
}
}|
| :- |
—–
Consultar Informações do Terminal
A PayStore também disponibiliza um recurso para consultar as informações de um determinado ponto de venda (POS), como id do terminal, id do lojista, entre outros.
A classe TerminalInfoContract é responsável por prover essas informações.
Retorno
|Nome|Tipo|Descrição| | :- | :- | :- | |merchantId|String|Identificador do lojista| |merchantName|String|Nome do lojista| |merchantCommercialName|String|Razão Social do lojista| |nationalId|String|Identificador do lojista (CPF, CNPJ)| |terminalId|String|Identificador do terminal| |postalCode|String|Código postal do lojista| |street|String|Logradouro do lojista| |city|String|Cidade do lojista| |state|String|Estado do lojista| |stateAbbreviation|String|Abreviação do nome do estado do lojista| |country|String|País do lojista| |complement|String|Complemento de endereço do lojista| |neighbourhood|String|Bairro do lojista| |addressNumber|String|Número do endereço do lojista| |merchantWebsite|String|Site do lojista| |merchantEmail|String|Endereço de e-mail do lojista| |merchantPhone|String|Número de telefone do lojista| |merchantCategoryCode|String|Código de categoria do lojista (MCCs)| |merchantNationalType|String|Tipo de Lojista|
Segue, abaixo, um exemplo de sua implementação:
|package com.myapplication.controller;import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;import br.com.phoebus.android.payments.api.provider.TerminalInfoContract;public class TerminalInfoController {
private Context context;
public TerminalInfoController(Context context) {
this.context = context;
}
public TerminalInfo getTerminalInfo() {
Uri.Builder uriBuilder = TerminalInfoContract.getUriBuilder();
ContentResolver resolver = context.getContentResolver();
try {
Cursor query = resolver.query(uriBuilder.build(), null, null, null, null);
if (query != null && query.moveToFirst()) {
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MERCHANT_ID)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MERCHANT_NAME)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MERCHANT_COMMERCIAL_NAME)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.NATIONAL_ID)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.TERMINAL_ID)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MC_POSTAL_CODE)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MC_STREET)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MC_CITY)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MC_STATE)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MC_STATE_ABBREVIATION)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MC_COUNTRY)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MC_COMPLEMENT)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MC_NEIGHBOURHOOD)));
Log.d(query.getString(query.getColumnIndex(TerminalInfoContract.column.MC_ADDRESS_NUMBER)));
query.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return terminalInfo;
}
}|
| :- |
—–
Consultar Campos Adicionais da PayStore
A PayStore utiliza um poderoso recurso de passagem de parâmetros cadastrados no Servidor para serem utilizados pelos terminais, sem que seja necessário alterar a mensageria de Inicialização. Isso traz uma enorme flexibilidade para criação de novas funcionalidades nos apps.
Os Campos Adicionais (também chamados de Parâmetros) são informações que podem ser cadastradas no Portal da PayStore, podendo ser configurados para todos os lojistas e terminais do Facilitador, para um grupo de lojistas específico, para um lojista (afeta todos os terminais daquele lojista) ou para um terminal específico. Essas informações podem ser lidas por um aplicativo através de Providers.
A classe ConfigurationStoreContract é responsável por prover essas informações. Segue, abaixo, um exemplo de sua implementação:
|import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;import br.com.phoebus.android.payments.api.provider.ConfigurationStoreContract;public class ConfigController {
private Context context;
public ConfigController(Context context) {
this.context = context;
}
public String getProperty(String key) {
Uri.Builder uriBuilder = ConfigurationStoreContract.getUriBuilder();
uriBuilder.appendQueryParameter(ConfigurationStoreContract.column.KEY, key);
ContentResolver resolver = this.context.getContentResolver();
String value = null;
try (Cursor query = resolver.query(uriBuilder.build(), null, null, null, null)) {
if (query != null && query.moveToFirst()) {
value = query.getString(query.getColumnIndex(ConfigurationStoreContract.column.VALUE));
}
}
return value;
}
}|
| :- |
Para utilizar essa classe, basta usar a chave definida previamente nos Campos Adicionais como parâmetro, conforme abaixo:
|ConfigController config = new ConfigController(mContext);
String conteudoCampoAdicional = config.getProperty(“sua_chave”);|
| :-: |
—–
Broadcast
Integração com Aplicação de Pagamentos via Broadcast
Diferente das outras integrações, na integração via broadcast, outras aplicações podem receber notificações de que um pagamento ou um estorno foi efetuado. Esta informação é enviada pela aplicação de pagamentos via Broadcasts que podem ser recebidos por quaisquer aplicações que tenham interesse em saber da ocorrência de pagamentos ou estornos.
Actions
|Action|Extra| | :- | :- | |Intents.action.ACTION_AFTER_PAYMENT (br.com.phoebus.android.payments.AFTER_PAYMENT_FINISHED)|Intents.extra.EXTRA_PAYMENT_RETURN: Payment (vide startPaymentV2() ou documentação da classe.)| |Intents.action.ACTION_AFTER_REVERSAL (br.com.phoebus.android.payments.AFTER_PAYMENT_REVERSAL_FINISHED)|Intents.extra.EXTRA_PAYMENT_RETURN: ReversePayment (vide reversePaymentV2() ou documentação da classe.)| |Intents.action.ACTION_AFTER_SETTLEMENT (br.com.phoebus.android.payments.ACTION_AFTER_SETTLEMENT)|Intents.extra.EXTRA_SETTLEMENT_RETURN : SettlementBroadcastResponse, EXTRA_SETTLEMENT_RETURN_V2 : SettlementBroadcastResponse (ou vide documentação da classe.)|
Exemplo
|public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intents.action.ACTION_AFTER_PAYMENT)) {
Payment payment = DataUtils.fromBundle(Payment.class, intent.getExtras(), Intents.extra.EXTRA_PAYMENT_RETURN);
// Do something!
} else if (intent.getAction().equals(Intents.action.ACTION_AFTER_REVERSAL)) {
ReversePayment reversePayment = DataUtils.fromBundle(ReversePayment.class, intent.getExtras(), Intents.extra.EXTRA_PAYMENT_RETURN);
// Do something!
} else if (intent.getAction().equals(Intents.action.ACTION_AFTER_SETTLEMENT)) {
SettlementBroadcastResponse settlementBroadcastResponse = DataUtils.fromBundle(SettlementBroadcastResponse.class, intent.getExtras(), Intents.extra.EXTRA_SETTLEMENT_RETURN);
SettlementBroadcastResponseV2 settlementBroadcastResponseV2 = SettlementBroadcastResponseV2.fromBundle(intent.getBundleExtra(Intents.extra.EXTRA_SETTLEMENT_RETURN_V2));
// Do something!
}
}
}|
| :- |
—–
Resposta Broadcast Fechamento de Lote
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
succeeded | Boolean | Sim | Indica se houve êxito no fechamento de lote. Onde retorna false se houve erro no fechamento de lote e true se obteve sucesso no mesmo. |
response | SettleRequestResponse (DEPRECATED) | Não | Objeto de resposta para casos de sucesso no fechamento de lote. Note que em casos de erro, o mesmo não será retornado. (vide closeBatch() ou documentação da classe.) |
responseV2 | SettleRequestResponseV2 | Não | Objeto de resposta para casos de sucesso no fechamento de lote. Note que em casos de erro, o mesmo não será retornado. (vide closeBatch() ou documentação da classe.) |
error | ErrorData | Não | Objeto de resposta para casos de erro no fechamento de lote. Note que em casos de sucesso, o mesmo não será retornado. (vide closeBatch() ou documentação da classe.) |
Resposta Broadcast de Erros
Toda vez que ocorrer um erro no terminal o SDK Android envia um broadcast com as informações, o APP Diagnóstico processa e envia para o backend. O acesso a esses dados será realizado pelo servico de mensagens kafka pelo Tópico terminal-errors. Os endereços de brokers pode variar entre os ambientes, solicitar url para setor de operações.
Parâmetros
Nome | Tipo | Obrigatório | Descrição | Tamanho máximo dos campos |
---|---|---|---|---|
paymentsAppVersion | String | Sim | Versão do app suite de pagamentos. | 10 Caracteres |
timestamp | Date | Sim | Data e hora do erro. | |
errorType | ErrorType | Sim | Tipo de erro (ErrorType). | |
serial | string | Sim | Número de serie do terminal. | |
errorCode | String | Não | Código de erro (prefixo + identificador). | 6 Caracteres |
errorMessage | String | Não | Mensagem do erro. | 255 Caracteres |
breadcrumbs | String | Não | Caminho de ações acionadas pelo usuário da tela inicial até o momento do erro. | 4096 Caracteres |
subAcquirerId | String | Não | Código do facilitador Paystore ao qual o terminal está associado. | 32 Caracteres |
merchantPaystore | String | Não | Lojista na PayStore. | 32 Caracteres |
terminalID | String | Não | Número lógico do terminal. | 8 Caracteres |
bCReturnCode | String | Não | Código de erro da BC. | 4 Caracteres |
stackTrace | String | Não | Lista as chamadas de método que levam ao lançamento da exceção, junto com os nomes de arquivo e números de linha em que as chamadas ocorreram. | 255 Caracteres |
bcCommands | List | Não | Lista os Comandos da BC. | |
bin | String | Não | BIN do cartão. | 6 Caracteres |
aid | String | Não | Identificador da Aplicação do Cartão. | 32 Caracteres |
value | BigDecimal | Não | Valor da transação. | |
installments | Integer | Não | Quantidade de parcelas do pagamento. | |
captureType | CaptureType | Não | Forma de captura do cartão. | |
cardServiceCode | String | Não | Código de Serviço do Cartão. | |
productId | Integer | Não | Identificador do produto. | |
paymentType | PaymentType | Não | Tipo de pagamento (Débito, Crédito, Voucher, etc.). | |
ticketNumber | String | Não | Número do cupom gerado pelo terminal para a transação. | 4 Caracteres |
batchNumber | String | Não | Número do lote. | 3 Caracteres |
endpoint | String | Não | Último endpoint utilizado pelo terminal antes do erro ocorrer. | 2048 Caracteres |
sdkMethod | String | Não | Método do SDK utilizado quando o erro ocorreu. | 255 Caracteres |
applicationName | String | Não | Nome da aplicação que usou o SDK. | 255 Caracteres |
httpStatusCode | String | Não | Código de erro HTTP. | 3 Caracteres |
transactionUuid | String | Não | UUID da transação. | 36 Caracteres |
devicdeName | String | Não | Modelo terminal. | |
lastBootDate | String | Não | Hora (timestamp) em que o terminal foi ligado. | |
batteryLevel | String | Não | Nível atual da bateria. | |
connectionType | String | Não | Tipo de conexão com a internet. | |
wifiLevel | String | Não | Intensidade do sinal Wi-fi. | |
isCharging | boolean | Não | Informa se o disponsitivo esta conectado e carregando. | |
osVersion | String | Não | Versão do sistema operacional. | |
kernelVersion | String | Não | Versão do kernel. |
ErrorType
Código | Nome | Descrição |
---|---|---|
1 | SCREEN_ERROR | Erros de tela |
2 | FATAL_EXCEPTION | FatalException |
3 | COMM_SERVER_ERROR | Falhas de comunicação ou servidor |
BCCommandType
Código | Nome | Descrição |
---|---|---|
1 | GET_CARD | Retorno do método getCard da BC |
2 | GO_ON_CHIP | Retorno do método getOnChip da BC |
3 | FINISH_CHIP | Retorno do método finishChip da BC |
BCCommand
Nome | Tipo | Obrigatório | Descrição | Tamanho Máximo dos campos |
---|---|---|---|---|
type | BCCommandType | Não | Tipo de comando (getCard, goOnChip ou finishChip) da BC. | |
input | String | Não | Entrada do comando (getCard, goOnChip ou finishChip) da BC. | 2048 Caracteres |
output | String | Não | Saída do comando (getCard, goOnChip ou finishChip) da BC. | - |
Realizar Inicialização
Inicia o processo de inicialização com a PayStore e com a Adquirente
Esse método deve ser chamado para fazer a inicialização do terminal com a Paystore e com a(s) adquirente(s) instalada(s).
Métodos
Assinatura | Descrição |
---|---|
void startInitialization(String activityAction, PaymentCallback paymentCallback) | Inicia o processo de inicialização com a Paystore e com a Adquirente. |
void startInitialization(InitializationRequest initializationRequest, PaymentCallback paymentCallback) | Inicia o processo de inicialização com a Paystore e com a Adquirente, utilizando InitializationRequest. |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
activityAction | String | Sim | Action da activity da aplicação externa que deve ser chamada após a inicialização ser concluída. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
initializationRequest | InitializationRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição da inicialização. |
paymentCallback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | ** | Método para notificação em caso de sucesso | |
onError | ** | Método para notificação em caso de erro. | |
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. |
request (InitializationRequest)
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |activityAction|String|Não|Action da aplicação externa que deve ser chamada após a inicialização ser concluída.| |installToken|String|Não|Token de Instalação para credenciamento do terminal na Paystore. Este parâmetro só será considerado na primeira inicialização do terminal.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
private String action = “br.com.phoebus.payments.demo.ACTION_INITIALIZE”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
InitializationRequest request = new InitializationRequest();
request.setInstallToken(“1a2b3cdef”);
request.setActivityAction(“123456abcde”);
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
try {
paymentClient.startInitialization(request, this);
} catch (ClientException e) {
Log.e(TAG, “Error while initialization.”, e);
}
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, “Error: “ + errorData.getResponseMessage());
}
@Override
public void onSuccess(Object data) {
Log.i(TAG, “Success!”);
}
}|
| :- |
—–
Enviar Pagamentos
Faz o envio dos pagamentos para a Paystore
Esse método deve ser chamado para enviar os pagamentos do terminal para a Paystore.
Métodos
Assinatura | Descrição |
---|---|
void startPushPayments(PaymentCallback paymentCallback) | Faz o envio dos pagamentos para a Paystore. |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
try {
paymentClient.startPushPayments(this);
} catch (ClientException e) {
Log.e(TAG, “Error while sending payments to Paystore.”, e);
}
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, “Error: “ + errorData.getResponseMessage());
}
@Override
public void onSuccess(Object data) {
Log.i(TAG, “Success!”);
}
}|
| :- |
—–
**Checagem de Notificações
Verifica se há notificações na Paystore.**
Esse método deve ser chamado para checar se há alguma notificação pendente da Paystore para o terminal.
Métodos
Assinatura | Descrição |
---|---|
void getNotifications(PaymentCallback paymentCallback) | Verifica se há notificações na Paystore. |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
try {
paymentClient.getNotifications(this);
} catch (ClientException e) {
Log.e(TAG, “Error while checking notifications.”, e);
}
}
@Override
public void onError(Object data) {
Log.e(TAG, “Error: “ + errorData.getResponseMessage());
}
@Override
public void onSuccess(Object data) {
Log.i(TAG, “Success!”);
}
}|
| :- |
—–
**Fechamento de Lote
[DEPRECATED] Sincroniza as transações e fecha o lote atual.**
Esse método deve ser chamado para executar o fechamento de lote e envio do mesmo.
Métodos
Assinatura | Descrição |
---|---|
void closeBatch(SettlementRequest settlementRequest, PaymentCallback paymentCallback) | Sincroniza as transações e fecha o lote atual. |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | SettlementRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição do fechamento de lote. Note que nem todos os parâmetros são obrigatórios. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de fechamento de lote. |
Detalhe dos parâmetros request (SettlementRequest)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String | Sim | Versão da aplicação que está solicitando o pagamento. |
printMerchantReceipt | Boolean | Não | Indica se o comprovante do estabelecimento deve ser impresso ou não. |
(DEPRECATED: Utilizar SettlementCallbackV2)
callback (SettlementCallback)
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso.| |Settlement.Receipt.merchantVia|String|Sim|Retorna um comprovante da adquirente com as informações do fechamento de lote.| |Settlement.BatchNumber|String|Sim|Número de lote.| |acquirerResponseCode|String|Sim|Código de resposta do host.| |terminalId|String|Sim|Identificação do terminal| |acquirerAdditionalMessage|String|Não|Mensagem enviada no campo 63 de resposta EPS, para ser impressa ou exibida no final do fluxo transacional. O aplicativo de pagamentos permanece responsável por exibir na tela ou verificar o conteúdo presente neste campo, mas também deve enviar o valor recebido para a aplicação integrada para que ela possa aplicar suas regras de negócios baseadas no conteúdo deste campo.| |onError| | |Método para notificação em caso de falha.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro que ocorreu. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Observe que apenas este erro será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Se a transação foi negada pela adquirente, conterá a mensagem retornada pela adquirente.| |acquirerAdditionalMessage|String|Não**|Mensagem enviada no campo 63 de resposta EPS, para ser impressa ou exibida no final do fluxo transacional. O aplicativo de pagamentos permanece responsável por exibir na tela ou verificar o conteúdo presente neste campo, mas também deve enviar o valor recebido para a aplicação integrada para que ela possa aplicar suas regras de negócios baseadas no conteúdo deste campo.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
SettlementRequest settlementRequest = new SettlementRequest();
settlementRequest.setApplicationInfo(appInfo);
settlementRequest.setPrintMerchantReceipt(true);
try {
paymentClient.closeBatch(settlementRequest, this);
} catch (ClientException e) {
Log.e(TAG, “Error while closing batch.”, e);
}
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, “Error: “ + errorData.getResponseMessage());
}
@Override
public void onSuccess(Settlement settlement) {
Log.i(TAG, “Success!”);
}
}|
| :- |
—–
Sincroniza as transações e fecha o lote atual.
Esse método deve ser chamado para executar o fechamento de lote e envio do mesmo.
Métodos
Assinatura | Descrição |
---|---|
void closeBatchV2(SettlementRequest settlementRequest, PaymentCallbackV2 paymentCallbackV2) | Sincroniza as transações e fecha o lote atual. |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | SettlementRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição do fechamento de lote. Note que nem todos os parâmetros são obrigatórios. |
callback | PaymentCallbackV2 | Sim | Interface que será executada para notificações de sucesso ou erro do processo de fechamento de lote. |
Detalhe dos parâmetros request (SettlementRequest)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String | Sim | Versão da aplicação que está solicitando o pagamento. |
printMerchantReceipt | Boolean | Não | Indica se o comprovante do estabelecimento deve ser impresso ou não. |
(Disponível a partir da versão(.aar) v3.1.4.0)
callback (SettlementCallbackV2)
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso.| |Settlement.Receipt.merchantVia|String|Sim|Retorna um comprovante da adquirente com as informações do fechamento de lote.| |Settlement.BatchNumber|String|Sim|Número de lote.| |acquirerResponseCode|String|Sim|Código de resposta do host.| |terminalId|String|Sim|Identificação do terminal| |acquirerAdditionalMessage|String|Não|Mensagem enviada no campo 63 de resposta EPS, para ser impressa ou exibida no final do fluxo transacional. O aplicativo de pagamentos permanece responsável por exibir na tela ou verificar o conteúdo presente neste campo, mas também deve enviar o valor recebido para a aplicação integrada para que ela possa aplicar suas regras de negócios baseadas no conteúdo deste campo.| |batchClosureDate|Date|Não|Data e hora do fechamento de lote.| |batchReports|List|Não|Lista de transações por adquirentes.| |totalReportInfos|List|Não|Lista com os dados de pagamentos totais.| |onError| | |Método para notificação em caso de falha.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro que ocorreu. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Observe que apenas este erro será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Se a transação foi negada pela adquirente, conterá a mensagem retornada pela adquirente.| |ErrorData.acquirerAdditionalMessage|String|Não|Mensagem enviada no campo 63 de resposta EPS, para ser impressa ou exibida no final do fluxo transacional. O aplicativo de pagamentos permanece responsável por exibir na tela ou verificar o conteúdo presente neste campo, mas também deve enviar o valor recebido para a aplicação integrada para que ela possa aplicar suas regras de negócios baseadas no conteúdo deste campo.| |ErrorDataV2.errorMessage|String|Não**|Mensagem descritiva da causa da não autorização. Este campo é exclusivo para a mensagem de erro|
BatchReport
|Nome|Tipo|Descrição| | :- | :- | :- | |transactionReportInfo|List|Lista com agrupamento das transações.| |parcelReportInfo|List|Lista com agrupamento das transações por parcela.|
BatchReportInfo
|Nome|Tipo|Descrição (Transaction)|Descrição (Parcel)|
| :- | :- | :- | :- |
|item|String|Tipo de transação
0 - Compra;
1 - Devolução;
2 - Anulação de compra;
3 - Extração;
4 - Anulação de Extração.|Quantidade de parcelas.|
|quantity|Integer|Quantidade de transações pelo tipo de transação.|Quantidade de transações da mesma parcela.|
|installments|Integer| | |
|value|BigDecimal|Soma dos valores do tipo de transação.|Soma dos valores da mesma parcela.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
SettlementRequest settlementRequest = new SettlementRequest();
settlementRequest.setApplicationInfo(appInfo);
settlementRequest.setPrintMerchantReceipt(true);
try {
paymentClient.closeBatchV2(settlementRequest, this);
} catch (ClientException e) {
Log.e(TAG, “Error while closing batch.”, e);
}
}
@Override
public void onError(ErrorDataV2 errorDataV2) {
Log.e(TAG, “Error: “ + errorDataV2.getResponseMessage());
}
@Override
public void onSuccess(Settlement settlement) {
Log.i(TAG, “Success!”);
}
}|
| :- |
—–
Devolução não Referenciada
[DEPRECATED] Realiza o processo de devolução não referenciada.
Esse método deve ser chamado para executar a devolução não referenciada.
Métodos
Assinatura | Descrição |
---|---|
void refundPayment(RefundRequest settlementRequest, PaymentCallback paymentCallback) | Realiza o processo de devolução não referenciada. (DEPRECATED: Utilizar refundPaymentV2) |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | RefundRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição da devolução não referenciada. Note que nem todos os parâmetros são obrigatórios. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de devolução. |
Detalhe dos parâmetros request (RefundRequest) (DEPRECATED: Utilizar RefundRequestV2)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
value | BigDecimal | Não | Valor da devolução não referenciada. Caso não seja preenchido (null), ou seja preenchido com 0 (zero), o App de Pagamento deve solicitar o valor ao operador. |
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String | Não | Versão da aplicação que está solicitando o pagamento. |
printMerchantReceipt | Boolean | Não | Indica se o comprovante do estabelecimento deve ser impresso ou não. O valor padrão é false, isto é, o comprovante não é impresso. |
printCustomerReceipt | Boolean | Não | Indica se o comprovante do cliente deve ser impresso ou não. O valor padrão é false, isto é, o comprovante não é impresso. |
productShortName | String | Não | Quando preenchido, após a leitura do cartão e identificação do produto de bandeira, caso não corresponda a productShortName do produto em questão, o terminal deve exibir um erro em tela e encerrar a transação. Exemplos: VI=VISA, MC=MASTERCARD, AX=AMEX |
appTransactionId | String | Não | Identificador da transação integrada para o software. O Identificador referido é aquele utilizado na aplicação que originou a solicitação de devolução. Não deve se repetir. |
callback (RefundCallback)
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |Refund.acquirerId|String|Sim|ID da adquirente.| |Refund.refundId|String|Sim|ID da devolução.| |Refund.productShortName|String|Sim|Corresponde ao productShortName correspondente ao produto de bandeira do contexto da transação.| |Refund.batchNumber|String|Sim|ID do lote ao qual a transação pertence.| |Refund.nsuTerminal|String|Sim|NSU gerado pelo terminal para a transação. Os 4 dígitos mais à direita correspondem ao Ticket Number. Esse NSU é informado pelo terminal para o PhAST no parâmetro “merchantTransactionId”.| |Refund.acquirerResponseCode|String|Sim|Código de resposta da adquirente.| |Refund.acquirerResponseDate|Date|Sim|Data/hora retornada pela adquirente.| |Refund.acquirerAuthorizationNumber|String|Sim|Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão).| |Refund.Receipt.merchantVia|String|Não|Conteúdo do comprovante - via do estabelecimento. Cópia lojista| |Refund.Receipt.clientVia|String|Não|Conteúdo do comprovante - via do cliente. Cópia cliente| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim**|Mensagem descritiva da causa do erro.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
RefundRequest refundRequest = new RefundRequest();
refundRequest.setApplicationInfo(appInfo);
refundRequest.setPrintMerchantReceipt(true);
try {
paymentClient.refundPayment(refundRequest, this);
} catch (ClientException e) {
Log.e(TAG, “Error starting devolution”, e);
}
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, “Error: “ + errorData.getResponseMessage());
}
@Override
public void onSuccess(Refund refund) {
Log.i(TAG, “Success!”);
}
}|
| :- |
—–
Realiza o processo de devolução não referenciada
Esse método deve ser chamado para executar a devolução não referenciada.
A partir da versão 3.1.5.0
Quando uma transação é feita, anteriormente, poderia ser confirmado realizando sua impressão (ou via printReceipt), ou ao realizar uma nova transação. Agora, o estorno também pode ser confirmado ao usar o novo parâmetro autoConfirm - indicando se deve ou não confirmar independente da impressão - ou utilizando o novo método confirmReversePayment().
Métodos
|Assinatura|Descrição| | :- | :- | |void refundPaymentV2(RefundRequestV2 settlementRequest, PaymentCallback paymentCallback)|Realiza o processo de devolução não referenciada.| |void confirmReversePayment(String paymentId, PaymentCallback paymentCallback)|Confirma uma autorização de devolução não autorizada realizada anteriormente.| |void cancelReversePayment(String paymentId, PaymentCallback paymentCallback)|Desfaz uma solicitação devolução não referenciada.|
refundPaymentV2()
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | RefundRequestV2 | Sim | Objeto de transferência de dados que conterá as informações da requisição da devolução não referenciada. Note que nem todos os parâmetros são obrigatórios. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de devolução. |
Detalhe dos parâmetros request (RefundRequestV2)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
value | BigDecimal | Não | Valor da devolução não referenciada. Caso não seja preenchido (null), ou seja preenchido com 0 (zero), o App de Pagamento deve solicitar o valor ao operador.O valor deverá ser formatado com duas casas decimais. |
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String | Não | Versão da aplicação que está solicitando o pagamento. |
printMerchantReceipt | Boolean | Não | Indica se o comprovante do estabelecimento deve ser impresso ou não. O valor padrão é false, isto é, o comprovante não é impresso. |
printCustomerReceipt | Boolean | Não | Indica se o comprovante do cliente deve ser impresso ou não. O valor padrão é false, isto é, o comprovante não é impresso. |
productShortName | String | Não | Quando preenchido, após a leitura do cartão e identificação do produto de bandeira, caso não corresponda a productShortName do produto em questão, o terminal deve exibir um erro em tela e encerrar a transação. Exemplos: VI=VISA, MC=MASTERCARD, AX=AMEX |
appTransactionId | String | Não | Identificador da transação integrada para o software. O Identificador referido é aquele utilizado na aplicação que originou a solicitação de devolução. Não deve se repetir. |
previewMerchantReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do estabelecimento deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
previewCustomerReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do cliente deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
autoConfirm (v3.1.5.0) | Boolean | Não | Indica se a transação deve ser confirmada automaticamente.Valores possíveis:1. null (padrão) : confirma automaticamente caso ocorra a impressão do comprovante.2. true : confirma automaticamente independente da regra de impressão.3. false : não confirma automaticamente, ficando pendente aguardando confirmação. |
callback (RefundCallback)
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |Refund.acquirerId|String|Sim|ID da adquirente.| |Refund.refundId|String|Sim|ID da devolução.| |Refund.productShortName|String|Sim|Corresponde ao productShortName correspondente ao produto de bandeira do contexto da transação.| |Refund.batchNumber|String|Sim|ID do lote ao qual a transação pertence.| |Refund.nsuTerminal|String|Sim|NSU gerado pelo terminal para a transação. Os 4 dígitos mais à direita correspondem ao Ticket Number. Esse NSU é informado pelo terminal para o PhAST no parâmetro “merchantTransactionId”.| |Refund.acquirerResponseCode|String|Sim|Código de resposta da adquirente.| |Refund.acquirerResponseDate|Date|Sim|Data/hora retornada pela adquirente.| |Refund.acquirerAuthorizationNumber|String|Sim|Número da autorização fornecido pela adquirente (consta no comprovante do cliente Portador do Cartão).| |Refund.Receipt.merchantVia|String|Não|Conteúdo do comprovante - via do estabelecimento. Cópia lojista| |Refund.Receipt.clientVia|String|Não|Conteúdo do comprovante - via do cliente. Cópia cliente| | | | | | |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa do erro.|
confirmReversePayment()
Este método deve ser chamado para confirmar uma devolução não referenciada que o terminal conseguiu processar completamente a perna de autorização enviada pelo Autorizador.
Este método não deve ser chamado para uma devolução não referenciada já confirmado, ou seja, em que já se executou o método confirmReversePayment() anteriormente.
Este método não deve ser chamado para uma devolução não referenciada já desfeito, ou seja, em que já se executou o método cancelReversePayment() anteriormente.
Este método não deve ser chamado para uma devolução não referenciada que foi negada pelo Autorizador, ou seja, a transação precisa ter sido autorizada pelo Autorizador.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será confirmada. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
cancelReversePayment()
Este método deve ser chamado para desfazer uma devolução não referenciada anteriormente autorizada. Esta transação deve não ter sido desfeita ainda e deve ter sido autorizada (não negada) previamente.
Como dito na descrição de reversePayment(), é possível que não haja desfazimento para uma devolução não referenciada para uma determinada adquirente. Assim, o método cancelReversePayment() pode retornar um erro específico informando que não é possível executar tal operação (vide Códigos de Resposta).
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será desfeita. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
RefundRequestV2 refundRequestV2 = new RefundRequestV2();
refundRequestV2.setApplicationInfo(appInfo);
refundRequestV2.setPrintMerchantReceipt(true);
try {
paymentClient.refundPaymentV2(refundRequestV2, this);
} catch (ClientException e) {
Log.e(TAG, “Error starting devolution”, e);
}
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, “Error: “ + errorData.getResponseMessage());
}
@Override
public void onSuccess(Refund refund) {
Log.i(TAG, “Success!”);
}
}|
| :- |
—–
**Devolução Referência sem Payment
Realiza o processo de anulação/devolução referenciada sem paymentId**
Esse método deve ser chamado para executar a anulação/devolução referenciada sem paymentId.
A partir da versão 3.1.5.0
Quando uma transação é feita, anteriormente, poderia ser confirmado realizando sua impressão (ou via printReceipt), ou ao realizar uma nova transação. Agora, o estorno também pode ser confirmado ao usar o novo parâmetro autoConfirm - indicando se deve ou não confirmar independente da impressão - ou utilizando o novo método confirmReversePayment().
Métodos
|Assinatura|Descrição| | :- | :- | |void reversePaymentWithFilter(ReversePaymentFilterRequest settlementRequest, PaymentCallback paymentCallback)|Realiza o processo de anulação/devolução referenciada sem paymentId.| |void confirmReversePayment(String paymentId, PaymentCallback paymentCallback)|Confirma uma autorização de estorno de pagamento realizada anteriormente.| |void cancelReversePayment(String paymentId, PaymentCallback paymentCallback)|Desfaz uma solicitação de estorno de pagamento.|
reversePaymentWithFilter()
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | ReversePaymentFilterRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição da anulação/devolução referenciada sem paymentId. Note que nem todos os parâmetros são obrigatórios. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de anulação/devolução. |
Detalhe dos parâmetros request (ReversePaymentFilterRequest)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
value | BigDecimal | Não | Valor da transação a ser devolvida. Caso não seja preenchido (null), ou seja preenchido com 0 (zero), o App de Pagamento deve solicitar o valor ao operador. |
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String | Sim | Versão da aplicação que está solicitando o pagamento. |
printMerchantReceipt | Boolean | Não | Indica se o comprovante do estabelecimento deve ser impresso ou não. O valor padrão é false, isto é, o comprovante não é impresso. |
printCustomerReceipt | Boolean | Não | Indica se o comprovante do cliente deve ser impresso ou não. O valor padrão é false, isto é, o comprovante não é impresso. |
operationMethod | Integer | Não | Indica o método de operação (QR ou Card) usado para o pagamento original. Admita o seguintes valores: 0 - Apenas com cartão físico (ler ou datilografado); 1 - Somente com QRCode; Se não for relatado, modos de disponível no terminal capturar. |
productShortName | String | Não | Quando preenchido, após a leitura do cartão e identificação do produto de bandeira, caso não corresponda a productShortName do produto em questão, o terminal deve exibir um erro em tela e encerrar a transação. Exemplos: VI=VISA, MC=MASTERCARD, AX=AMEX |
ticketNumber | String | Não | Indica o número do cupom, após a transação de pagamento realizada com um cartão físico. |
originalQRId | String | Não | Identificador QrCode gerado pelo terminal de captura. Quando a transação de pagamento é realizada através de Código QR |
Payment.paymentDate | Date | Não | Indica a data/hora de pagamento para o App de Pagamentos. Quando a transação de pagamento não é conhecido pelo terminal de captura, ou seja, foi feito em outro terminal. |
previewMerchantReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do estabelecimento deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
previewCustomerReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do cliente deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
autoConfirm (v3.1.5.0) | Boolean | Não | Indica se a transação deve ser confirmada automaticamente.Valores possíveis:1. null (padrão) : confirma automaticamente caso ocorra a impressão do comprovante.2. true : confirma automaticamente independente da regra de impressão.3. false : não confirma automaticamente, ficando pendente aguardando confirmação. |
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |ReversePayment.paymentId|String|Sim|ID da transação de reversão.| |ReversePayment.acquirerId|String|Sim|ID da Adquirente.| |ReversePayment.cancelable|Boolean|Sim|Retorna se a transação pode ser desfeita(true) ou não(false).| |ReversePayment.acquirerResponseCode|String|Sim|Código de resposta da Adquirente.| |ReversePayment.acquirerResponseDate|String|Sim|Data/hora retornada pela adquirente.| |ReversePayment.acquirerAuthorizationNumber|String|Sim|Número de autorização fornecido pela adquirente (consta no comprovante do cliente portador do cartão).| |acquirerAdditionalMessage|String|Não|Mensagem adicional enviada pela adquirente na resposta da transação.| |ReversePayment.Receipt.clientVia|String|Não|Conteúdo do comprovante - via do cliente.| |ReversePayment.Receipt.merchantVia|String|Não|Conteúdo do comprovante - via do estabelecimento.| |batchNumber|String|Sim|Número do lote.| |nsuTerminal|String|Sim|NSU gerado pelo terminal para a transação. Os 4 dígitos mais à direita correspondem ao Ticket Number.| |cardholderName|String|Sim|Nome do cliente no cartão.| |cardBin|String|Sim|Primeros 6 dígitos do cartão.| |panLast4Digits|String|Sim|Últimos 4 dígitos do cartão.| |terminalId|String|Sim|Identificador do terminal.| |qrId|String|Não|Identificador QrCode gerado pelo terminal de captura.| | | | | | |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa do erro.| |acquirerAdditionalMessage|String|Não|Mensagem adicional enviada pela adquirente na resposta da transação.|
confirmReversePayment()
Este método deve ser chamado para confirmar um estorno que o terminal conseguiu processar completamente a perna de autorização enviada pelo Autorizador.
Este método não deve ser chamado para um estorno já confirmado, ou seja, em que já se executou o método confirmReversePayment() anteriormente.
Este método não deve ser chamado para um estorno já desfeito, ou seja, em que já se executou o método cancelReversePayment() anteriormente.
Este método não deve ser chamado para um estorno que foi negada pelo Autorizador, ou seja, a transação precisa ter sido autorizada pelo Autorizador.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será confirmada. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| | | | | | |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
cancelReversePayment()
Este método deve ser chamado para desfazer uma transação de estorno anteriormente autorizada. Esta transação deve não ter sido desfeita ainda e deve ter sido autorizada (não negada) previamente.
Como dito na descrição de reversePayment(), é possível que não haja desfazimento para a transação de estorno para uma determinada adquirente. Assim, o método cancelReversePayment() pode retornar um erro específico informando que não é possível executar tal operação (vide Códigos de Resposta).
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
paymentId | String | Sim | Identificador da transação que será desfeita. O Identificador referido é aquele utilizado na aplicação de pagamentos. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| | | | | | |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.acquirerResponseCode|String|Não|Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente.| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
ReversePaymentFilterRequest request = new ReversePaymentFilterRequest();
request.setApplicationInfo(appInfo);
request.setPrintMerchantReceipt(true);
try {
paymentClient.reversePaymentWithFilter(request, this);
} catch (ClientException e) {
Log.e(TAG, “Error starting devolution”, e);
}
}
@Override
public void onError(ErrorData errorData) {
Log.e(TAG, “Error: “ + errorData.getResponseMessage());
}
@Override
public void onSuccess(Refund refund) {
Log.i(TAG, “Success!”);
}
}|
| :- |
—–
Reimpressão
reprint()
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | ReprintRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição do pagamento. Note que nem todos os parâmetros são obrigatórios. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de pagamento. |
Detalle de los Parámetros
request (ReprintRequest)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String | Sim | Versão da aplicação que está solicitando o pagamento. |
ticketNumber | String | Não | Número do cupom. Se não for informado, será considerado o comprovante do último pagamento autorizado. |
Payment.paymentDate | Date | Não | Data/hora do pagamento para a aplicação de pagamentos.Se não for informado, será considerado o comprovante do último pagamento autorizado. |
callback (PaymentCallback)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | ** | Método para notificação em caso de sucesso | |
** | ** | ||
onError | ** | Método para notificação em caso de erro. | |
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta |
ErrorData.acquirerResponseCode | String | Não | Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente. |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. |
Impressão de comprovante
printReceipt()
Esse método deve ser chamado para realizar impressão do comprovante quando a transação for confirmada. Uma vez solicitado a impressão do comprovante com sucesso, só é permitido reimpressão.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | PrintReceiptRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição do pagamento. Note que nem todos os parâmetros são obrigatórios. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de pagamento. |
Detalhe dos Parâmetros
request (PrintReceiptRequest)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
ApplicationInfo.credentials | Credentials | Sim | Credenciais da aplicação que está solicitando a operação, conforme cadastro na PayStore. Basicamente, trata-se da identificação da aplicação e o token de acesso. |
ApplicationInfo.softwareVersion | String | Sim | Versão da aplicação que está solicitando o pagamento. |
paymentId | String | Sim | Identificador da transação para a aplicação de pagamentos. Esta é a informação a ser usada para a confirmação e desfazimento. |
printMerchantReceipt | Boolean | Não | Indica se o comprovante do estabelecimento deve ser impresso ou não. |
printCustomerReceipt | Boolean | Não | Indica se o comprovante do cliente deve ser impresso ou não. |
previewMerchantReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do estabelecimento deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
previewCustomerReceipt | Boolean | Não | Indica se a tela de pré-visualização do comprovante do cliente deve ser exibida após a confirmação da transação. O valor padrão é true, o que significa que o comprovante será exibido. |
callback (PaymentCallback)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
onSuccess | ** | Método para notificação em caso de sucesso | |
** | ** | ||
onError | ** | Método para notificação em caso de erro. | |
ErrorData.paymentsResponseCode | String | Sim | Código de resposta para o erro ocorrido. Vide Códigos de Resposta |
ErrorData.acquirerResponseCode | String | Não | Código de resposta para o erro ocorrido retornado pela adquirente. Note que este erro só será retornado se a transação não for autorizada pela adquirente. |
ErrorData.responseMessage | String | Sim | Mensagem descritiva da causa da não autorização. Caso a transação tenha sido negada pela adquirente, conterá a mensagem retornada pela adquirente. |
ErrorData.acquirerAdditionalMessage | String | Não | Mensagem adicional enviada pela adquirente na resposta da transação. |
Códigos de Resposta da Integração
|Código|Descrição|Operações| | :- | :- | :- | |01|Transação negada pela adquirente.|startPayment e startPaymentV2| |02|Transação negada pelo cartão.|startPayment e startPaymentV2| |03|Operação cancelada pelo operador.|startPayment, startPaymentV2, reversePayment e reversePaymentV2| |04|Pagamento não encontrado.|confirmPayment, cancelPayment, reversePayment, reversePaymentV2 e cancelReversePayment| |05|Operação não disponível na adquirente.|cancelReversePayment| |06|Problema na comunicação com o aplicativo de pagamento.|startPayment, startPaymentV2, reversePayment, reversePaymentV2, cancelPayment e confirmPayment| |07|Problema de comunicação com a adquirente.|Todas| |08|Credenciais Inválidas.|startPayment, startPaymentV2, reversePayment e reversePaymentV2| |09|Aplicativo de Pagamentos não possui permissões para continuar.|startPayment,startPaymentV2, reversePayment e reversePaymentV2| |10|Terminal Bloqueado.|startPayment, startPaymentV2, reversePayment e reversePaymentV2| |11|Pagamento bloqueado, pois existe transação pendente.|startPayment, startPaymentV2, reversePayment e reversePaymentV2| |12|Tema inválido|setTheme| |13|SERVIÇO OCUPADO, AGUARDE|confirmPayment cancelPayment| |14|Erro ao definir aplicativo principal|setMainApp| |15|A aplicação principal já está definida por campos adicionais|setMainApp| |16|Pagamento habilitado apenas via API|terminalFilterPayment| |17|Houve um problema ao extrair ou carregar os dados.|startExtraction| |18|Inicialização falhou.|startInitialization| |19|Um erro ocorreu ao checar as notificações.|getNotifications| |20|Houve um problema ao realizar o teste de comunicação.|startEchoTest| |21|Ocorreu um erro durante o fechamento de lote.|closeBatche closeBatchV2| |22|Operação não permitida.|Todas| |24|Transação com QRCode está pendente|startPayment, startPaymentV2, reversePayment e reversePaymentV2| |25|Ocorre quando o comprovante da transação foi impresso e/ou visualizado|printReceipt()| |99|ERRO INTERNO.|Todas| —–
Extração de Dados
Esse método deve ser chamado para fazer a extração dos dados do Payments e das adquirentes sendo utilizadas e enviá-los para a AWS (Amazon Web Services).
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
callback | PaymentCallBack | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa do erro.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ApplicationInfo appInfo = new ApplciationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
try {
paymentClient.startExtraction(this);
} catch (ClientException e) {
Log.e(TAG, “Error while uploading data.”, e);
}
}
@Override
public void onError(Object data) {
Log.e(TAG, “Error: “ + errorData.getResponseMessage());
}
@Override
public void onSuccess(Object data) {
Log.i(TAG, “Success!”);
}
}|
| :- |
—–
Echo Test
Inicia o processo para realizar os testes de comunicação
Esse método deve ser chamado quando se deseja realizar testes de comunicação com os servidores que o terminal se comunica. Ao fim da execução será retornado o objeto EchoTestResults, contendo informações de cada teste executado.
Métodos
Assinatura | Descrição |
---|---|
void startEchoTest(PaymentCallback paymentCallback) | Inicia o processo para realizar os testes de comunicação. |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa do erro.|
Exemplo
|public class MyActivity extends Activity implements PaymentClient.PaymentCallback {
private PaymentClient paymentClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment);
paymentClient = new PaymentClientImpl();
}
@Override
protected void onResume() {
super.onResume();
paymentClient.bind(this);
}
@Override
protected void onDestroy() {
try {
paymentClient.unbind(this);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
super.onDestroy();
}
public void doExecute(){
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.setCredentials(new Credentials(“demo-app”, “TOKEN-KEY-DEMO”));
appInfo.setSoftwareVersion(“1.0.0.0”);
try {
paymentClient.startEchoTest(this);
} catch (ClientException e) {
Log.e(TAG, “Error while doing the test”, e);
}
}
@Override
public void onError(Object data) {
Log.e(TAG, “Error: “ + errorData.getResponseMessage());
}
@Override
public void onSuccess(Object data) {
CommTestResults results = (CommTestResults) data;
Log.i(TAG, results.toString());
}
}|
| :- |
Retorno
|Nome|Tipo|Descrição| | :- | :- | :- | |isConnectedNetwork|boolean|Identifica se está conectado a alguma rede, seja ela Wi-Fi ou Chip de Dados.| |networkLevel|int|Nível de sinal da rede conectada.| |isPaystoreInit|boolean|Indica se a Inicialização com a Paystore está disponível.| |isStoreStatus|boolean|Indica se a Loja de Apps está disponível.| |storeResponseTime|Long|Tempo de resposta da Loja de Apps.| |acquirerResults|List|Lista com resultados dos testes de comunicação com as adquirentes.| |serverName|String|Nome do servidor.| |serverStatus|boolean|Indica se o servidor está disponível.| |serverMeanResponseTime|Long|Média do tempo de resposta dos testes com o servidor (no caso de ter mais de um adquirente, esse tempo é a média de todos os adquirentes instalados).|
ACQUIRERCOMMTESTRESULTS
|Nome|Tipo|Descrição| | :- | :- | :- | |acquirerName|String|Nome do adquirente.| |acquirerStatus|CommTestStatus|Indica se a comunicação com o adquirente está disponível.| |acquirerResponseTime|Long|Tempo de resposta do teste com o adquirente.| |serverName|String|Nome do servidor.| |serverStatus|CommTestStatus|Indica se o servidor está disponível.| |serverResponseTime|Long|Tempo de resposta dos testes com o servidor.|
COMMTESTSTATUS
Nome | Descrição |
---|---|
NONE | Não há comunicação. |
ONLINE | Comunicação está Online. |
OFFLINE | Comunicação está Offline |
Customizar a aplicação principal
Através dessa opção o Facilitador pode definir seu apk como principal. Assim que o terminal for ligado a aplicação configurada será chamada ao invés da aplicação padrão de pagamento PayStore.
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
packageName | String | Sim | Nome do pacote da aplicação |
callback | PaymentCallBack | Sim | Interface que será executada para notificações de sucesso ou erro. |
Detalhe dos parâmetros
callback
|Nome|Tipo|Obrigatório|Descrição| | :- | :- | :- | :- | |onSuccess| | |Método para notificação em caso de sucesso| |onError| | |Método para notificação em caso de erro.| |ErrorData.paymentsResponseCode|String|Sim|Código de resposta para o erro ocorrido. Vide Códigos de Resposta| |ErrorData.responseMessage|String|Sim|Mensagem descritiva da causa do erro.|
Exemplo
|import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;import br.com.phoebus.android.payments.api.ErrorData;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.exception.ClientException;public class SetMainAppActivity extends AppCompatActivity {
private PaymentClient paymentClient;
private EditText packageNameEdt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setTitle(R.string.setMainApp);
setContentView(R.layout.activity_set_main_app);
this.packageNameEdt = ((EditText) this.findViewById(R.id.packageNameEdt));
this.packageNameEdt.setText(“br.com.phoebus.payments.demo”);
this.paymentClient = new PaymentClient();
this.paymentClient.bind(this.getApplicationContext());
}
public void doSetMainApp(View view) {
if (!isDataValid()) return;
try {
this.paymentClient.setMainApp(packageNameEdt.getText().toString(), new PaymentClient.PaymentCallback() {
@Override
public void onSuccess(Object data) {
Toast.makeText(SetMainAppActivity.this, “App principal definido!”, Toast.LENGTH_SHORT).show();
}
@Override
public void onError(ErrorData errorData) {
Toast.makeText(SetMainAppActivity.this, “Erro ao definir app principal: “ + errorData.getPaymentsResponseCode() +
” = “ + errorData.getResponseMessage(), Toast.LENGTH_LONG).show();
}
});
} catch (ClientException e) {
e.printStackTrace();
Toast.makeText(SetMainAppActivity.this, “Falha na chamada do serviço: “ + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
private boolean isDataValid() {
boolean ret = true;
if (““.equals(this.packageNameEdt.getText().toString())) {
this.packageNameEdt.setError(getString(R.string.requieredFieldError));
ret = false;
}
return ret;
}
}|
| :- |
—–
Resolução de Pendências QRCode (Pagamento Específico)
[**DEPRECATED] Realiza o processo de resolução de pendências QR Code - Pagamento Específico**
Esse método deve ser chamado para executar a resolução de pendências QR Code - Pagamento específico.
Métodos
Assinatura | Descrição |
---|---|
void resolveQRCodePendencies(QRCodePendencyRequest settlementRequest, PaymentCallback paymentCallback) | Realiza o processo de resolução de pendência QR Code para pagamento específico. |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | QRCodePendencyRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição da resolução de pendências para pagamento específico QR Code. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de resolução de pendências para pagamento específico QR Code. |
Detalhe dos parâmetros request (QRCodePendencyRequest)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
applicationId | Credentials | Sim | Identificação do aplicativo que está solicitando a consulta. |
secretToken | Credentials | Sim | Token de acesso do aplicativo que está solicitando a consulta. |
softwareVersion | String | Sim | Versão da aplicação que está solicitando a consulta. |
date | Date | Sim | Data / hora do pagamento. |
qrId | String | Sim | Identificador QRCode gerado pelo terminal de captura. |
response (QRCodePendencyResponse)
|Nome|Tipo|Descrição| | :- | :- | :- | |status|QRCodeIntentStatus|Indica a situação da transação com QR.| |type|QRCodeIntentType|Tipo de QR (venda, anulação, devolução).| |payment|PaymentV2|Objeto que representa os dados do pagamento.| |reversePayment|ReversePayment|Objeto que representa os dados do estorno.|
QRCODEINTENTSTATUS
|Nome|Id|Descrição| | :- | :- | :- | |CREATED|1|Transação criada.| |PENDING|2|Transação pendente.| |WAITING|3|Transação em espera.| |PROCESSING|4|Transação em processamento.| |PROCESSED|5|Transação processada.| |CONFIRMED|6|Solicitação confirmada.| |CANCELED|7|Transação cancelada.| |REVERSED|8|Transação estornada.| |DENIED|9|Transação Negada.| |EXPIRED|10|Transação expirada.| |UNREACHABLE|11|Transação inacessível.|
QRCODEINTENTTYPE
|Nome|Id|Descrição| | :- | :- | :- | |PAYMENT|0|Indica que o tipo de QR é um pagamento.| |REVERSAL|1|Indica que o tipo de QR é um estorno.| |DEVOLUTION|2|Indica que o tipo de QR é uma devolução.|
EXEMPLO
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.jakewharton.threetenabp.AndroidThreeTen;
import java.math.BigDecimal;import java.text.SimpleDateFormat;
import java.util.Arrays;import java.util.Date;
import java.util.List;
import java.util.TimeZone;import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentStatus;
import br.com.phoebus.android.payments.api.provider.PaymentContract;
import br.com.phoebus.android.payments.api.provider.PaymentProviderApi;
import br.com.phoebus.android.payments.api.provider.PaymentProviderRequest;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
AndroidThreeTen.init(getApplication());
}
@Override
public void onClick(View view) {
doExecute();
}
public void doExecute() {
//definindo as credenciais
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion(“1.0”);
//criando objeto de request para o payment
QRCodePendencyRequest request = createRequest(applicationInfo);
}
private QRCodePendencyRequest createRequest(ApplicationInfo appInfo) {
QRCodePendencyRequest request = new QRCodePendencyRequest();
request.setApplicationInfo(appInfo);
request.setSecretToken(appInfo.getCredentials());
request.setApplicationId(appInfo.getCredentials());
request.setSoftwareVersion(appInfo.getSoftwareVersion());
request.setQrId(“123”);
SimpleDateFormat isoFormat = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss.SSS”);
isoFormat.setTimeZone(TimeZone.getTimeZone(“UTC”));
try {
Date date = isoFormat.parse(“2021-07-27T00:00:00.000”);
request.setDate(date);
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
return request;
}
}|
| :- |
—–
Realiza o processo de resolução de pendências QR Code - Pagamento Específico
Esse método deve ser chamado para executar a resolução de pendências QR Code - Pagamento específico. Para utilizá-lo, ao menos um identificador do pagamento deve ser fornecido, seja o qrId ou o appTransactionId.
Métodos
Assinatura | Descrição |
---|---|
void resolveQRCodePendencyV2(QRCodePendencyRequestV2 request, PaymentCallback paymentCallback) | Realiza o processo de resolução de pendência QR Code para pagamento específico. |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | QRCodePendencyRequestV2 | Sim | Objeto de transferência de dados que conterá as informações da requisição da resolução de pendências para pagamento específico QR Code. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de resolução de pendências para pagamento específico QR Code. |
Detalhe dos parâmetros - request (QRCodePendencyRequestV2)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
applicationId | Credentials | Sim | Identificação do aplicativo que está solicitando a consulta. |
secretToken | Credentials | Sim | Token de acesso do aplicativo que está solicitando a consulta. |
softwareVersion | String | Sim | Versão da aplicação que está solicitando a consulta. |
date | Date | Sim | Data / hora do pagamento. |
qrId | String | Não | Identificador QrCode gerado pelo terminal de captura. |
appTransactionId | String | Não | Identificador da transação integrada. |
response (QRCodePendencyResponse)
|Nome|Tipo|Descrição| | :- | :- | :- | |status|QRCodeIntentStatus|Indica a situação da transação com QR.| |type|QRCodeIntentType|Tipo de QR (venda, anulação, devolução).| |payment|PaymentV2|Objeto que representa os dados do pagamento.| |reversePayment|ReversePayment|Objeto que representa os dados do estorno.|
QRCODEINTENTSTATUS
|Nome|Id|Descrição| | :- | :- | :- | |CREATED|1|Transação criada.| |PENDING|2|Transação pendente.| |WAITING|3|Transação em espera.| |PROCESSING|4|Transação em processamento.| |PROCESSED|5|Transação processada.| |CONFIRMED|6|Solicitação confirmada.| |CANCELED|7|Transação cancelada.| |REVERSED|8|Transação estornada.| |DENIED|9|Transação Negada.| |EXPIRED|10|Transação expirada.| |UNREACHABLE|11|Transação inacessível.|
QRCODEINTENTTYPE
|Nome|Id|Descrição| | :- | :- | :- | |PAYMENT|0|Indica que o tipo de QR é um pagamento.| |REVERSAL|1|Indica que o tipo de QR é um estorno.| |DEVOLUTION|2|Indica que o tipo de QR é uma devolução.|
EXEMPLO
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.jakewharton.threetenabp.AndroidThreeTen;
import java.math.BigDecimal;import java.text.SimpleDateFormat;
import java.util.Arrays;import java.util.Date;
import java.util.List;
import java.util.TimeZone;import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentStatus;
import br.com.phoebus.android.payments.api.provider.PaymentContract;
import br.com.phoebus.android.payments.api.provider.PaymentProviderApi;
import br.com.phoebus.android.payments.api.provider.PaymentProviderRequest;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
AndroidThreeTen.init(getApplication());
paymentClient.bind(this);
}
@Override
public void onClick(View view) {
doExecute();
}
public void doExecute() {
//definindo as credenciais
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion(“1.0”);
//criando objeto de request para o payment
QRCodePendencyRequestV2 request = createRequest(applicationInfo);
paymentClient.resolveQRCodePendencyV2(request, new PaymentClient.PaymentCallback() {
@Override
public void onSuccess(QRCodePendencyResponse response) {
Log.d(“Pendencia resolvida”);
}
@Override
public void onError(ErrorData errorData) {
Log.d(“Algo deu errado!”);
}
}
}
private QRCodePendencyRequestV2 createRequest(ApplicationInfo appInfo) {
QRCodePendencyRequestV2 request = new QRCodePendencyRequestV2();
request.setApplicationInfo(appInfo);
request.setSecretToken(appInfo.getCredentials());
request.setApplicationId(appInfo.getCredentials());
request.setSoftwareVersion(appInfo.getSoftwareVersion());
request.setAppTransactionId(“123456”);
SimpleDateFormat isoFormat = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss.SSS”);
isoFormat.setTimeZone(TimeZone.getTimeZone(“UTC”));
try {
Date date = isoFormat.parse(“2021-07-27T00:00:00.000”);
request.setDate(date);
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(TAG, e.getMessage(), e);
}
return request;
}
}|
| :- |
—–
Realiza o processo de resolução de pendências QR Code - Lista de pagamentos
Esse método deve ser chamado para executar a resolução de pendências QR Code - Lista de pagamentos.
Métodos
Assinatura | Descrição |
---|---|
void resolveQRCodePendencies(QRCodePendenciesRequest request, PaymentCallback paymentCallback) | Realiza o processo de resolução de pendência QR Code para lista de pagamentos. |
Parâmetros
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
request | QRCodePendenciesRequest | Sim | Objeto de transferência de dados que conterá as informações da requisição da resolução de pendências para lista de pagamentos QR Code. |
callback | PaymentCallback | Sim | Interface que será executada para notificações de sucesso ou erro do processo de resolução de pendências para lista de pagamentos QR Code. |
Detalhe dos parâmetros request (QRCodePendenciesRequest)
Nome | Tipo | Obrigatório | Descrição |
---|---|---|---|
applicationId | Credentials | Sim | Identificação do aplicativo que está solicitando a consulta. |
secretToken | Credentials | Sim | Token de acesso do aplicativo que está solicitando a consulta. |
softwareVersion | String | Sim | Versão da aplicação que está solicitando a consulta. |
response
|Nome|Tipo|Descrição| | :- | :- | :- | |Value|BigDecimal|Valor do pagamento. Este é o valor que foi aprovado pela adquirente. Deve ser validado sempre na resposta, ainda que tenha sido passado como parâmetro, pois há adquirentes que, para algumas situações, aprovam valores diferentes dos solicitados| |QRType|QRCodeIntentType|Tipo de QR (venda, anulação, devolução).| |appTransactionId|String|Identificador da transação integrada. O Identificador referido é o da aplicação que originou a solicitação de pagamento. Não deve se repetir.| |Date|String|Data / hora do pagamento.| |qrId|String|Identificador QRCode gerado pelo terminal de captura.|
EXEMPLO
|import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.jakewharton.threetenabp.AndroidThreeTen;
import java.math.BigDecimal;import java.text.SimpleDateFormat;
import java.util.Arrays;import java.util.Date;
import java.util.List;
import java.util.TimeZone;import br.com.phoebus.android.payments.api.ApplicationInfo;
import br.com.phoebus.android.payments.api.Credentials;import br.com.phoebus.android.payments.api.Payment;
import br.com.phoebus.android.payments.api.PaymentClient;
import br.com.phoebus.android.payments.api.PaymentStatus;
import br.com.phoebus.android.payments.api.provider.PaymentContract;
import br.com.phoebus.android.payments.api.provider.PaymentProviderApi;
import br.com.phoebus.android.payments.api.provider.PaymentProviderRequest;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button bt_start;
private PaymentClient paymentClient;
public static final String TEST_APPLICATION_ID = “0”;
public static final String TEST_SECRET_TOKEN = “000000000000000000000000”;
public static final String TAG = “TAG_DEMO”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start = (Button) this.findViewById(R.id.button);
bt_start.setOnClickListener(this);
paymentClient = new PaymentClient();
AndroidThreeTen.init(getApplication());
}
@Override
public void onClick(View view) {
doExecute();
}
public void doExecute() {
//definindo as credenciais
Credentials credentials = new Credentials();
credentials.setApplicationId(TEST_APPLICATION_ID);
credentials.setSecretToken(TEST_SECRET_TOKEN);
ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.setCredentials(credentials);
applicationInfo.setSoftwareVersion(“1.0”);
//criando objeto de request para o payment
QRCodePendenciesRequest request = createRequest(applicationInfo);
}
private QRCodePendenciesRequest createRequest(ApplicationInfo appInfo) {
QRCodePendenciesRequest request = new QRCodePendenciesRequest();
request.setApplicationInfo(appInfo);
request.setSecretToken(appInfo.getCredentials());
request.setApplicationId(appInfo.getCredentials());
request.setSoftwareVersion(appInfo.getSoftwareVersion());
return request;
}
}|
| :- |
—–
Algoritmo recomendado para Aplicações integradas
A aplicação de Pagamentos registra o status da transação que pode ser consultado posteriormente, para que o app que se integra via SDK tenha conhecimento do estado atual da transação e tome alguma ação, caso necessário.
Durante o fluxo transacional podem ocorrer falhas inesperadas, como o desligamento do terminal ou fechamento repentino da aplicação devido a algum erro não tratado. Isto pode gerar inconsistências na resolução da transação, sendo preciso que em alguns momentos o app que se integra via SDK realize algumas ações para resolver essa inconsistência.
O diagrama abaixo descreve o fluxo dos status da aplicação e em seguida são apresentadas sugestões de como corrigir possíveis erros.
Em situações de falha inesperada (fechamento da aplicação pelo operador do terminal, por exemplo, ou Fatal Exception), tanto na aplicação de Pagamentos quanto na aplicação que se integra via SDK, recomendamos adotar algumas estratégias para garantir que as pendências sejam resolvidas e as transações sejam processadas de forma consistente:
1. Imediatamente antes de chamar startPaymentV2() (ou outras funções do SDK), a aplicação deve registrar de forma persistente o horário atual e os dados que possui da transação a ser iniciada,
appTransactionId, bem como um status que indique que irá chamar startPaymentV2();
1. Imediatamente ao receber o callback (onSuccess ou onError), a aplicação deve registrar de forma persistente o horário atual, os dados retornados, e um status que indique que recebeu o callback;
2. Caso ocorra interrupção do fluxo em um pagamento, os métodos de callbacks (onSuccess ou onError) não serão chamados. a. A aplicação que chamou startPaymentV2() pode identificar este caso de duas formas: i. Quando a Aplicação iniciar sua execução, deve verificar se existir registro de chamada de startPaymentV2(), sem que tenha havido registro do callback correspondente. Nesse caso pode ter havido interrupção inesperada da própria aplicação, podendo ou não ter havido também interrupção inesperada de Payments;ii. Ao detectar um longo tempo (por exemplo, 10 minutos) após a chamada de startPaymentV2(), sem que tenha havido o callback. Nesse caso pode ter havido interrupção inesperada de Payments; b. Nesses casos,
para transações de pagamento com cartão o comportamento recomendado é o seguinte: i. Realizar uma consulta (Vide Consulta), passando o appTransactionId da transação; ii. Caso o paymentStatus seja igual a CANCELLED, a transação foi desfeita por Payments e já está finalizada. A aplicação deve considerar que a transação não foi realizada. Não é necessária nenhuma ação para resolver pendências com Payments; iii. Caso o paymentStatus seja igual a PENDING, a Aplicação deve solicitar desfazimento através do método cancelPayment(). Se a identificação da situação ocorreu da forma descrita em “i”, pode ser que Payments não tenha sido interrompida e ainda esteja executando o pagamento, por isso o App deve esperar pelo menos 10 minutos (desde o tempo registrado em “1”) antes de chamar cancelPayment(); iv. Caso o paymentStatus seja igual a UNREACHABLE ou PROCESSING, a transação foi interrompida antes mesmo de ser enviada ao autorizador. A aplicação deve considerar que a transação não foi realizada. Não é necessária nenhuma ação para resolver pendências com Payments; v. Caso o paymentStatus seja igual a DENIED, a transação foi negada. A aplicação deve considerar que a transação não foi realizada. Não é necessária nenhuma ação para resolver pendências com Payments; c. Nesses casos, para transações de pagamento com QR o comportamento recomendado é o seguinte: i. Chamar o método resolveQRCodePendencyV2(), passando o appTransactionId da intenção; ii. Caso o qrCodeIntentStatus seja igual a PENDING ou CREATED, o app deve continuar consultando (chamando resolveQRCodePendencyV2()) até receber um status final; iii. Caso o qrCodeIntentStatus seja igual a CANCELLED, EXPIRED ou DENIED, a aplicação deve considerar que a transação não foi realizada. Não é necessária nenhuma ação para resolver pendências com Payments; iv. Caso o qrCodeIntentStatus seja igual a APPROVED, a aplicação receberá os dados da transação e deverá processá-los. A aplicação deve considerar que a transação foi realizada. Não é necessária nenhuma ação para resolver pendências com Payments.
|Responsável|Data:|Alterações| | :-: | :-: | :-: | |Fabricio Camargo|26.04.2024|Versão inicial| |Ederson Silveira|03.07.2024|Ajuste exemplos de uso do SDK| |Ederson Silveira|30.07.2024|Adicionada consulta transação via merchantOrderId| | | | |