Peer-to-Peer (P2P)

Pagamento instantâneo é toda transferência eletrônica de recursos na qual a transmissão da mensagem de pagamento e a disponibilidade de fundos para o recebedor ocorrem em tempo real. A Elo oferece através da API de P2P a possibilidade de transferência eletrônica entre 2 portadores de cartão.

Feito para:  Estabelecimentos ComerciaisEmissoresAdquirentesFacilitadoresOutros Desenvolvedores

Como funciona

Primeiros passos

  1. Leia Introdução ao GraphQL, com exemplos reais da nossa API.

  2. Crie um usuário no portal do desenvolvedor.

  3. Cadastre sua primeira aplicação.

  4. Utilize o dashboard para acessar suas configurações de acesso.

  5. Para explorar rapidamente as APIs aqui na página de documentação, use o console de GraphQL, na seção de referências. Nele, você pode ver as consultas de exemplo, executá-las e alterá-las.

Primeiros passos na plataforma de Desenvolvedores Elo

Jaydson GomesDesenvolvedor Evangelista

Esta API permite a realização de transações monetárias instantâneas entre 2 indivíduos, possibilitando que o dinheiro transferido esteja na conta/cartão do destinatário em poucos minutos. O objetivo é que as transferências possam ser feitas a qualquer momento e no formato que o usuário desejar. Com isso, uma pessoa poderia enviar dinheiro de sua conta corrente ou cartão para o cartão de crédito de outra pessoa a qualquer hora do dia ou qualquer dia da semana, sem restrições de horário.

As requisições de transferências e/ou pagamentos P2P da Elo devem ser feitas no padrão GraphQL.

Para que uma transação seja realizada com sucesso dentro do ecossistema Elo é necessário saber quem são os portadores de cartão envolvidos e assim realizar cada chamada a API seguindo os passos abaixo.

Para a realização de todas as transações de P2P, é necessário ter um usuário criado e tê-lo associado a um Comerciante, a um Emissor, a um Adquirente ou a um Portador de Cartão, de acordo com a operação que será feita, como descrito nos próximos itens.

Campos Sensitive e CardId

Em algumas chamadas, nota-se o campo sensitive e/ou o campo cardId. Ambos os campos representam informações de cartão, mas de formas diferentes:

  • No campo cardId, é informado o id de um cartão previamente cadastrado na base; na mutation, todas as informações da transação serão atreladas ao cartão que contém este id.

  • No campo sensitive, são informados os dados sensíveis do cartão, assinados e critografados para garantir a segurança no tráfego das informações. Este campo é inserido caso não exista um cartão previamente cadastrado na base, ou caso não seja possível ter acesso ao id de algum cartão previamente cadastrado. Para mais detalhes sobre este campo, acesse a documentação do sensitive.

Caso exista a opção de ambos os campos em uma mutation, será possível realizar a chamada ou através do cardId ou através do sensitive.

Campo Ciphered Transaction Cryptogram

Temos também o campo não-obrigatório cipheredTransactionCryptogram. Esse campo utiliza o mesmo formato de criptografia do campo sensitive, sendo enviado também criptografado, e representa o criptograma da transação.

Este campo, antes de ser assinado e criptografado, possui o conteúdo descrito no JSON a seguir.

{ 
  "type": "CVE2", 
  "value": "123" 
}

Onde:

  • type é um enum, que aceita os valores CVE2 ou CAVV, indicando o tipo de criptograma a ser informado.

  • value é o campo que contém o valor do criptograma. Esse valor é alfanumérico. Ele é relacionado ao campo anterior: se o campo type tiver o valor "CVE2", serão permitidos aqui valores de no máximo 4 caracteres; já se for informado "CAVV" anteriormente, serão permitidos valores de no máximo 42 caracteres.

Detalhando o campo type

Os dois tipos aceitos no atributo type, CVE2 e CAVV, possuem as seguintes características:

  • CVE2 é um código de verificação estático utilizado em transações com cartão não-presente. Em cartões físicos, é o número de três dígitos normalmente encontrado no verso do cartão.

  • CAVV é um código de verificação dinâmico associado a uma única transação com cartão não-presente. É fundamental para a autorização de certos tipos de transação em programas de pagamento da ELO (por exemplo 3DS, transações In-App, etc.). Os detalhes e obrigatoriedade de uso do CAVV são definidos nas especificações destes produtos.

Após a criptografia e a assinatura

Esse JSON descrito anteriormente, antes de ser enviado para a API, necessita ser assinado e criptografado, (como o campo sensitive). Após estes processos, o valor, que antes era um JSON, será um hash, com um conteúdo semelhante ao exemplificado abaixo.

"yJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTEyOENCQy1IUzI1NiIsImVwayI6eyJrdHkiOiJFQyIsIngiOiJkV3lUY2dLMlJkS0NYTmVnSEs0UF9yWUZ4d0RSZkp2MDVhal9ZVThFdDNNIiwieSI6IjUzaUVVUml4OTNkZFhOWHEyZjVHRlhOeS1tME5UUkZUODhnR2lTc2gxOUUiLCJjcnYiOiJQLTI1NiJ9fQ..mTKZEHVVi0mAIGMOHS9y9w.CURzlOGLBL6BxqyigA58zhvcpCevhAUP8aIMG1lCK3_xKL6bohV7BOQRwLflIhBzpYys0ampxJWB6-AEDi45ukFS3FjfdVWtlSoW-mo8Ood1hPgQBHC6hjqSJ6gNVC3BhX6MZXpl3YuyZsU1wTT8z_11MF1LpkzBAETtF71Ni1ssQYgcYALwCdgnePjsb43s-G2jw5EH4NEu_i-UXeqg7g.dScVepTo9tdyva-P8jVP-w"

O hash acima será o conteúdo a ser inserido na chamada para a API, preenchendo o campo cipheredTransactionCryptogram, como podemos ver no exemplo:

"cipheredTransactionCryptogram": "yJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTEyOENCQy1IUzI1NiIsImVwayI6eyJrdHkiOiJFQyIsIngiOiJkV3lUY2dLMlJkS0NYTmVnSEs0UF9yWUZ4d0RSZkp2MDVhal9ZVThFdDNNIiwieSI6IjUzaUVVUml4OTNkZFhOWHEyZjVHRlhOeS1tME5UUkZUODhnR2lTc2gxOUUiLCJjcnYiOiJQLTI1NiJ9fQ..mTKZEHVVi0mAIGMOHS9y9w.CURzlOGLBL6BxqyigA58zhvcpCevhAUP8aIMG1lCK3_xKL6bohV7BOQRwLflIhBzpYys0ampxJWB6-AEDi45ukFS3FjfdVWtlSoW-mo8Ood1hPgQBHC6hjqSJ6gNVC3BhX6MZXpl3YuyZsU1wTT8z_11MF1LpkzBAETtF71Ni1ssQYgcYALwCdgnePjsb43s-G2jw5EH4NEu_i-UXeqg7g.dScVepTo9tdyva-P8jVP-w"

Usado para obter fundos de uma conta com cartão Elo com o propósito de realizar uma transferência. Essa ação pode acontecer quando um portador da bandeira Elo deseja transferir dinheiro para outro portador Elo.

Utilizada para retirar fundos de uma conta, esta mutation é feita por um usuário portador de cartão (CardHolder), que estará referenciando dentro dela qual o cartão que foi utilizado. A identificação do usuário estará em seu access_token.

A referência ao cartão de origem desta transação é realizada através dos campos cardId ou sensitive.

Abaixo, a mutation createPullTransfer:

mutation{
    createPullTransfer(
        input:{
            clientMutationId: "12345"
            acquirer:{
                id: "d9325232-84fe-46ed-bd6c-ba010f99b7c7"
                countryCode: "BRA"
                code: "01"
            }
            merchant:{
                name: "Teste"
                legalName: "Teste LTDA"
                description: "description merchant",
                legalIds:{
                    cnpj: "121212121212121",
                    rg: {
                        number: "444"
                        issueDate: "2010-12-31"
                        issuerState: "sp",
                        issuerOrganization: "ulo"
                    }
                }
                contact:{
                    type: PHONE
                    context: "Trabalho"
                    value: "+5511999991111"
                }
                address:{
                    context: "casa",
                    country: "Brasil"
                    city: "São Paulo"
                    state: "São Paulo"
                    zip: "123456788"
                    number: 1234
                    place: "Paulista"
                }
                url: "WWW.ELO.COM.BR",
                iso: 1111
                countryCode: "BRA"
                idCode: "123"
            }
            # Caso você possua um cartão já cadastrado basta utilizar seu cardId
            cardId: "1234"
            # se você não o possuir utilize o campo sensitive
            sensitive: "dasdpaiwqoedandk1993u1ekqkejqweuq90193ueqdm"
            cipheredTransactionCryptogram: "M7uxALQqkH9IYOY4Qc09MsUqG87WZ6gMbindAab7yYaX6XrQG6bZOkBhjCkx4q1oZulHzJoUoZBQUdypm2VBV56Gc4vT7wOkjZOa"
            amount:{
                currency: "BRL"
                value: "10.00"
            }
            systemsTraceAuditNumber: "123"
            transactionDateTime: "2018-10-30T12:00:00-03:00"
            transactionIdentifier: "123"
            retrievalReferenceNumber: "123"
            codeUsage: 70 
            origin: {
                geolocation: {
                    lon: 9,
                    lat: 8,
                    alt: 7,
                    precision: 6,
                    source: GPS
                },
                device: {
                    userAgent: "user AGENT",
                    brand: "BRAND",
                    model: "MODEL",
                    type: MOTORCYCLE,
                    serialNumber: "832809320983429804328",
                    imei: "WS2@",
                    os: "77636363",
                }
            },
            pointOfService: {
                type: 3
                localization: 3
                cardPresentTransaction: false
                cardCaptureCapability: 0
                securityTransaction: 0
                typePOS: "M"
                inputCapability: "C"
                panEntryMode: "86"
                terminalIdentifier: "12345678"
            }
            receiver: {
                  name: "João da Silva"
                  firstName: "João"
                  legalIds: {
                      cpf: "72814394070"
                      rg: {
                          number: "315689808"
                          issueDate: "2010-12-31"
                          issuerState: "sp",
                          issuerOrganization: "ssp"
                      }
                  }
                  contact: {
                      type: PHONE
                      context: "Trabalho"
                      value: "+5511999991111"
                  }
                  address: {
                      country: "Brasil"
                      city: "São Paulo"
                      state: "São Paulo"
                      zip: "123456788"
                      number: 1234
                      place: "Paulista"
                  }
                  birthday: "1992-02-14"
              }
        }
    )
    {
        clientMutationId
        cardHolder{
            id
            name
            legalIds{
                cpf{ number }
            }            
        }    
        cardTransaction {
            id
            status 
            currency
            value
        }
        receiver {
            name
            firstName
            lastName
            displayName
            legalIds {
                cnpj { number }
                cpf { number }
                rg { number issuerOrganization issuerState issueDate }
            }
            birthday
            gender
            maritalStatus
            income { personal family currency }
            occupation { id display }
            contact { type context value verified }
            address { 
                context 
                country 
                city 
                state 
                zip 
                district 
                kind 
                number 
                place 
                complement 
                reference 
                instructions 
                instructions 
                lon 
                lat
            }
        }
    }
}

