shopify嵌入式应用程序hmac验证失败php

时间:2018-10-18 22:28:51

标签: php shopify

您好,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发送给我的哈希不同的哈希值,我猜测编码或转义有问题,我已经尝试了所有我能想到的东西(html特殊字符,urldecode,strreplace,doublecheck机密等) ..)

在urldecode行之后的字符串如下所示:

locale = zh-CN&protocol = https://&shop=mystorehandle.myshopify.com&timestamp=1539901099

任何帮助将不胜感激,我想在我的应用程序上完成一些工作,但是在过去的3个小时中,我一直试图将我的hmac与shopify的:(

我很确定自己做对了,但是对于为什么它不起作用一无所知。

我要买一个先知道答案的人

1 个答案:

答案 0 :(得分:1)

好吧...不要问我这是如何或为什么起作用的,但确实如此。经过2-3个小时的测试,我在黑暗中完全刺了一下,然后奏效了。我敢肯定,它只能奏效,因为Shopify方面存在错误。

我的嵌入式应用程序被依次获取GET参数hmac / shop / timestamp / protocol / locale。

出于某种原因,构建shop = [myshop]&timestamp = [timestamp]的查询字符串是可行的。

换句话说,我删除了hmac,但删除了ALSO协议和语言环境。

尽管使用此代码,但破坏了我的应用程序的TEST版本,该版本实际上在包含协议和区域设置的情况下都可以正常工作。

我唯一的结论是,hmac是从hmac之后的GET参数派生而来的,它们按字母顺序排列,并在以下参数不按此顺序停止时停止。

因此,如果GET参数是hmac / shop / timestamp / protocol / locale,请使用shop&timestamp生成哈希字符串。

如果GET参数是hmac / locale / protocol / shop / timestamp,请使用语言环境,协议,shop和时间戳生成哈希字符串。

太奇怪了。真的很想知道这是否也对您有用!

这是我的代码:

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;
}