Хорошо, так ... не спрашивайте меня, как или почему это работает, но это работает.Через 2-3 часа я сделал полный удар в темноте, и это сработало.Я почти уверен, что это работает только потому, что есть ошибка на стороне Shopify.
Мое встроенное приложение получало в этом порядке GET-параметры hmac / shop / timestamp / protocol / locale.
По какой-то причине создание строки запроса shop = [myshop] × tamp = [timestamp] сработало.
Другими словами, я удалил hmac, но ТАКЖЕ протокол и локаль.
Использованиехотя этот код, BROKE ТЕСТОВАЯ версия моего приложения, которая фактически работала нормально с включенным протоколом и локалью.
Мой единственный вывод здесь заключается в том, что hmac получен из параметров GET после hmac, которые представлены в алфавитном порядке.порядок, остановка, когда следующий параметр не в этом порядке.
Так что, если GET-параметры - это hmac / shop / timestamp / protocol / locale - сгенерируйте вашу хеш-строку, используя shop & timestamp.
ЕслиПараметры GET: hmac / locale / protocol / shop / timestamp - генерируйте вашу строку хеша, используя locale, protocol, shop & timestamp.
Странно.Было бы очень интересно узнать, работает ли это и для вас!
Вот мой код:
parse_str($_SERVER['QUERY_STRING'], $queryStringArray);
$providedHmac = $_GET['hmac'];
unset($queryStringArray['hmac']);
$amp = '';
$i = 0;
foreach($queryStringArray as $key => $value)
{
$keyFirstLetter = substr($key, 0, 1);
if($i == 0 || $keyFirstLetter > $lastKeyFirstLetter)
{
$newQueryString .= $amp . $key . '=' . $value;
$amp = '&';
}
$lastKeyFirstLetter = $keyFirstLetter;
$i++;
}
$calculatedHmac = hash_hmac('sha256', $newQueryString, SHOPIFY_APP_SHARED_SECRET);
$hmacValid = false;
if($calculatedHmac == $providedHmac)
{
$hmacValid = true;
}