Sobre os campos utilizados nesta mutation temos:

  • acquirer Dados do adquirente responsável pela transação

  • merchant Informações do Comerciante. Possui campos como razão social, nome fantasia, documentos legais (CNPJ) e categorias (MCC).

    • merchant.name Nome visível publicamente. Normalmente nome bem conhecido, marca, etc.

    • merchant.legalName Nome legal, como escrito em documentos.

    • merchant.description Descrição da empresa para ser apresentado a usuários.

    • merchant.legalIds Todos os documentos legais de identificação da empresa.

    • merchant.contact Contato do comerciante

    • merchant.address Endereço postal. O campo zip deve ser sempre preenchido.

    • merchant.url Endereço Virtual (Uniform Resource Locator).

    • merchant.iso Código ISO18245. Também conhecido como MCC (Merchant Category Code), tem 4 dígitos.

    • merchant.countryCode Identificador Global Único do país onde está localizado o Merchant, código 076 (Brasil). ISO 3166-1 numeric

    • merchant.idCode Identificação do Estabelecimento Comercial cadastrado junto à Elo pelo Credenciador ou pelo Facilitador no momento do ajuste cadastral do Estabelecimento Comercial.

  • cardId Caso o usuário já possua cartões cadastrados é possível fornecer o id do cartão em que será efetuada a transferência (Este campo elimina a necessidade de fornecer o proximo campo sensitive do cartão.)

  • sensitive Caso o usuário logado não possua cartões é possível efetuar a transação a partir dos dados sensiveis de um cartão criptografados, veja mais detalhes na documentação do Cadastro de Portador

  • amount Informação sobre o valor a ser transferido

    • amount.currency Código da moeda com 3 letras (ISO4217). Exemplo: EUR, USD, BRL...

    • amount.value Valor total da transação, com duas casas decimais após um ponto. Ex: 1000.00 (mil), 1000.55 (mil e cinquenta e cinco centavos).

  • systemsTraceAuditNumber O STAN é o número designado pelo originador de uma transação para auxiliar a identificação da transação com cartão

  • transactionDateTime Data e hora de onde ocorreu a transação (GMT)

  • transactionIdentifier Número de Referência atribuido pelo Originador da Transferência de Fundos.

  • retrievalReferenceNumber Número serial único (NSU) para identificar a transação

  • codeUsage Uso do Cartão Ex.: Crédito à Vista = 70 / Débito = 71

  • pointOfService Dados relacionados ao terminal (POS) onde a transação está sendo feita.

    • pointOfService.type Tipo do terminal

      • 0 -> Terminal com atendimento (EC possui operador para o terminal)

      • 1 -> Terminal com autoatendimento (Ex.: Vending Machines)

      • 2 -> Sem Terminal (Ex.: URA/Voz/e-Commerce)

      • 3 -> Celular (Mobile)

    • pointOfService.localization Indicador de localização do terminal

      • 0 -> No estabelecimento comercial

      • 1 -> Fora estabelecimento comercial (terminal remoto)

      • 2 -> Junto ao portador (Ex.: PC nos casos de e-Commerce)

      • 3 -> Sem Terminal (Ex.: Voz/URA)

    • pointOfService.cardHolderPresentTransaction Indicador de presença do portador.

      • 0 -> Portador está presente.

      • 1 -> Portador não presente, não especificado.

      • 2 -> Portador não presente, Mail/FAX Order.

      • 3 -> Portador não presente, Telephone Order.

      • 4 -> Portador não presente, Standing Order/Pagamento recorrente.

      • 5 -> Eletronic Order (Ex.: e-Commerce)

    • pointOfService.cardPresentTransaction Indicador de presença do Cartão

      • True -> Cartão presente.

      • False -> Cartão não presente.

    • pointOfService.cardCaptureCapability Indicador de capacidade de captura de Cartão

      • 0 -> Terminal (POS)/Operador não tem capacidade de captura de cartão.

      • 1 -> Terminal (POS)/Operador tem capacidade de captura de cartão.

    • pointOfService.securityTransaction Indicador de segurança da transação

      • 0 -> Não há suspeita.

      • 1 -> Existe suspeita de fraude por parte do EC.

      • 2 -> Foram verificados os documentos do portador

    • pointOfService.typePOS Tipo de POS do terminal

      • M -> POS Mobile.

      • P -> POS.

      • T -> TEF.

      • 0 -> Não especificado.

    • pointOfService.inputCapability Capacidade de entrada do Terminal. Enviar apenas o identificador. Exemplo: "C"

      • 0 -> Indefinido

      • 1 -> Sem Terminal (URA/Voz)

      • 2 -> Leitor de trilha magnética

      • 3 -> Leitor de código de barras

      • 4 -> Leitor OCR

      • 5 -> Leitor de CHIP

      • 6 -> Digitado

      • 7 -> Leitor de trilha e digitado

      • C -> Radio Frequency Identification (RFID) – CHIP (Contactless)

      • H -> Hibrido – CHIP e Contactless

      • R -> Radio Frequency Identification (RFID) – Trilha Magnética

      • S -> Secure Eletronic Transaction (SET) com certificado

      • T -> Secure Eletronic Transaction (SET) sem certificado

      • U -> Channel-encrypted Eletronic Commerce Transaction (SSL)

      • V -> Non-secure Eletronic Commerce Transaction

    • pointOfService.panEntryMode Indica o modo de entrada do número do cartão. Enviar apenas o identificador. Exemplo: "00"

      • 00 Desconhecido

      • 01 Manual

      • 02 Tarja magnética

      • 03 Código de barras / Código de pagamento

      • 04 Optical Character Reader (OCR)

      • 05 Leitor de Circuito Integrado de Cartões

      • 07 E-commerce

      • 10 Conta cartão armazenada

      • 81 Indicador de Identificador de Rádio Frequência – Tarja magnética

      • 82 Mobile Commerce (mCommerce)

      • 83 Indicador de Identificador de Rádio Frequência – Chip

      • 85 Fallback do chip

      • 86 Mudança de interface Contactless

      • 90 Autorizações de voz

      • 91 Voice Response Unit (VRU) / (URA)

      • 92 Batch de autorizações

      • 93 Batch de autorizações Cash Access

    • pointOfService.terminalIdentifier Esse campo é um identificador do terminal de vendas. Exemplo: "00000000"

  • receiver possui as informações da pessoa que receberá a transferência.

    • receiver.name Nome completo, como nos documentos oficiais (RG, CPF)

    • receiver.firstName Primeiro nome

    • receiver.lastName Último nome

    • receiver.displayName Nome a ser exibido (exemplo: encurtado, alias...)

    • receiver.legalIds Todos os documentos legais de identificação.

    • receiver.birthday Data de nascimento

    • receiver.gender Masculino ou Feminino, conforme documentos oficiais

    • receiver.maritalStatus Estado civil

    • receiver.income Renda anual (individual e familiar).

    • receiver.occupationId Profissão. Utilize valores já conhecidos e retornados na consulta personOccupations, membros id.

    • receiver.contact Contato

    • receiver.address Endereço

