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

use*_*124 4 php xero-api

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

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

HEADER:
 "x-xero-signature" : HASH_VALUE
PAYLOAD:
{
   "events": [],
   "lastEventSequence": 0,
   "firstEventSequence": 0,
   "entropy": "S0m3r4N0m3t3xt"
}
Run Code Online (Sandbox Code Playgroud)

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

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

关于如何解决这个问题,我现在有点迷失了 - 这个设置的细节可以在这里找到:

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

jer*_*oen 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']) {}

$_SERVER如果不能直接使用,您必须检查数组中是否有正确的密钥; 一开始可能都是大写的.

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

  • 谢谢 - 这真的帮助我度过了这个.我不得不使用这种格式来获取标题值`$ _SERVER ['HTTP_X_XERO_SIGNATURE']` (2认同)
  • 对于使用此代码且仍然存在"响应不是200"问题的任何人,请将值"true"添加到hash_hmac函数的可选"Raw output"参数中,这应该让它适合您. (2认同)