Перейти к основному содержимому

Авторизация

Исходящие запросы

Для верификации всех исходящих запросов необходимо выполнить несколько шагов.

  1. Сформировать объект - body запроса.
  2. Добавить в объект поле publicKey - выданный публичный ключ Firstpay.
  3. Отсортировать в алфавитном порядке ключи в этом объекте.
  4. Сформировать строку вида key=value1|key2=value2|key3=value3.
  5. Закодировать полученную строку в base64.
  6. Полученную строку подписать с помощью приватного ключа мерчанта алгоритмом SHA256.
  7. Полученный результат также необходимо конвертировать в base64.
  8. В изначальный объект для запроса добавить поле hash, у которого значение - полученный результат.
  9. Запрос готов к отправке.

Пример кода на TS:

import {
createSign,
} from 'crypto';

const publicKey = '';
const privateKey = '';

function prepareMessage(message: IObject): string {
const res = Object
.keys(message)
.sort()
.map((key) => `${key}=${message[key]}`)
.join('|');

return Buffer.from(res).toString('base64');
}

function getSignedHash(message: IObject, privateKey: string): string {
const preparedMessage = prepareMessage(message);
const preparedPrivateKey = Buffer.from(privateKey, 'utf-8');

return createSign('SHA256')
.update(preparedMessage, 'base64')
.sign(preparedPrivateKey, 'base64');
}

const requestBody = {};

requestBody.publicKey = publicKey;
requestBody.hash = getSignedHash(requestBody, privateKey);

// Send request

Входящие запросы

Для верификации всех входящих запросов необходимо выполнить несколько шагов:

  1. Проверить наличие поля hash.
  2. Отделить body запроса от поля hash.
  3. Верифицировать поле hash с помощью оставшегося объекта и публичного ключа Firstpay.
  • Подготовить объект аналогично шагам 3-5 предыдущего раздела.
  • Верифицировать значение hash с помощью алгоритма SHA256.
import {
createVerify,
} from 'crypto';

const publicKey = '';
const privateKey = '';

function prepareMessage(message: IObject): string {
const res = Object
.keys(message)
.sort()
.map((key) => `${key}=${message[key]}`)
.join('|');

return Buffer.from(res).toString('base64');
}

function verifySignedHash(message: IObject, signedHash: string, publicKey: string): boolean {
const preparedMessage = Crypto.prepareMessage(message);

return createVerify('SHA256')
.update(preparedMessage, 'base64')
.verify(publicKey, signedHash, 'base64');
}

const requestBody = {};

if (!requestBody.hash) {
console.log('No hash');
}

const {hash, ...restBody} = requestBody;

if (!verifySignedHash(restBody, hash, publicKey)) {
console.log('Invalid signature');
}

// Do something