NOTA: No retorno desta mutation é possível efetuar a query cardTransaction que irá listar transações de todos os cartões do usuário logado.

Também realizada para retirar fundos de uma conta, esta mutation é feita por um terceiro que necessite realizar a operação para um portador de cartão. Por esta razão, a mutation é realizada por um usuário que não seja portador de cartão (CardHolder).

A seguir, a mutation createPullTransferToUser:

mutation{
    createPullTransferToUser(
        input:{
            clientMutationId: "1212121"
            acquirer: {
                id: "d9325232-84fe-46ed-bd6c-ba010f99b7c7"
                countryCode: "BRA"
                code:  "01"
            }
            merchant: {
                name: "Teste"
                legalName: "Teste LTDA"
                legalIds: {
                    cnpj: "121212121212121"
                }
                contact: {
                    type: PHONE
                    context: "Trabalho"
                    value: "+5511999991111"
                }
                address: {
                    country: "Brasil"
                    city: "São Paulo"
                    state: "São Paulo"
                    zip: "123456788"
                    number: 1234
                    place: "Av. Paulista"
                }
                description: "Teste"
                url: "teste.com.br",
                iso: 1111
                countryCode: "BRA"
                idCode: "123"
            }
            sender: {
                sensitive: "1213dadasdadwqeqweqe2qeasdfaqdas123134rtghdgfjfh"
                cipheredTransactionCryptogram: "M7uxALQqkH9IYOY4Qc09MsUqG87WZ6gMbindAab7yYaX6XrQG6bZOkBhjCkx4q1oZulHzJoUoZBQUdypm2VBV56Gc4vT7wOkjZOa"
                name: "José da Silva"
                firstName: "José"
                legalIds: {
                    cpf: "24640296029"
                    rg: {
                        number: "315689808"
                        issueDate: "2010-12-31"
                        issuerState: "sp",
                        issuerOrganization: "ssp"
                    }
                }
                contact: {
                    type: PHONE
                    context: "Trabalho"
                    value: "+5511999991111"
                }
                address: {
                    country: "Brasil"
                    city: "São Paulo"
                    state: "São Paulo"
                    zip: "123456788"
                    number: 1234
                    place: "Paulista"
                }
                birthday: "1992-02-14"
                sourceOfFundsCode: "02"
            }
            receiver: {
                name: "João da Silva"
                firstName: "João"
                legalIds: {
                    cpf: "72814394070"
                    rg: {
                        number: "315689808"
                        issueDate: "2010-12-31"
                        issuerState: "sp",
                        issuerOrganization: "ssp"
                    }
                }
                contact: {
                    type: PHONE
                    context: "Trabalho"
                    value: "+5511999991111"
                }
                address: {
                    country: "Brasil"
                    city: "São Paulo"
                    state: "São Paulo"
                    zip: "123456788"
                    number: 1234
                    place: "Paulista"
                }
                birthday: "1992-02-14"
            }
            amount:{
                currency: "BRL"
                value: "10.00"
            }
            systemsTraceAuditNumber: "123"
            transactionDateTime: "2018-10-30T12:00:00-03:00"
            transactionIdentifier: "112"
            retrievalReferenceNumber: "123"
            codeUsage: 70
            origin: {
                geolocation: {
                    lon: 9,
                    lat: 8,
                    alt: 7,
                    precision: 6,
                    source: GPS
                },
                device: {
                    userAgent: "user AGENT",
                    brand: "BRAND",
                    model: "MODEL",
                    type: MOTORCYCLE,
                    serialNumber: "832809320983429804328",
                    imei: "123456789098765",
                    os: "77636363",
                }
            },
            pointOfService: {
                type: 3
                localization: 3
                cardPresentTransaction: false
                cardCaptureCapability: 0
                securityTransaction: 0
                typePOS: "M"
                inputCapability: "C"
                panEntryMode: "86"
                terminalIdentifier: "12345678"
            } 
        }
    )
    {
        clientMutationId
        cardTransaction{
            id
            value
            status
            value
            currency                     
        }
        receiver {
            name
            firstName
            lastName
            displayName
            legalIds {
                cnpj { number }
                cpf { number }
                rg { number issuerOrganization issuerState issueDate }
            }
            birthday
            gender
            maritalStatus
            income { personal family currency }
            occupation { id display }
            contact { type context value verified }
            address { 
                context 
                country 
                city 
                state 
                zip 
                district 
                kind 
                number 
                place 
                complement 
                reference 
                instructions 
                instructions 
                lon 
                lat
            }
        }
    }
}

