5

我需要设置一个 PHP 页面来接收 Webhook - 我过去做过很多这样的事情,所以这不是问题,但是我正在为这个项目使用的 API 要求我的 webhook 验证标题中提供的签名.

作为验证请求的一部分,它将发送以下内容:

HEADER:
 "x-xero-signature" : HASH_VALUE
PAYLOAD:
{
   "events": [],
   "lastEventSequence": 0,
   "firstEventSequence": 0,
   "entropy": "S0m3r4N0m3t3xt"
}

我已经创建了一个 Webhook 密钥(例如“ABC123”),并且作为此 Webhook 验证请求的一部分,我必须确保使用 HMACSHA256 和您的 webhook 密钥和 base64 编码的有效负载应该与标头中的签名匹配。这是一个正确签名的有效载荷。如果签名与散列的有效负载不匹配,则它是一个错误签名的有效负载。

为了获得 Intent to Receive 验证,接收 url 必须以 status: 200 Ok 响应所有正确签名的有效负载,并以 status: 401 Unauthorized 响应所有未正确签名的有效负载。

在这一点上,我对如何进行此操作有点迷茫-可以在此处找到此设置的详细信息:

https://developer.xero.com/documentation/getting-started/webhooks

4

1 回答 1

7

要将传入的数据与标头中的验证哈希匹配,您需要执行以下操作:

  1. 获取有效载荷:
    $payload = file_get_contents("php://input");
  2. 使用有效负载和您的 webhook 密钥生成哈希:
    $yourHash = base64_encode(hash_hmac('sha256', $payload, $yourWebhookKey));
  3. 根据标题中提供的哈希值检查您的哈希值:
    if ($yourHash === $_SERVER['x-xero-signature']) {}

$_SERVER如果这不能直接工作,您将不得不检查数组是否有正确的键;一开始可能都是大写的。

编辑:正如OP所述,正确的变量是$_SERVER['HTTP_X_XERO_SIGNATURE']

于 2017-11-14T13:08:57.513 回答