我目前正在使用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中看起来很简单。
答案 0 :(得分:3)
所以,getHTTPRequestData()returns a struct with a number of members。我们感兴趣的是内容,它将是一个字节数组。
MAC类'doFinal()方法需要一个字节数组(在我们的例子中是HTTP请求的内容)并返回一个字节数组(内容的HMac)
返回的字节数组需要进行base-64编码,以便将其与webhook标题中的Shopify放置进行比较。 toBase64()会为我们做到这一点。
总而言之,你得到这个:
toBase64(local.mac.doFinal(getHTTPRequestData().content))