встроенная программа shopify hmac не прошла проверку php - PullRequest
0 голосов
/ 19 октября 2018

Привет, shopify, гуру. Я знаю, что этот вопрос возникал тысячу раз, я знаю это, потому что я прочитал все темы, которые смог найти.

Проверка моего приложения работала нормально, но теперь, когда я переключился навстроенное приложение, кажется, я не могу проверить hmac.

    //Remove hmac from hash comparison
    $hmac = $data['hmac'];
    unset($data['hmac']);

    //sort the values alphabetically
    ksort($data);
    $data = urldecode(http_build_query($data));

    $hash = hash_hmac('sha256', $data, $this->ci->get('settings')['shopify']['api_secret']);

Этот код будет возвращать другой хеш из hmac shopify, отправленного мне, я предполагаю, что есть проблема с кодировкой или экранированием,Я перепробовал все, что мог придумать (htmlspecialchars, urldecode, strreplace, секрет двойной проверки и т. Д.)

строка выглядит так после строки urldecode:

locale = en & protocol = https://&shop=mystorehandle.myshopify.com&timestamp=1539901099

Буду признателен за любую помощь, я хотел сделать некоторую работу над моим приложением, но последние 3 часа были заполнены попытками синхронизировать мой hmac с shopify: (

Я уверен, что все делаю правильно, но понятия не имею, почему это не сработает.

Я покупаю пирог для тех, кто первым знает ответ.

1 Ответ

0 голосов
/ 21 октября 2018

Хорошо, так ... не спрашивайте меня, как или почему это работает, но это работает.Через 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...