Nesta mutation temos o campo sender diferente da anterior:

  • sender possui as informações da pessoa e seu cartão que esta efetuando a transferência.

    • sender.sensitive Conteúdo sensível do cartão o qual foi assinado e então cifrado.

    • sender.name Nome completo, como nos documentos oficiais (RG, CPF)

    • sender.firstName Primeiro nome

    • sender.lastName Último nome

    • sender.displayName Nome a ser exibido (exemplo: encurtado, alias...)

    • sender.legalIds Todos os documentos legais de identificação.

    • sender.birthday Data de nascimento

    • sender.gender Masculino ou Feminino, conforme documentos oficiais

    • sender.maritalStatus Estado civil

    • sender.income Renda anual (individual e familiar).

    • sender.occupationId Profissão. Utilize valores já conhecidos e retornados na consulta personOccupations, membros id.

    • sender.contact Contato

    • sender.address Endereço

    • sender.sourceOfFundsCode Identifica a fonte dos fundos utilizada pelo remetente.
      valores:
      01 -> Crédito
      02 -> Débito
      03 -> Pré-Pago
      04 -> Dinheiro
      05 -> Cheque
      06-16 -> Reservado para Uso Futuro
      17 -> Conta Corrente
      18 -> Conta Poupança
      19 -> Outro

