Шифрование платежной карты

В целях обеспечения безопасности данные платежной карты шифруются с использованием RSA PKCS1

Для шифрования необходимо:

  1. Запрос GET https://prapi.tarlanpayments.kz/card/api/v1/encryption/public-key Запрос GET https://sandboxapi.tarlanpayments.kz/card/api/v1/encryption/public-key для получения publick_key с помощью которого шифруются данные карт используя алгоритм RSA PKCS1

  2. Формируем JSON. Для приема денежных средств необходимы все данные карты: {"pan":"4049121234345656","exp_month":"04","exp_year":"26","cvc":"123","full_name":"Test test"} Для вывод денежных средств необходимы только pan карты: {"pan":"4049121234345656"}

  3. Шифруем получившийся объект используя алгоритм RSA PKCS1 и публичный ключ

  4. Получившийся шифр кодируем в base64

Пример ответа GET https://prapi.test-tarlanpayments.kz/card/api/v1/encryption/public-key

{
  "status": true,
  "message": "Success",
  "result": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxTl2VCVIQ3R6WWexWfEt\n80+mwQLOwVRSsmmoFZhYnuCgtdthJlb4CJ+LTup19ttHdU0h43r3W4urNDWWFuxf\nlKsIuuztP4Zc44TV4gG7YkHmz+iP90JrYzhE4yMaMYv0jTJ1lXBGTHk+Sfoa2nGg\nIdB/onVGfX27W7yjv62yZ/7V/GZljxP/8V3x/KRm/i05B4hsSE3DWw2AX+dOtvSj\n/JYXu713nGh4lsj9/CABT/GHkwY33e14YwXAS4P7f/ixGdcFudKU1QxIorFqOK0W\nDURmfnnoBuL1ailkHWb8LIu7FXUEbKi0QpmKsV5UnFWNuIQKtE/Mt+P6UJ/oGtdc\nHQIDAQAB\n-----END PUBLIC KEY-----"
}
<?php
function encryptCard($pan) {
    $panData = json_encode(['pan' => $pan]);

    // Получаем публичный ключ
    $response = file_get_contents('https://prapi.tarlanpayments.kz/card/api/v1/encryption/public-key');
    if ($response === FALSE) {
        throw new Exception('Can not get public key');
    }

    $responseJson = json_decode($response, true);
    if (!isset($responseJson['result'])) {
        throw new Exception('Invalid response format');
    }

    $publicKeyPem = $responseJson['result'];

    // Декодируем публичный ключ из формата PEM
    $publicKey = openssl_pkey_get_public($publicKeyPem);
    if ($publicKey === FALSE) {
        throw new Exception('Failed to parse public key');
    }

    // Шифруем данные с использованием публичного ключа
    $encryptedCard = '';
    if (!openssl_public_encrypt($panData, $encryptedCard, $publicKey)) {
        throw new Exception('Failed to encrypt data');
    }

    // Возвращаем зашифрованную строку в формате base64
    return base64_encode($encryptedCard);
}

try {
    $pan = '4049121234345656'; // Пример PAN, который можно заменить на любой другой
    $encryptedCard = encryptCard($pan);
    echo "Encrypted Card: " . $encryptedCard . PHP_EOL;
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . PHP_EOL;
}
?>

Last updated