@DTPlayer

Как здесь правильно сгенерировать сигнатуру?

Имеется такой код на PHP:
$secretKey = "6cc765db400218ab83394f4f3c8e00866b05a0vq";
$data = [
	'shopId' => "4d499d82-2b99-4a7e-be26-5742c41e69e7", 
	'orderId' => "6555214",
];

ksort($data);

// Сама сигнатура
$signature= hash_hmac("sha256", json_encode($data), $secretKey);

$data = json_encode($data + ['signature' => $signature]);

Пытаюсь преобразовать его в Python код
data = {
        'orderId': '6555214',
        'shopId': '4d499d82-2b99-4a7e-be26-5742c41e69e7',
    }
    sing = hmac.new("6cc765db400218ab83394f4f3c8e00866b05a0vq".encode(), str(data).encode(), hashlib.sha256).hexdigest()
    data['signature'] = sing

По итогу я получаю разные сигнатуры. В чем может быть проблема? Заранее спасибо за ваши ответы
  • Вопрос задан
  • 186 просмотров
Решения вопроса 1
drygdryg
@drygdryg
Python-разработчик
В вашем коде на PHP для генерации подписи используются закодированные в JSON данные (функция json_encode). Но в Python-версии вы просто преобразуете словарь в строку (str(data).encode()), в результате чего получаете не JSON, а строковое представление (representation) словаря. Вам следует использовать модуль json для кодирования словаря в JSON:
import hashlib
import hmac
import json

secret_key = "6cc765db400218ab83394f4f3c8e00866b05a0vq"
data = {
    'orderId': '6555214',
    'shopId': '4d499d82-2b99-4a7e-be26-5742c41e69e7'
}
signature = hmac.new(secret_key.encode(), json.dumps(data).encode(), hashlib.sha256).hexdigest()
data['signature'] = signature

Но если и это не даст желаемого результата, то обратите внимание на то, как работают кодировщики JSON в PHP и в Python, найдите различия. Возможно, в одном из них используются пробелы после разделителей, а в другом не используются — поэтому вы получаете разные JSON-строки для одних и тех же входных данных. В таком случае чтобы убрать пробелы после разделителей, нужно в json.encode нужно указать, какие использовать разделители (без пробелов):
signature = hmac.new(secret_key.encode(), json.dumps(data, separators=(',', ':')).encode(), hashlib.sha256).hexdigest()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы