php - shopify嵌入式应用程序hmac验证失败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,但也删除了协议和语言环境。
不过,使用这段代码,我的应用程序的测试版本被打破了,它实际上在包含协议和语言环境的情况下运行良好。
我在这里唯一的结论是,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;
}
推荐阅读
- javascript - 我们可以使用 javascript 压缩 PDF 文件吗?如果是,怎么做?如果不是,为什么?
- c++-cli - 如何在 CLI-C++ 中访问交错数组的项目
- sql - SQL Select 跳过与前一行重复的行
- bash - 如何在“find (...) -exec (...) {} \;”中替换 {} 中的字符串 bash 命令?
- dart - 飞镖颤动:运行窗口消息“I/zygote”“I/Choreographer”
- python - 如何生成总和为固定值的固定数量的正整数的随机正态分布
- javascript - 从 php 的下拉列表中选择时,自动在文本框中输入金额
- android - 在 kotlin 中循环
- angular-material2 - 将图标与按钮末尾对齐
- reactjs - 使用 Apollo、Graphql 的跨组件通信架构