我如何使用 stymiee/authnetjson 调试无效的 webhook 负载
How do i debug an invalid webhook payload using stymiee/authnetjson
我正在使用 stymiee/authnetjson
库在沙盒环境中使用和验证 authorize.net webhook。
我可以验证我的 headers 包括
X-ANET-Signature: sha512=C3CC15F7801AA304C0840C85E4F0222A15338827EE3D922DC13A6BB99DF4BFE7D8E235A623480C0EAF3151F7B008E4DFBFDC6E9F493A6901961C5CFC10143289
而我的jsonbody是
{"notificationId":"c5933ec1-2ef6-4962-a667-10552d19c481","eventType":"net.authorize.payment.authcapture.created","eventDate":"2018-01-20T20:36:54.9163559Z","webhookId":"66cf7109-f42f-45b9-bf36-f1ade83eac48","payload":{"responseCode":1,"authCode":"37ATT8","avsResponse":"Y","authAmount":550.00,"entityName":"transaction","id":"60038744863"}}
我设置了一个签名密钥,它看起来是正确的并且与库测试中的密钥相似
我的代码如下所示:
$signature_key = "...";
$headers = getallheaders();
$payload = file_get_contents("php://input");
$webhook = new JohnConde\Authnet\AuthnetWebhook($signature_key, $payload, $headers);
if ( ! $webhook->isValid() ) {
error_log("Payload not valid");
}
我也试过从构造函数 args
中删除 $headers
参数
当我执行测试交易时,它是无效的,所以我在日志中得到 'Payload not valid'。我该如何调试这个问题?
谢谢!
NFV
此问题是由于 X-ANET-Signature
区分大小写引起的。我最初正在寻找它,正如您所看到的那样,但另一个用户遇到了同样的问题,但他们得到的是 X-Anet-Signature
而不是代码所期望的。当我进行调试时,我看到了同样的问题,并认为我第一次编码时不知何故犯了一个错误,或者 Authnet 进行了更改,我需要适应。
显然这不是问题所在。我不确定为什么我们会看到这个 header 的案例不一致,但我会联系 Authorize.Net 看看我是否能找出故事是什么。
但修复很简单:更新库以使用 3.1.4 版,在检查此 header 的值时不区分大小写。
为了回答这个问题的字面标题,这里有一个调试这个问题的示例脚本:
<?php
namespace myapplication;
use JohnConde\Authnet\AuthnetWebhook;
// Include a configuration file with the Authorize.Net API credentials
require('./config.inc.php');
// Include my application autoloader
require('./vendor/autoload.php');
$errorCode = null;
$errorText = null;
$isValid = null;
try {
$headers = getallheaders();
$payload = file_get_contents("php://input");
$webhook = new AuthnetWebhook(AUTHNET_SIGNATURE, $payload, $headers);
$isValid = 'false';
if ($webhook->isValid()) {
$isValid = 'true';
}
$hashedBody = strtoupper(hash_hmac('sha512', $payload, AUTHNET_SIGNATURE));
$hash = explode('=', $headers['X-Anet-Signature'])[1];
$valid = strtoupper(explode('=', $headers['X-Anet-Signature'])[1]) === $hashedBody;
}
catch (\Exception $e) {
$errorCode = $e->getCode();
$errorText = $e->getMessage();
}
finally {
ob_start();
var_dump([
'errorCode' => $errorCode,
'errorText' => $errorText,
'isValid' => $isValid,
'headers' => $headers,
'payload' => $payload,
'hashedBody' => $hashedBody,
'hash' => $hash,
'valid' => $valid
]);
$dump = ob_get_clean();
file_put_contents('webhooks.txt', $dump, FILE_APPEND | LOCK_EX);
}
我正在使用 stymiee/authnetjson
库在沙盒环境中使用和验证 authorize.net webhook。
我可以验证我的 headers 包括
X-ANET-Signature: sha512=C3CC15F7801AA304C0840C85E4F0222A15338827EE3D922DC13A6BB99DF4BFE7D8E235A623480C0EAF3151F7B008E4DFBFDC6E9F493A6901961C5CFC10143289
而我的jsonbody是
{"notificationId":"c5933ec1-2ef6-4962-a667-10552d19c481","eventType":"net.authorize.payment.authcapture.created","eventDate":"2018-01-20T20:36:54.9163559Z","webhookId":"66cf7109-f42f-45b9-bf36-f1ade83eac48","payload":{"responseCode":1,"authCode":"37ATT8","avsResponse":"Y","authAmount":550.00,"entityName":"transaction","id":"60038744863"}}
我设置了一个签名密钥,它看起来是正确的并且与库测试中的密钥相似
我的代码如下所示:
$signature_key = "...";
$headers = getallheaders();
$payload = file_get_contents("php://input");
$webhook = new JohnConde\Authnet\AuthnetWebhook($signature_key, $payload, $headers);
if ( ! $webhook->isValid() ) {
error_log("Payload not valid");
}
我也试过从构造函数 args
中删除$headers
参数
当我执行测试交易时,它是无效的,所以我在日志中得到 'Payload not valid'。我该如何调试这个问题?
谢谢! NFV
此问题是由于 X-ANET-Signature
区分大小写引起的。我最初正在寻找它,正如您所看到的那样,但另一个用户遇到了同样的问题,但他们得到的是 X-Anet-Signature
而不是代码所期望的。当我进行调试时,我看到了同样的问题,并认为我第一次编码时不知何故犯了一个错误,或者 Authnet 进行了更改,我需要适应。
显然这不是问题所在。我不确定为什么我们会看到这个 header 的案例不一致,但我会联系 Authorize.Net 看看我是否能找出故事是什么。
但修复很简单:更新库以使用 3.1.4 版,在检查此 header 的值时不区分大小写。
为了回答这个问题的字面标题,这里有一个调试这个问题的示例脚本:
<?php
namespace myapplication;
use JohnConde\Authnet\AuthnetWebhook;
// Include a configuration file with the Authorize.Net API credentials
require('./config.inc.php');
// Include my application autoloader
require('./vendor/autoload.php');
$errorCode = null;
$errorText = null;
$isValid = null;
try {
$headers = getallheaders();
$payload = file_get_contents("php://input");
$webhook = new AuthnetWebhook(AUTHNET_SIGNATURE, $payload, $headers);
$isValid = 'false';
if ($webhook->isValid()) {
$isValid = 'true';
}
$hashedBody = strtoupper(hash_hmac('sha512', $payload, AUTHNET_SIGNATURE));
$hash = explode('=', $headers['X-Anet-Signature'])[1];
$valid = strtoupper(explode('=', $headers['X-Anet-Signature'])[1]) === $hashedBody;
}
catch (\Exception $e) {
$errorCode = $e->getCode();
$errorText = $e->getMessage();
}
finally {
ob_start();
var_dump([
'errorCode' => $errorCode,
'errorText' => $errorText,
'isValid' => $isValid,
'headers' => $headers,
'payload' => $payload,
'hashedBody' => $hashedBody,
'hash' => $hash,
'valid' => $valid
]);
$dump = ob_get_clean();
file_put_contents('webhooks.txt', $dump, FILE_APPEND | LOCK_EX);
}