Перейти к содержанию

Получение карты

Метод для получения токена карты по проведенной транзакции.

URL

Метод: GET

  • Production: https://api.pay.kvell.groupv1/customers/{customer_key}/orders/{transaction}
  • Stage: https://api.pay.stage.kvell.group/v1/customers/{customer_key}/orders/{transaction}

Параметры запроса

Название Тип данных Обязательно Описание
customer_key string Да Идентификатор покупателя в системе продавца
transaction string Да Уникальный номер транзакции на стороне мерчанта

Заголовки запроса

Название Тип данных Обязательно Описание
X-Api-Key string Да Уникальный идентификатор магазина
X-Signature string Да Подпись

Подпись X-Signature формируется конкатенацией X-Api-Key, customer_key и secret_key. Формируется sha256 от полученной строки:

sha256({x-api-key}{transaction}{customer_key}{secret_key})

где secret_key - секретный ключ, который находится в настройках магазина мерчанта;

Ответ запроса

Параметры ответа

Название
Тип данных Описание
customer_key string Идентификатор покупателя в системе продавца
customer_card_token string Токен привязанной карты
pan_mask string Маска карты
holder string Имя держателя карты
expire string Срок действия карты в формате YYYY-MM
transaction string Уникальный номер транзакции на стороне мерчанта
pan_hash_encrypted string Зашифрованный хэш карты sha256(pan) с помощью публичного ключа магазина в base64-формате

Пример ответа

{
  "customer_key": "bind_card_test",
  "customer_card_token": "4VNSbS7nF410G8WLEhUUUnflH2UKvWlHxIzN3Jr9JJs",
  "pan_mask": "411111******1111",
  "holder": "IVAN IVANOV",
  "expire": "2028-12",
  "transaction": "563bb54d-ed4c-4ca1-84a3-6a35c0178cf5",
  "pan_hash_encrypted": "EPNS42BPO6yazHvd6BKd...ObPg6EKv7mYKUy7zc8s="
}
{
  "errors": [
    {
      "message": "string",
      "code": 0
    }
  ]
}

Примеры кода

from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization, hashes
import base64

# Чтение приватного ключа из PEM-файла
with open("private_key.pem", "rb") as key_file:
    private_key = serialization.load_pem_private_key(
        key_file.read(),
        password=None
    )

# Пример зашифрованного SHA256(PAN) (в base64)
encrypted_base64 = "base64_строка_от_pan_hash_encrypted"
encrypted_bytes = base64.b64decode(encrypted_base64)

# Расшифровка с использованием RSA-OAEP + SHA256
decrypted = private_key.decrypt(
    encrypted_bytes,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Расшифрованный SHA256(PAN):", decrypted.decode())
const forge = require('node-forge');
const fs = require('fs');

// Чтение приватного ключа из PEM-файла
const privateKeyPem = fs.readFileSync('privatekey.pem', 'utf8');
const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);

// Пример зашифрованного SHA256(PAN) (в base64)
const encryptedBase64 = 'base64_строка_от_pan_hash_encrypted';
const encryptedBytes = forge.util.decode64(encryptedBase64);

// Расшифровка с использованием RSA-OAEP + SHA256
const decryptedBytes = privateKey.decrypt(encryptedBytes, 'RSA-OAEP', {
  md: forge.md.sha256.create(),
  mgf1: {
    md: forge.md.sha256.create()
  }
});

console.log("Расшифрованный SHA256(PAN):", decryptedBytes);