Я пытаюсь использовать hash_hmac sha256
для создания цифровой подписи в php
, но проблема в том, что результат не эквивалентен api
результату, который записывается с C#
. вот код C#
:
public static String createSignature(string apiSecret, long nonce, string customerId, string apiKey)
{
byte[] keyBytes = StringToByteArray(apiSecret);
using (HMACSHA256 hmac = new HMACSHA256(keyBytes))
{
byte[] data = hmac.ComputeHash(Encoding.UTF8.GetBytes(nonce + customerId + apiKey));
return bytesToHex(data);
}
}
public static String bytesToHex(byte[] bytes)
{
char[] hexArray = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] hexChars = new char[bytes.Length * 2];
for (int j = 0; j < bytes.Length; ++j)
{
int v = bytes[j] & 255;
hexChars[j * 2] = hexArray[(uint)v >> 4];
hexChars[j * 2 + 1] = hexArray[v & 15];
}
return new String(hexChars);
}
public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
и вот мой php
код:
$string = $nonce.$customer.$api_key;
$signature = hash_hmac("sha256", utf8_encode($string), utf8_encode($api_secret));
Я могу изменить код php
только в соответствии с результатом C#
. до сих пор я использовал utf8_encode
, base64_encode
и простой string
в качестве входных данных в hash_hmac
functon, которые все имеют отличные результаты от версии C#
.
Примечание: для тестирования я использовал фиксированные nonce
, customer
и api_key
и secret
в php
и C#
p.s: Я знаю, что на сайте есть несколько вопросов с рабочими решениями по этой теме. Я попробовал большинство из них, и ни один из них не работал для меня.