В вашем коде на 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()