Requerimentos para acesso
Para acesso a APIs é necessário abrir um cDê-para QR Code x Rechamado via Zendesk
Nota: Futuramente a geração de credenciais será feita via portal do desenvolvedor.
Macro fluxo de integração
Atualmente dentro da API de pagamentos existem três recursos utilizados para a integração, sendo eles:
- POST /access_token
 - GET /publicKeys
 - POST /payments
 

Ambientes
| Ambiente | Endereço | Descrição | 
|---|---|---|
| Homologação | apihom.cielo.com.br | Deve ser utilizado como o ambiente de desenvolvimento/testes de parceiro. | 
| Produção | api.cielo.com.br | Deve-se utilizar quando portar as credenciais de produção e um bom nível de maturidade com o ambiente de homologação. | 
Access Token
O recurso access_token é responsável pela autenticação utilizando protocolo OAuth 2.0. Com o client_id e client_secret em mãos a requisição ao POST /access_token deve ser feita portando os parâmetros client_id e authorization no Header e o grant_type no corpo da requisição, segue exemplo abaixo.
Nota: O valor do authorization deve ser composto da palavra Basic com o Base64 gerado a partir da concatenação do client_id:client_secret
Contrato
POST /cielo-payment/v1/access_token
Headers
Key Value client_id Authorization Content-Type application-json Body
{ "grant_type": "client_credentials" }
Exemplo de Requisição
curl --request POST \
  --url 'https:///cielo-payment/v1/access_token' \
  --header 'Authorization: ' \
  --header 'Content-Type: application/json' \
  --header 'client_id: ' \
  --data '{
    "grant_type": "client_credentials"
}
Exemplo de Resposta
{
  "access_token": "g7xDuftvHv5y3Dx3gnQvsOeSG0YN99FcS4NVOtihNflWTUUPgf",
  "token_type": "access_token",
  "expires_in": 600
}
Public Keys
Public keys é o recurso responsável por retornar a chave pública da criptografia utilizada para criptografar o número do cartão, que futuramente será enviado no corpo da requisição do recurso payment. O algoritmo de criptografia utilizada é RSA de 2048 bits e cifra RSA/ECB/PKCS1Padding. Para a requisição ao recurso GET /publicKeys é necessário client_id e o access_token que foi gerado no passo anterior.
Contrato
GET /cielo-payment/v1/publicKeys
Headers
Key Value client_id access_token {access_token} 
Exemplo de Requisição
curl --request GET \
  --url 'http:///cielo-payment/v1/publicKeys' \
  --header 'access_token: ' \
  --header 'client_id: 