Após ter retirado o valor da conta no cartão de origem, é possivel efetuar o envio deste valor para outra conta de cartão Elo ou à uma conta de depósito e assim concluir a transferência dos valores.

Essa mutation é utilizada para efetuar o recebimento de fundos que foram retirados através de uma transação previamente. Esta mutation é feita por um usuário portador de cartão (CardHolder), que estará referenciando dentro dela qual o cartão que foi utilizado.A identificação do usuário estará em seu access_token.

A referência ao cartão de origem desta transação é realizada através dos campos cardId ou sensitive, e as informações do usuário que receberá o valor estão no campo receiver.

O campo transferType é utilizado para diferenciar o tipo da transação de recebimento de fundos, podendo assumir os valores:

  • P2P - Transferência de pessoa para pessoa

  • CSB - Cashback

  • DSB - Desembolso

A seguir, a mutation para o recebimento de fundos:

mutation{
    createPushTransfer(
        input:{
            clientMutationId: "33333"
            transferType: P2P
            acquirer:{
                id: "d9325232-84fe-46ed-bd6c-ba010f99b7c7"
                countryCode: "BRA"
                  code: "01"
            }
            merchant: {
                name: "Teste"
                legalName: "Teste LTDA"
                description: "description merchant",
                legalIds:{
                    cnpj: "121212121212121"
                }
                contact:{
                    type: PHONE
                    context: "Trabalho"
                    value: "+5511999991111"
                }
                address:{
                    country: "Brasil"
                    city: "São Paulo"
                    state: "São Paulo"
                    zip: "123456788"
                    number: 1234
                    place: "Paulista"
                }
                url: "WWW.ELO.COM.BR",
                iso: 1111
                countryCode: "BRA"
                idCode: "123"
            }

            # Caso você possua um cartão já cadastrado basta utilizar seu cardId
            cardId: "1234"
            # se você não o possuir utilize o campo sensitive
            sensitive: "dasdpaiwqoedandk1993u1ekqkejqweuq90193ueqdm"

            amount:{
                currency: "BRL"
                value: "10.00"
            }

              #Informações de quem irá receber o valor transacionado
            receiver:{
                name: "João"
                legalIds:{
                    cpf: "1233133123457890"
                }
                address:{
                    country: "Brasil"
                    city: "São Paulo"
                    state: "São Paulo"
                    zip: "123456788"
                    number: 1234
                    place: "Paulista"
                }
                birthday: "1992-02-14"
                gender: MALE,
                maritalStatus: COMMON_LAW_MARRIED,
                sensitive: "dasdpaiwqoedandk1993u1ekqkejqweuq90193ueqdm",
                cipheredTransactionCryptogram: "M7uxALQqkH9IYOY4Qc09MsUqG87WZ6gMbindAab7yYaX6XrQG6bZOkBhjCkx4q1oZulHzJoUoZBQUdypm2VBV56Gc4vT7wOkjZOa",
                income: {
                    personal: 123.00,
                    family: 1234.00,
                    currency: "BRL"
                },
                occupationId: "926d8567-8dc1-45c1-83bd-d7e1a2532239",
                contact:{
                    type: PHONE
                    context: "Trabalho"
                    value: "+5511999991111"
                }
            }
            systemsTraceAuditNumber: "123"
            transactionDateTime: "2018-10-30T12:00:00-03:00"
            transactionIdentifier: "112"
            retrievalReferenceNumber: "123"
            codeUsage: 70
            origin: {
                geolocation: {
                    lon: 9,
                    lat: 8,
                    alt: 7,
                    precision: 6,
                    source: GPS
                },
                device: {
                    userAgent: "user AGENT",
                    brand: "BRAND",
                    model: "MODEL",
                    type: MOTORCYCLE,
                    serialNumber: "832809320983429804328",
                    imei: "098765432112345",
                    os: "77636363",
                }
            },
            pointOfService: {
                type: 3
                localization: 3
                cardPresentTransaction: false
                cardCaptureCapability: 0
                securityTransaction: 0
                typePOS: "M"
                inputCapability: "C"
                panEntryMode: "86"
                terminalIdentifier: "12345678"
            }
            transactionIdentifierPull: "3342b72f-2292-429b-b6e1-b9bc43e8c3a2"
            sourceOfFundsCode: "0"
        }
    )
    {
        clientMutationId        
        cardTransaction{
            id
            bin{ number }
            value
            status                    
        }
        receiver{
            name
            legalIds{
                cpf{ number }
            }            
        }
    }
}

