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 中的验证哈希匹配,您需要执行以下操作:
- 获取载荷:
$payload = file_get_contents("php://input");
- 使用负载和您的 webhook 密钥生成哈希:
$yourHash = base64_encode(hash_hmac('sha256', $payload, $yourWebhookKey));
- 根据 header:
if ($yourHash === $_SERVER['x-xero-signature']) {}
中提供的哈希值检查您的哈希值
如果这不能直接工作,您将必须检查 $_SERVER
数组中的正确密钥;开头可能都是 upper-case。
编辑: 如 OP 所述,正确的变量是 $_SERVER['HTTP_X_XERO_SIGNATURE']
我需要设置一个 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 中的验证哈希匹配,您需要执行以下操作:
- 获取载荷:
$payload = file_get_contents("php://input");
- 使用负载和您的 webhook 密钥生成哈希:
$yourHash = base64_encode(hash_hmac('sha256', $payload, $yourWebhookKey));
- 根据 header:
if ($yourHash === $_SERVER['x-xero-signature']) {}
中提供的哈希值检查您的哈希值
如果这不能直接工作,您将必须检查 $_SERVER
数组中的正确密钥;开头可能都是 upper-case。
编辑: 如 OP 所述,正确的变量是 $_SERVER['HTTP_X_XERO_SIGNATURE']