Exemplo de Resposta
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmeiLngFr9h0npwe6D3ArSi10ZgdOCUCsUYT12KMuYsxImzwe9aGX8XXvzEF60E600ZjdvmYU64UnZKgfbttwNi+Tl7ZcB2cnS/oJMrfA0AbRHukJnL/fFsziHOjv0A1xRcE70ZbJRkob5A5s4GenF+jv/xCTOoIetFimZHZDiPPFux2NyrL3ZqSs7F4XJZvo2zPfCVlAcnEbVf+8vWX3goP2TEuAqZtBT543wIDAQAB+dqSzZSqZolYU1sjV7s8FzsjZYqo+AjM8BMuPlMoPEuBqgRFm4fSRIpeJIr0G9FokSU3X6MAZTvC7n3YePHFsFmGxPTrKpEFrp8s28f1qMP5suTsA
Criptografia
Exemplo de código Java para criptografar o número do cartão usando uma public key:
import java.security.PublicKey;
import java.util.Base64;
import javax.crypto.Cipher;
public class EncriptCard {
    public String encript(PublicKey key, String cardNumber) {
        try {
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] encryptedBytes =
                cipher.doFinal(cardNumber.getBytes());
            String encryptedCard =
                Base64.getEncoder().encodeToString(encryptedBytes);
            return encryptedCard;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
Payments
O recurso POST /payments é responsável por efetuar o pagamento com base nos dados contidos no payload da requisição. No header da requisição é necessário os dados de client_id, access_token, Content-type e wallet. Wallet representa a carteira digital da aplicação sendo única por app. O corpo da requisição é composto por dados provenientes do aplicativo e do QR Code. Verificar seção 3 para os campos extraídos do QR Code.
Contrato
POST /cielo-payment/v1/payments
Headers
Key Value client_id access_token Content-Type application/json wallet Body
{ "technology":{ "type":"QRCODE", "identifier":"13050329197F190A" }, "operationType":{ "id":1 }, "amount":1, "paymentInstallments":01, "terminalLogicalNumber":12345, "paymentDate":"2018-05-15T11:33:49Z", "mainProduct":{ "id":1000 }, "subProduct":{ "id":1 }, "merchantAccountInformation":{ "id":3456789012, "merchantName":"Hotelaria Accor Pdb Ltda" }, "card":{ "encryptedCardNumber": "KPzccLxuZFavn6FN5XhOsXdF19wrfiOleE0lCMixw+0E79YAVn659vDpKhy/D/EQnRbiKrrfRQYyQeek2cpyd5hiqtwK+4gdfUo8X4NpSYxDdk0n0ru1czg8hWn3Dl6LkQT8K/lOgfTttZQgQsmwPRBzhDImlzIav9E1Uqvzba3WWPrusCgGgE5oEMTGLjcmG1ZZByeXHiDmU5Pd9TomILj4nVFsoOWYtM5PZDn+1FfJ3lDLgND8asUMyLIqyQMZ3iDM6Rrgp/4Yj5082FNO++6ZMW2mPmlr4i2gmFi2sV4QayNuXX34mxrUw1kYpSetNVEL/okGzSaGxbN0O37Fug==", "holder":"JOAO DA SILVA", "expirationDate":"01/25", "brand":"VISA" }, "carrier":{ "name":"João da Silva", "document":"31727721012", "deviceId":"3ac43b36-0d92-48a7-901b-d3a527d9c3fe" }, "crc":{ >"qrCodeText":"00020101021226410005Cielo0116123456789012000102082009130352040000530398654120000000001005802BR5905CIELO6014SANTO ANDRE SP801010033”https://www.cielo.com.br/qrcode”011613050329197F190A0212150518113349030410000404000105020006020163049872" } }
| Propriedade | Descrição | Tipo | Tamanho | Obrigatório | 
|---|---|---|---|---|
technology.type | 
      Enviar “QRCODE” por padrão | Texto | 6 | Sim | 
technology.identifier | 
      Identificador da transação. Campo proveniente do QRCode, Veja layout | Texto alfanumérico | 16 | Sim | 
operationType.id | 
      Enviar o numeral 1 por padrão | Número | 1 | Sim | 
amount | 
      Valor da transação (em ambiente de homologação enviar apenas número inteiros). Campo proveniente do QRCode, Veja layout | Número | 16 | Sim | 
paymentInstallments | 
      Número de parcelas. Campo proveniente do QRCode, Veja layout | Número | 2 | Sim | 
terminalLogicalNumber | 
      Número lógico do POS. Campo proveniente do QRCode, Veja layout | Número | 40 | Sim | 
paymentDate | 
      Data e hora da transação. Campo proveniente do QRCode, Veja layout | Texto | 30 | Sim | 
mainProduct.id | 
      Produto matriz. Campo proveniente do QRCode, Veja layout | Número | 4 | Sim | 
subProduct.id | 
      Produto secundário. Campo proveniente do QRCode, Veja layout | Número | 4 | Sim | 
merchantAccountInformation.id | 
      Número do estabelecimento comercial. Campo proveniente do QRCode, Veja layout | Número | 10 | Sim | 
merchantAccountInformation.merchantName | 
      Nome do estabelecimento comercial. Campo proveniente do QRCode, Veja layout | Número | 1 | Sim | 
card.encryptedCardNumber | 
      Número do cartão criptografado, Veja mais | Sim | ||
card.holder | 
      Nome do portador impresso no cartão. | Número | 25 | Sim | 
card.expirationDate | 
      Data de validade impresso no cartão. | Texto | 7 | Sim | 
card.brand | 
      Bandeira do cartão. Consultar a lista de produtos e bandeiras aceitas no QRCode. | Texto | 10 | Sim | 
carrier.name | 
      Nome do usuário do aplicativo. | Texyo | 255 | Sim | 
carrier.document | 
      Documento do usuário do aplicativo, exemplo CPF. Enviar apenas número | Texto | 14 | Sim | 
carrier.deviceId | 
      Identificador único de cada dispositivo. | Sim | ||
crc.qrCodeText | 
      QRCode do POS | Sim | 
Exemplo de Requisição
curl --request POST \
 --url 'http:///cielo-payment/v1/payments' \
 --header 'Content-Type: application/json' \
 --header 'access_token: ' \
 --header 'client_id: ' \
 --data '{
 "technology":{
    "type":"QRCODE",
    "identifier":"13050329197F190A"
 },
 "operationType":{
    "id":1
 },
 "amount":1,
 "paymentInstallments":01,
 "terminalLogicalNumber":12345,
 "paymentDate":"2018-05-15T11:33:49Z",
 "mainProduct":{
    "id":1000
 },
 "subProduct":{
    "id":1
 },
 "merchantAccountInformation":{
    "id":3456789012,
    "merchantName":"Hotelaria Accor Pdb Ltda"
 },
 "card":{
    "encryptedCardNumber": "KPzccLxuZFavn6FN5XhOsXdF19wrfiOleE0lCMixw+0E79YAVn659vDpKhy/D/EQnRbiKrrfRQYyQeek2cpyd5hiqtwK+4gdfUo8X4NpSYxDdk0n0ru1czg8hWn3Dl6LkQT8K/lOgfTttZQgQsmwPRBzhDImlzIav9E1Uqvzba3WWPrusCgGgE5oEMTGLjcmG1ZZByeXHiDmU5Pd9TomILj4nVFsoOWYtM5PZDn+1FfJ3lDLgND8asUMyLIqyQMZ3iDM6Rrgp/4Yj5082FNO++6ZMW2mPmlr4i2gmFi2sV4QayNuXX34mxrUw1kYpSetNVEL/okGzSaGxbN0O37Fug==",
    "holder":"JOAO DA SILVA",
    "expirationDate":"01/25",
    "brand":"VISA"
 },
 "carrier":{
    "name":"João da Silva",
    "document":"31727721012",
    "deviceId":"3ac43b36-0d92-48a7-901b-d3a527d9c3fe"
 },
 "crc":{
    >"qrCodeText":"00020101021226410005Cielo0116123456789012000102082009130352040000530398654120000000001005802BR5905CIELO6014SANTO ANDRE SP801010033”https://www.cielo.com.br/qrcode”011613050329197F190A0212150518113349030410000404000105020006020163049872"
 }
}
Exemplo de Resposta
{
    "transactionDate": "2018-05-15T11:33:49.000-03:00",
    "terminalLogicalNumber": "12345",
    "authorizationCode": "8888",
    "nsu": "999"
}
| Propriedade | Descrição | Tipo | Tamanho | Obrigatório | 
|---|---|---|---|---|
transactionDate | 
      Data da transação (extraída do QRCode) | Texto | 36 | Sim | 
terminalLogicalNumber | 
      Número lógico do POS | Texto | 40 | Sim | 
authorizationCode | 
      Código de autorização da transação | Texto alfanumérico | 6 | Sim | 
nsu | 
      Número Sequencial Único | Texto | 50 | Sim | 
Dê-para QR Code x Recurso Payments
Para a composição do payload do /payments deve-se mesclar informações provenientes da leitura do QR Code e informações do cartão/portador via aplicativo. Na tabela abaixo é especificado o dê-para dos dados extraídos do QR Code para o payload da requisição.
Para mais informações dos campos provenientes do QR Code verificar o próximo item.
| QR Code | Recurso Payment | Obrigatório | 
|---|---|---|
| TransactionID | Technology.Identifier | Sim | 
| Transaction Amount | Amount | Sim | 
| Payment Installments | PaymentInstallments | Sim | 
| Logic Number | TerminalLogicalNumber | Sim | 
| Transaction Date | PaymentDate | Sim | 
| Main Product | MainProduct.Id | Sim | 
| Sub Product | SubProduct.Id | Sim | 
| Merchant Account Information | MerchantAccountInformation.Id | Sim | 
| Merchant Name | MerchantAccountInformation.Name | Sim | 
Nota: O campo MerchantAccountInformation.Id tem o tamanho máximo de 10 posições, ao extrair a informação referente no QR Code descontar os dois primeiros e os quatros últimos dígitos.
Layout do QR Code gerado pelo POS
Atualmente o POS cria o QR Code a partir das informações especificadas abaixo com base na especificação “EMVCo-Merchant-Presented-QR-Specification-v1”.

Os campos destacados e identificamos abaixo são provenientes da análise do QR Code. O ID do campo e seu tamanho são sempre enviados antes do valor correspondente.

Como Testar
Atualmente existem duas possibilidades para testar o fluxo de pagamento no ambiente de homologação.
Via QR Code
Caso não esteja com o POS de homologação em mãos, a maneira mais rápida para teste é utilizando o QR Code abaixo.
Posicional de exemplo:
“00020101021226410005Cielo0116123456789012000102082009130352040000530398654120000000001005802BR5905CIELO6014SANTO ANDRE SP801010033”https://www.cielo.com.br/qrcode”011613050329197F190A0212150518113349030410000404000105020006020163049872”
QR Code gerado a partir do código de exemplo:
Observação: Ao testar com o QR Code especificado um erro do tipo 422 é esperado, pois, não existe dados transacionais referentes no autorizador da Cielo.
Como obter o POS de homologação.
Para a obtenção do POS de homologação deve-se abrir chamado via Zendesk.
API de Callback (desfazimento)
Existe uma API de callback para enviar informações sobre as transações de desfazimento, que pode ocorrer no fluxo de transações entre o POS e a plataforma do sistema de autorização.
Será necessário com que o parceiro desenvolva uma API de retorno de chamada para receber as informações sobre aa transações de desfazimento e encaminhar a URL(endpoint) para nossa equipe através do Zendesk. Lembrando que a API de Callback deve ser gerada no formato restfull.
Requisição
{
   "transactionDate": "2018-10-29T14:35:12.000+0000",
   "terminalLogicalNumber": "78257509",
   "authorizationCode": "019387",
   "nsu": "572061",
   "merchantId": 1000000000,
   "amount": 82.90,
   "originalTransactionType": 1,
   "statusCode": 3
}
| Propriedade | Descrição | Tipo | Tamanho | Obrigatório | 
|---|---|---|---|---|
transactionDate | 
      Data da transação (extraída do QRCode) | Texto | 36 | Sim | 
terminalLogicalNumber | 
      Número lógico do POS | Texto | 40 | Sim | 
authorizationCode | 
      Código de autorização da transação | Texto alfanumérico | 6 | Sim | 
nsu | 
      Número Sequencial Único | Texto | 50 | Sim | 
merchantId | 
      Identificador da loja na Cielo (extraído do QRCode) | Número | 36 | Sim | 
amount | 
      Valor da transação | Número | 15 | Sim | 
originalTransactionType | 
      Transação de origem. Comunica o desfazimento de uma transação do /payments. | Número | 1 | Sim | 
statusCode | 
      1 - Pagamento / 2 - Cancelamento / 3 - Desfazimento - Quando desfazimento - statusCode = 3 | Número | 1 | Sim | 
Bandeiras e Formas de Parcelamento
A versão atual da API de QRCode possui suporte às seguintes bandeiras e formas de parcelamento:
| Bandeira | À vista | Parcelado Loja | Parcelado Emissor | Parcelado Cliente | 
|---|---|---|---|---|
| Visa | Sim | Sim | Sim | Sim | 
| Mastercard | Sim | Sim | Sim | Sim | 
| Elo | Sim | Sim | Sim | Sim | 
| American Express | Sim | Sim | Sim | Não | 
| Diners Club | Sim | Sim | Sim | Não | 
| JCB | Sim | Sim | Sim | Não | 
| Banescard | Sim | Sim | Sim | Não | 
| Hipercard | Sim | Sim | Sim | Não | 
Cartões emitidos no exterior não possuem permissão de parcelamento.
A solução de pagamento QR Code Cielo atualmente não aceita pagamentos no débito.
Códigos da API
Erros da API
| Código | Descrição | Modelo | 
|---|---|---|
| 201 | Created | |
| 400 | Bad Request. | {“description”:”Error full description.”,”type”:”string”} | 
| 401 | Unauthorized. | {“description”:”Error full description.”,”type”:”string”} | 
| 403 | Forbidden. | {“description”:”Error full description.”,”type”:”string”} | 
| 404 | Not Found. | {“description”:”Error full description.”,”type”:”string”} | 
| 412 | Precondition Failed. | {“properties”:{“code”:{“type”:”string”,”description”:”Error code.”},”description”:{“type”:”string”,”description”:”Error full description.”}}} | 
| 413 | Request Entity Too Large. | {“description”:”Error full description.”,”type”:”string”} | 
| 415 | Unsupported Media Type. | {“description”:”Error full description.”,”type”:”string”} | 
| 422 | Unprocessable Entity. | {“properties”:{“code”:{“type”:”string”,”description”:”Error code.”},”description”:{“type”:”string”,”description”:”Error full description.”}}} | 
| 429 | Too Many Requests. | {“description”:”Error full description.”,”type”:”string”} | 
| 500 | Internal Server Error. | {“properties”:{“code”:{“type”:”string”,”description”:”Error code.”},”description”:{“type”:”string”,”description”:”Error full description.”}}} | 
| 502 | Bad Gateway. | {“description”:”Error full description.”,”type”:”string”} | 
| 504 | Gateway Timeout. | {“description”:”Error full description.”,”type”:”string”} | 
Erros de Pagamento
| Código | Mensagem | 
| 412.001 | Não foi informado o NSU. | 
| 412.002 | Não foi informado o CAVV. | 
| 412.003 | O tipo de tecnologia utilizado no pagamento não foi informado. | 
| 412.004 | O tipo de operação para o pagamento não foi informado. | 
| 412.005 | Valor do pagamento não foi informado. | 
| 412.006 | O número de parcelas não foi informado. | 
| 412.007 | A data de pagamento não foi informado. | 
| 412.008 | O código do produto primário não foi informado. | 
| 412.009 | O código do produto secundário não foi informado. | 
| 412.010 | O código do estabelecimento comercial não foi informado. | 
| 412.011 | O nome do estabelecimento comercial não foi informado. | 
| 412.012 | O número do código não foi informado. | 
| 412.013 | O CPF do portador não foi informado. | 
| 412.014 | O nome do portador não foi informado. | 
| 412.015 | Device ID do aparelho celular não foi informado. | 
| 412.016 | O identificador da tecnologia utilizado no pagamento não foi informado. | 
| 412.017 | O status não foi informado. | 
| 412.018 | A data de validade do código não foi informado. | 
| 412.019 | O número do terminal lógico não foi informado. | 
| 412.023 | O código pagamento não foi informado. | 
| 412.024 | A bandeira do código não foi informada. | 
| 412.025 | O titular do código não foi informado. | 
| 412.028 | O tamanho máximo é de 10 caracteres para o estabelecimento comercial. | 
| 412.029 | O tamanho máximo é de 70 caracteres para o nome do estabelecimento comercial. | 
| 412.030 | O tamanho máximo é de 11 caracteres para o CPF do portador. | 
| 412.031 | O tamanho máximo é de 50 caracteres para o nome do portador. | 
| 412.032 | O tamanho máximo é de 8 caracteres para o terminal lógico. | 
| 412.033 | O id do cartão não foi informado. | 
| 412.034 | O id do carrier não foi informado. | 
| 412.035 | O nome do portador no cartão não pode conter caracteres especiais. | 
| 412.036 | O documento não foi informado. | 
| 412.037 | A senha não foi informada. | 
| 412.038 | O QR CodeTM informado não é válido. | 
| 412.039 | O QR CodeTM não foi informado. | 
| 422.001 | O produto primário não foi encontrado. | 
| 422.002 | O produto secundário não foi encontrado. | 
| 422.003 | A carteira digital não foi encontrada. | 
| 422.004 | O tipo de tecnologia não foi encontrado. | 
| 422.005 | O tipo de operação não foi encontrado. | 
| 422.006 | Falha ao detokenizar o cartão. | 
| 422.007 | Este cartão não pode ser utilizado. | 
| 422.008 | Este cartão informado não foi positivado. | 
| 422.009 | Este cartão informado não foi tokenizado. | 
| 422.010 | Não foi possível autenticar o portador com os dados informados. | 
| 422.011 | Transação não encontrada no Autorizador. | 
| 422.012 | Falha ao enviar dados ao Autorizador. | 
| 422.013 | ** Mensagem retornada do Autorizador ** | 
| 422.014 | Você errou o login/senha mais de 3 vezes. Seu usuário foi bloqueado, utilize esqueci minha senha para desbloquear. | 
| 422.017 | Ainda não aceitamos pagamentos com este cartão cadastrado. | 
| 422.018 | O usuário do pagamento não é o mesmo do login. | 
| 422.019 | Erro ao aplicar descriptografia. | 
| 422.020 | A string do cartão criptografado não está em um formato válido. | 
| 422.021 | QR Code expirado. Solicite a geração de um novo QR Code. | 
| 422.022 | Erro ao obter chave pública. | 
| 422.023 | Erro ao aplicar criptografia. | 
| 422.024 | Erro ao obter chave privada. | 
Dúvidas Frequentes
- 
    
Os testes devem ser feitos direto no ambiente de Homologação? R: Sim, infelizmente hoje não temos ambiente de desenvolvimento.
 - 
    
Qual o processo para adquirir as credenciais de Produção? R: Vide seção 1.
 - 
    
Qual criptografia é utilizada para criptografar o cartão? R: Vide seção 2.1.
 - 
    
A solução de pagamento QR Code Cielo atualmente aceita pagamentos no débito? R: Não.
 - 
    
O que seria o campo deviceID? R: Identificador único de cada dispositivo. Segue IOS: https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor, Android: https://developer.android.com/training/articles/user-data-ids.
 
Canal de Suporte a Dúvidas
Caso ainda tenha dúvidas deve-se abrir um chamado via Zendesk.
                                    
                                    
Observação: Ao testar com o QR Code especificado um erro do tipo 422 é esperado, pois, não existe dados transacionais referentes no autorizador da Cielo.