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

时间:2017-11-14 12:52:23

标签: php xero-api

我需要设置一个用于接收Webhooks的PHP页面 - 我以前做过很多这样的事情,这不是问题,但是我为这个项目工作的API需要我的webhook验证标题中提供的签名。

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

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

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

要获得Intent接收验证,接收URL必须以状态响应:200 Ok所有正确签名的有效负载并以状态响应:401未授权所有错误签名的有效负载。

关于如何解决这个问题,我现在有点迷失了 - 有关此设置的详细信息,请点击此处:

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

1 个答案:

答案 0 :(得分:6)

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

  1. 获取有效负载:
    $payload = file_get_contents("php://input");
  2. 使用有效负载和您的webhook密钥生成哈希:
    $yourHash = base64_encode(hash_hmac('sha256', $payload, $yourWebhookKey));
  3. 根据标题中提供的哈希检查您的哈希:
    if ($yourHash === $_SERVER['x-xero-signature']) {}
  4. 如果不能直接使用,您必须检查$_SERVER数组中是否有正确的密钥;它可能都是大写的。

    修改:如OP所述,正确的变量为$_SERVER['HTTP_X_XERO_SIGNATURE']