Também utilizada para efetuar o recebimento de fundos, esta mutation é feita por um terceiro que necessite realizar a operação para um portador de cartão. Por esta razão, a mutation é realizada por um usuário que não seja portador de cartão (CardHolder).

A seguir, a mutation createPushTransferToUser:

mutation{
    createPushTransferToUser(
        input:{
            clientMutationId: "43434433"
            transferType: P2P
            acquirer:{
                id: "d9325232-84fe-46ed-bd6c-ba010f99b7c7"                                
                countryCode: "BRA"
                  code: "01"
            }
            merchant: {
                name: "Teste"
                legalName: "Teste LTDA"
                description: "Teste",
                legalIds:{
                    cnpj: "121212121212121"
                }
                contact:{
                    type: PHONE
                    context: "Trabalho"
                    value: "+5511999991111"
                }
                address:{
                    country: "Brasil"
                    city: "São Paulo"
                    state: "São Paulo"
                    zip: "123456788"
                    number: 1234
                    place: "Paulista"
                }
                url: "teste.com.br",
                iso: 1111
                countryCode: "BRA"
                idCode: "123"
            }            
            amount:{
                currency: "BRL"
                value: "10.00"
            }
            sender: {
                name: "Pedro da Silva"
                legalIds:{
                    cpf: "222222222222"
                }
                gender: MALE,
                maritalStatus: COMMON_LAW_MARRIED,
                income: {
                    personal: 123.00,
                    family: 1234.00,
                    currency: "BRL"
                },
                occupationId: "926d8567-8dc1-45c1-83bd-d7e1a2532239",
                contact:{
                    type: PHONE
                    context: "Trabalho"
                    value: "+5511999991111"
                }
                address:{
                    country: "Brasil"
                    city: "São Paulo"
                    state: "São Paulo"
                    zip: "123456788"
                    number: 1234
                    place: "Paulista"
                }
                birthday: "1992-02-14"
                sourceOfFundsCode: "19"
            }
            receiver:{
                name: "João da Silva"
                legalIds:{
                    cpf: "1233133123457890"
                }
                income: {
                    personal: 123.00,
                    family: 1234.00,
                    currency: "BRL"
                },
                occupationId: "926d8567-8dc1-45c1-83bd-d7e1a2532239",
                contact:{
                    type: PHONE
                    context: "Trabalho"
                    value: "+5511999991111"
                }
                address:{
                    country: "Brasil"
                    city: "São Paulo"
                    state: "São Paulo"
                    zip: "123456788"
                    number: 1234
                    place: "Paulista"
                }
                birthday: "1992-02-14"
                sensitive: "dasdpaiwqoedandk1993u1ekqkejqweuq90193ueqdm"
                cipheredTransactionCryptogram: "M7uxALQqkH9IYOY4Qc09MsUqG87WZ6gMbindAab7yYaX6XrQG6bZOkBhjCkx4q1oZulHzJoUoZBQUdypm2VBV56Gc4vT7wOkjZOa"
            }
            systemsTraceAuditNumber: "123"
            transactionDateTime: "2018-10-30T12:00:00-03:00"
            transactionIdentifier: "112"
            retrievalReferenceNumber: "123"
            codeUsage: 70
            origin: {
                geolocation: {
                    lon: 9
                    lat: 8
                    alt: 7
                    precision: 6
                    source: GPS
                }
                device: {
                    userAgent: "user AGENT"
                    brand: "BRAND"
                    model: "MODEL"
                    type: MOTORCYCLE
                    serialNumber: "832809320983429804328"
                    imei: "WS2@%4EEDD"
                    os: "77636363"
                }
            }    
            pointOfService: {
                type: 3
                localization: 3
                cardPresentTransaction: false
                cardCaptureCapability: 0
                securityTransaction: 0
                typePOS: "M"
                inputCapability: "C"
                panEntryMode: "86"
                terminalIdentifier: "12345678"
            }
            transactionIdentifierPull: "3342b72f-2292-429b-b6e1-b9bc43e8c3a2"
        }
    )
    {
        clientMutationId        
        cardTransaction{
            id
            bin{ number }
            last4
            value
            status                     
        }        
    }
}

Lembrando que esta mutation permite em seu retorno trazer os dados do sender e receiver para confirmar que a transação foi efetuada para as duas partes.

O campo transactionIdentifierPull pode ser preenchido para referenciar uma transação Pull feita anteriormente. Esse valor é um Identificador Global Único que pode ser obtido no payload das transações Pull.

NOTA: É importante notar que existem dois pares de mutations para efetuar a transferência com os dados de um usuário logado (createPullTransfer e createPushTransfer) e efetuar a transferência em nome de outra pessoa (createPullTransferToUser e createPushTransferToUser).

A API de P2P faz a validação de duplicidades nas transações. As regras para duplicidade são definidas a seguir.

