shopify hmac验证php
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shopify hmac验证php相关的知识,希望对你有一定的参考价值。
这是我的代码:
function verifyRequest($request, $secret) {
// Per the Shopify docs:
// Everything except hmac and signature...
$hmac = $request['hmac'];
unset($request['hmac']);
unset($request['signature']);
// Sorted lexilogically...
ksort($request);
// Special characters replaced...
foreach ($request as $k => $val) {
$k = str_replace('%', '%25', $k);
$k = str_replace('&', '%26', $k);
$k = str_replace('=', '%3D', $k);
$val = str_replace('%', '%25', $val);
$val = str_replace('&', '%26', $val);
$params[$k] = $val;
}
echo $http = "protocol=". urldecode("https://").http_build_query( $params) ;
echo $test = hash_hmac("sha256", $http , $secret);
// enter code hereVerified when equal
return $hmac === $test;
}
来自我的代码创建的shopi和hmac的hmac不匹配。
我究竟做错了什么?
答案
您只需在创建键值对列表时包含请求参数 - 不需要“protocol = https://”。
https://help.shopify.com/api/getting-started/authentication/oauth#verification
你需要urldecode()http_build_query()的结果。它返回一个url编码的查询字符串。
http://php.net/manual/en/function.http-build-query.php
代替:
echo $http = "protocol=". urldecode("https://").http_build_query( $params) ;
echo $test = hash_hmac("sha256", $http , $secret);
像这样的东西:
$http = urldecode(http_build_query($params));
$test = hash_hmac('sha256', $http, $secret);
另一答案
可以使用sha256加密算法以任何编程语言计算hmac。
然而,shopify提供了hmac验证的文档,但仍然存在应用程序开发人员如何正确实现它的混淆。
这是php中用于hmac验证的代码。参考。 http://code.codify.club
<?php
function verifyHmac()
{
$ar= [];
$hmac = $_GET['hmac'];
unset($_GET['hmac']);
foreach($_GET as $key=>$value){
$key=str_replace("%","%25",$key);
$key=str_replace("&","%26",$key);
$key=str_replace("=","%3D",$key);
$value=str_replace("%","%25",$value);
$value=str_replace("&","%26",$value);
$ar[] = $key."=".$value;
}
$str = join('&',$ar);
$ver_hmac = hash_hmac('sha256',$str,"YOUR-APP-SECRET-KEY",false);
if($ver_hmac==$hmac)
{
echo 'hmac verified';
}
}
?>
另一答案
这应该是完美的工作:D
function verify_hmac()
{
$hmac='5aee2efb4ec03885b.....f248db8a2a7e24532a156e';
$str ='locale=en&shop=appName.myshopify.com×tamp=112242913';
$ver_hmac = hash_hmac('sha256',$str,env('SHOPIFY_SECRET'),false);
if($ver_hmac==$hmac)
{
return 'hmac verified';
}
return ':( no';
}
以上是关于shopify hmac验证php的主要内容,如果未能解决你的问题,请参考以下文章
Shopify 在 Scala 中验证 webhook 调用
在NestJS 中添加对Shopify 的WebHook 验证