Autorização com cardHash

O que é cardHash?

É a criptografia dos dados de cartões através da criptografia RSA. Mais especificamente RSA com padding “RSA_PKCS1_PADDING” e chave de 2048 bits. Com a finalidade de ter maior segurança no transporte de dados do cartão.

Então, os dados número, código, mês e ano de vencimento do cartão passam pela criptografia RSA, depois são convertidos para Base64, concatenados com o SessionKey. E por fim no campo do payload onde ficam os dados da compra, o campo cardInfo armazena o cardHash que é composto pelos dados do cartão criptografados seguindo o passo a passo acima.

Podemos dividir o uso em etapas para que funcione corretamente.

1. Obter autorização

Para se obter a autorização, existem dois modos. O primeiro é pelo portal do Gateway, e a segunda forma é solicitando via e-mail

2. Obter chave pública e chave de sessão

Após obter a autorização, deve se usá-la para obter a chave pública e a chave de sessão (sessionKey). Usando a autorização no cURL como no exemplo a seguir:

curl --location --request GET 'https://apidemo.gate2all.com.br/v2/checkout/generate/public-key' \
--header 'Authorization: Basic OTI5QTQ5OUQyNUQ0QzVEQjM5OUM6NzJCRUM0MDY4NTM4MENBNTYxNkU='

REQUISIÇÃO

📘

GET

/v2/checkout/generate/publick-key

RESPOSTA

{
"publicKey": "----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArxaaBmRymdHfOzRXISKh9/YQfLLkcJXZzEtb5PNeWVxcpTU9Yym8Lsbq8UWtpZ6tkmHYCiwprRlBMZWbXUzaa3kSHNOXBR3y6u5kRSEcNJ/5Z3XCuczhjwD8NsxXDfB2kWxtKkKkqMFWpvk1yr2XBQtclUIDCH1EUTVEWdIiqAn1l6rZn9EIr/zjqVZDOiQqjkGzZo+Q/XeWld1z7/0ILNUvy0qj08/1v8N5nvTVW8J3DtZtl9XCBkjQdfKDmBmXLHi+wrM9UzfcmsCDjve6wquDxvnS/IXgeNefzZrlG6UML/sveTsexMOrTwP1GyinWzgqQGLR0E8ahILGhdQh+wIDAQAB\n-----END PUBLIC KEY-----",
"sessionKey": "d3fd3ef020ae48b7967236156ec35a2f"
}

O Card Hash gerado tem por padrão a vida de 10 minutos, porém isso pode ser alterado no momento em que a requisição for feita, onde o mínimo de tempo é de 1 minuto e o máximo é de 30 minutos. Para alterar o tempo de vida, basta adicionar o seguinte parâmetro, "?ttl=número desejado" após o "/public-key". Por exemplo, esse terá vida de 15 minutos:

REQUISIÇÃO

📘

GET

/v2/checkout/generate/public-key?ttl=15

O cURL para a requisição:

curl --location --request GET 'https://apidemo.gate2all.com.br/v2/checkout/generate/public-key?ttl=15' \
--header 'Authorization: Basic OTI5QTQ5OUQyNUQ0QzVEQjM5OUM6NzJCRUM0MDY4NTM4MENBNTYxNkU='

Enviar o hash gerado, na transação

Após fazer a configuração e criptografar os dados do cartão, é necessário enviar na transação o hash gerado no campo:

cardInfo.cardHash

REQUISIÇÃO

🚧

POST

/v1/transactions

📘

Os dados do cartão serão enviado criptografados no campo cardHash.

PROPRIEDADETIPOTAMANHOOBRIGATÓRIODESCRIÇÃO
cardInfo.cardHashTexto-NãoHash com os dados do cartão criptografados.
{
   "referenceId": "19893211234",
   "amount": "1000",
   "description": "Mouse sem fio",
   "payment": {
       "card": {
          "type": 1,
          "capture": false,
          "installments": 1,
          "interestType": 3,
          "authenticate": 3,
          "softDescriptor": "Pagamento GATE2all",
          "cardInfo": {
              "cardHash": "{hash-gerado-pela-lib}"
          }
       }
   }
}
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

URL obj = new URL("https://api.gate2all.com.br/v1/transactions");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();

con.setRequestMethod("POST");
con.setRequestProperty("content-type", "application/json");
con.setRequestProperty("authenticationApi", "demo");
con.setRequestProperty("authenticationKey", "demo");

String body = "{"
      + "\"referenceId\": \"123456789\","
      + "\"amount\": \"1000\","
      + "\"description\": \"TV LG 42\","
      + "    \"payment\": {"
      + "        \"card\": {"
      + "           \"type\": 1,"
      + "           \"capture\": true,"
      + "           \"installments\": 1,"
      + "           \"interestType\": 3,"
      + "           \"softDescriptor\": \"EC02\","
      + "           \"cardInfo\": {"
      + "               \"cardHash\": \"{hash-gerado-pela-lib}\""
      + "           }"
      + "        }"
      + "    }"
      + "   "
      + "}";

con.setDoOutput(true);
DataOutputStream dos = new DataOutputStream(con.getOutputStream());
dos.writeBytes(body);
dos.flush();
dos.close();

Scanner scanner = new Scanner(new BufferedReader(new InputStreamReader(con.getInputStream())));
String response = scanner.nextLine();
scanner.close();

System.out.println(response);

RESPOSTA

A resposta retornará todos os campos (como ocorre na autorização).

{
  "transactionId": "5a51ae6b-e91e-4b38-b596-e2acb77dca43",
  "referenceId": "1489093308860",
  "description": "Mouse sem fio",
  "amount": "1000",
  "status": 5,
  "dtTransaction": "2020-12-09T18:01:17",
  "payment": {
    "card": {
      "type": 1,
      "installments": 1,
      "capture": false,
      "authenticate": 3,
      "softDescriptor": "Pagamento GATE2all",
      "interestType": 3,
      "integrationType": 1,
      "provider": "CIELO",
      "providerVersion": "3.0",
      "providerReference": "10069930690009510E9A",
      "providerCode": "00",
      "providerMessage": "Transação autorizada",
      "saveCard": true,
      "cardInfo": {
        "number": "402400******2927",
        "expirationMonth": "04",
        "expirationYear": "2026",
        "cvv": "***",
        "brand": "VISA"
      }
    }
  }
}