O primeiro tipo de duplicidade é referente a identificação da transação. Cada app (client_id) tem que possuir um identificador de transação (campo transactionIdentifier) único para cada transação feita, independente do tipos retirada (pull) ou recebimento de fundos (push). Caso este valor se repita um erro de duplicidade será retornado.

O segundo tipo de verificação é referente aos dados da transação. Caso uma transação repita simultaneamente os valores dos campos retrievalReferenceNumber, transactionDateTime, amount.value e amount.currency (os dois últimos do objeto Amount) de uma transação anterior, é detectado duplicidade de transação e um erro será retornado.

Para casos em que a transação não tenha ocorrido com sucesso e houve algum erro (por exemplo, de conexão) em uma das etapas, é necessário informar as pontas que a transação não foi efetuada e a operação não deve ser mais realizada.

Esse processo é iniciado com a mutation de Aviso de Reversão, exibida a seguir:

mutation{
  createReverseTransactionNotification(
    input:{
      clientMutationId: "6548367",
      sensitive:"eyJhbGciOiJFQ0RILUVTIiwiZW5jIjoiQTEyOENCQy1IUzI1NiIsImVway...",
      transactionIdentifier:"1217",
      transactionDateTime: "2019-01-01T12:00:10-03:00",
      amount:{
        currency:"BRL",
        value:"150.00"
      },
      retrievalReferenceNumber:"6545",
      reasonCode:"01"
    }
  ){
    clientMutationId
    cardHolder{
      id
      name
      legalIds{
          cpf{ number }
      }
    }
    cardTransaction{
      id
      bin{ number }
      value
      status            
    }
  }
}

É preciso realizar o aviso de reversão dentro de 60 segundos após a realização da transação. Também é importante que, tirando o clientMutationId, que é uma propriedade da mutation em si, todos os campos tenham as mesmas informações da transação em questão. É através deles que os sistemas identificam qual transação precisa ser revertida.

Diferente do Aviso de Reversão, o processo de Reversão pode ser feito após o sucesso de uma Retirada ou Recebimento de Fundos, e é utilizado para desfazer uma destas etapas. Este fluxo é feito quando alguém quer desfazer uma transação realizada com sucesso. Ele tem um prazo maior para ser feito que o Aviso de Reversão.

É preciso enviar o cardId ou o sensitive do cartão envolvido na transação.

A reversão é feita através da mutation a seguir:

mutation{
    createReverseTransaction(
        input: {
            clientMutationId: "3232323"
            transactionId: "47025304-6554-45ba-a0a4-d93254b29a08"
            cardId: "39a94aca-2fb9-4cc6-b8fd-af7c4df63474"
            reasonCode: "076"
            authorization: {
                date: "2019-01-01T12:00:10-03:00"
                code: 1234
                decision: "Erro no envio"
            }
        }
    )
    {
        clientMutationId
        cardHolder{
            id
            name
            legalIds{
                cpf{ number }
            }
        }
        cardTransaction{
            id
            bin{ number }
            value
            status            
        }
    }
}

Para listar os dados de transações já efetuadas utilize as queries disponíveis na documentação de transações.

Para chamadas de Pull ou Push existe a possibilidade de timeout (tempo esgotado), pois há uma comunicação entre sistemas. Logo, quando houver um timeout, um Aviso de Reversão de transação deverá ser efetuado seguindo as regras definidas a seguir.

Existem dois tipos de timeouts, com código de status 504 ou com código de status 502.

O timeout com código 504 significa que a API irá fazer a notificação de reversão para as partes automaticamente. Neste caso o solicitante não precisa fazer a chamada.

Exemplo de retorno:

{
  "errors": [
    {
      "message": "{\"code\":\"504.001\",\"description\":\"Sent ISO message timeout\"}",
      "locations": [
        {
          "line": 2,
          "column": 2
        }
      ],
      "path": [
        "createPullTransfer"
      ]
    }
  ],
  "data": {
    "createPullTransfer": null
  }
}

O timeout com código 502 significa que a API não pode fazer a reversão. Neste caso o solicitante fica responsável por fazer a chamada de aviso de reversão utilizando a mutation createReverseTransactionNotification.

Exemplo de retorno:

{
  "errors": [
    {
      "message": "{\"code\":\"502.001\",\"description\":\"P2P Timeout - Send revert notification.\"}",
      "locations": [
        {
          "line": 2,
          "column": 2
        }
      ],
      "path": [
        "createPullTransfer"
      ]
    }
  ],
  "data": {
    "createPullTransfer": null
  }
}

Obs: O código de status retornado pelo GraphQL após o Pull ou Push será sempre 200 (OK) para a requisição, logo, os códigos 504 e 502 vem dentro do objeto error, no atributo code, definindo o valor do código de timeout, como demonstrado nos exemplos acima.