sp-worlds/api-docs

Hash тела запроса

Closed this issue · 4 comments

Я не понял как работает система подтверждения запроса с вашего сайта при оплате АРами. Если я правильно понял, то мне нужно взять JSON из тела запроса, затем создать его хэш, использовав как ключ токен карты, затем закодировать в base64 и сравнить с хедером x-body-hash. Однако в самом хедере содержится какая-то непонятная сама по себе строка, которая при декодировании выдаёт непонятный результат, явно не совпадающий с хешем. Что я делаю не так?

Для этого в хедерах запроса есть хедер X-Body-Hash который содержит закодированный в base64 SHA256 HMAC хеш тела запроса, использующий как ключ api токен вашей карты. При приеме запроса вы сначала должны сгенерировать свой хеш и убедиться что он совпадает с хедером, прежде чем обрабатывать запрос.

С помощью HMAC нужно закодировать токен и тело запроса в SHA256, которую затем всё в base64 и опять же с помощью HMAC сравнить подлинность того что вышло с X-Body-Hash хедером.

Было бы круто увидеть код, может дело в нём.

В доке всё нормально написано и тем более всегда можно посмотреть код библиотек или посмотреть пример с моей python библиотеки

Для этого в хедерах запроса есть хедер X-Body-Hash который содержит закодированный в base64 SHA256 HMAC хеш тела запроса, использующий как ключ api токен вашей карты. При приеме запроса вы сначала должны сгенерировать свой хеш и убедиться что он совпадает с хедером, прежде чем обрабатывать запрос.

С помощью HMAC нужно закодировать токен и тело запроса в SHA256, которую затем всё в base64 и опять же с помощью HMAC сравнить подлинность того что вышло с X-Body-Hash хедером.

Было бы круто увидеть код, может дело в нём.

В доке всё нормально написано и тем более всегда можно посмотреть код библиотек или посмотреть пример с моей python библиотеки

Я использую php, вот мой код:

include dirname(__DIR__)."/database/connection.php"; //подключение к базе данных
    $file=fopen("test.txt","w");//тест работы скрипта
    $post=file_get_contents('php://input');//получение json из post
    $header=getallheaders()['X-Body-Hash'];//получение хедера
    $hash=base64_encode(hash_hmac("sha256",$post,"((токен))"));//получение хэша
    if(hash_equals($hash,$hedaer)){
        fwrite($file,"2");//тест что скрипт работает нормально
    }

Как раз двойки в файле не появляется. На форумах пишут, что php не работает с base64 напрямую и нужно сначала декодить, но при декоде мне вылезает это �zmH����Wb+O��3-9''.

((случайно закрыл))

Ура, я разобрался с проблемой. Оказывается hash был бинарным, а php по дефолту делает его нормальным, если не указывать специальный параметр. Но так как о нём нигде не было написано, мне даже в голову не пришло его поставить. @ronanru просьба написать, что Хэш бинарный, чтобы в будущем у таких людей как я не возникало проблем. Также стоило бы добавить информацию про хедер Content-Type: application/json в документации запросов, которые этого требуют.