[英]shopify embedded app hmac verification failed php
嗨,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、doublecheck secret 等)。
urldecode 行之后的字符串如下所示:
locale=en&protocol= https://&shop=mystorehandle.myshopify.com×tamp=1539901099
任何幫助將不勝感激,我想在我的應用程序上完成一些工作,但過去 3 個小時一直在試圖讓我的 hmac 與 shopify 的同步:(
我很安靜,確定我做對了,但不知道為什么它那時不起作用。
我買餡餅給誰先知道答案。
好吧...不要問我這是如何或為什么工作,但它確實如此。 2-3 小時后,我在黑暗中完全刺傷了它,它奏效了。 我很確定它只能工作,因為 Shopify 方面存在錯誤。
我的嵌入式應用程序按此順序輸入 GET params hmac/shop/timestamp/protocol/locale。
出於某種原因,構建 shop=[myshop]×tamp=[timestamp] 的查詢字符串有效。
換句話說,我刪除了 hmac,但也刪除了協議和語言環境。
但是,使用此代碼,破壞了我的應用程序的 TEST 版本,該版本實際上在包含協議和語言環境的情況下運行良好。
我在這里唯一的結論是,hmac 是從 hmac 后面的 GET 參數派生出來的,它們是按字母順序排列的,當后面的參數不是這個順序時停止。
因此,如果 GET 參數是 hmac/shop/timestamp/protocol/locale - 使用商店和時間戳生成您的哈希字符串。
如果 GET 參數是 hmac/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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.