PHP - 使用签名验证设置 Webhook Receiver

PHP - Setup Webhook Receiver with signature verification

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

中提供的签名

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

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

我已经创建了一个 Webhook 密钥(例如 'ABC123'),作为此 Webhook 验证请求的一部分,我必须确保使用 HMACSHA256 和您的 Webhook 密钥和 base64 编码进行哈希处理的有效负载应该匹配 header 中的签名。这是一个正确签名的负载。如果签名与散列有效负载不匹配,则它是错误签名的有效负载。

要获得 Intent to Receive 验证,接收方 url 必须对所有正确签名的有效载荷响应状态:200 Ok,并对所有错误签名的有效载荷响应状态:401 Unauthorized。

此时我有点不知该如何着手 - 可以在此处找到此设置的详细信息:

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

要将 sent-in 数据与 header 中的验证哈希匹配,您需要执行以下操作:

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

如果这不能直接工作,您将必须检查 $_SERVER 数组中的正确密钥;开头可能都是 upper-case。

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