【发布时间】:2014-01-24 12:46:33
【问题描述】:
我目前正在使用 Shopify 并使用他们的 webhook 通知,以便将内容保存到我们的数据库中。
在其 webhook 标头中,它们提供以下标头:X-Shopify-Hmac-Sha256
即:
每个 Webhook 请求都包含一个 X-Shopify-Hmac-SHA256 标头,该标头使用应用的共享密钥(类似于:'267bb1719a8e6ff75c4f2d709be0ca11')以及请求中发送的数据生成。
这真是太棒了;但是,我真的很难计算X-Shopify-Hmac-Sha256 的值。
我有一个.cfm webhook 访问的页面,我通过getHTTPRequestData 传递给这样的函数:
<cfscript>
variables.stArgs = {};
variables.stArgs.stWebHookData = getHTTPRequestData();
application.stObj.stShopify.oShopifyWebHookBusiness.receiveWebHook(argumentCollection=variables.stArgs);
</cfscript>
然后我从 StackOverflow 和 Ben Nadel 那里窃取了一些代码,但似乎都没有最终给我想要的价值。目前我正在使用这样的 Ben Nadels 代码:
local.data = arguments.stWebHookData.toString();
local.macClass = createObject( "java", "javax.crypto.Mac" );
local.secretkeySpec = createObject( "java", "javax.crypto.spec.SecretKeySpec" ).init(toBinary(toBase64(arguments.key)),'HmacSHA256');
local.mac = local.macClass.getInstance('HmacSHA256');
local.mac.init(local.secretkeySpec );
local.hashedBytes = local.mac.doFinal(toBinary(toBase64(local.data)));
return lcase( binaryEncode( local.hashedBytes, "base64" ) );
(arguments.key 是共享密钥)
在路上的某个地方,我走错了。我是否完全误解了我应该做的事情。这在 PHP 中看起来很简单。
【问题讨论】:
-
他们是否提供了您可以匹配的具体示例?您确实需要一个示例来帮助您确定问题是散列代码还是您正在散列的 data。 (通常问题是请求数据..或者它是如何构造的。)
-
哦,我多么希望他们这样做。它们显示了如何在 PHP 和 ruby 中验证它,但它们没有显示已发送的实际请求。昨晚我试图使用 phpfiddle 从 PHP 进行逆向工程,但无法使用我从
getHTTPRequestData().toString()和ToString(getHTTPRequestData().content)存储的内容使其正常工作,这可能是错误的。 -
toBase64(local.mac.doFinal(getHTTPRequestData().content))有效吗?内容可能会被 CF 作为字节数组处理,这正是 doFinal() 所期望的 -
@barnyr 请把它作为答案。你刚刚赢得了我的尊重和钦佩。
-
@Jarede,很高兴它成功了!似乎没有 CF 或 Java 示例,所以希望这对其他人也有用
标签: java coldfusion shopify hmac