当 Waas Lite 请求商户设置的 webhook url 时:
- Wass lite 将以
post的方式请求。 - POST提交数据时,请求头为
Content-Type: application/json,请求体的内容为JSON格式。 - 请求头同时包含
x-timestamp和x-signature两个参数,用于校验请求数据的完整性。
关于签名:
- 完整获取post提交请求的body数据,该数据不需要做任何处理。
// get post data
$post_data = file_get_contents('php://input');
// $post_data = '{"type":"one_time_payment_order_callback","data":{"third_order_sn":"","client_name":"","order_sn":"68a6ecd13ad2b","title":"","subject":"","amount":"2.0000000000000000","filled_amount":"3.0000000000000000","token":"usdt","status":"paid"}}';- 获取header 的
x-timestamp和x-signature数据。
// header
// x-timestamp: 1760427849
// x-signature: as8YtJ74WLnjCt2U4vpIqZpYQn7leqGidnmoQckl9iM=
$x_timestamp='1760427849';
$x_signature='as8YtJ74WLnjCt2U4vpIqZpYQn7leqGidnmoQckl9iM=';- 构建签名字符串
$string_to_signature = $post_data.$x_timestamp;- 使用 hmac-sha256 算法和 webhook secret key 对数据进行签名, 并对二进制签名进行Base64编码。
$webhook_secret_key = '123456';
$signature = hash_hmac('sha256', $string_to_signature, $webhook_secret_key, true);
$base64_signature = base64_encode($signature);
// $base64_signature = 'as8YtJ74WLnjCt2U4vpIqZpYQn7leqGidnmoQckl9iM='
- 生成的签名和header的x-signature进行对比。
完整的请求示例:
// get post data
$post_data = file_get_contents('php://input');
// $post_data = '{"type":"one_time_payment_order_callback","data":{"third_order_sn":"","client_name":"","order_sn":"68a6ecd13ad2b","title":"","subject":"","amount":"2.0000000000000000","filled_amount":"3.0000000000000000","token":"usdt","status":"paid"}}';
// header
// x-timestamp: 1760427849
// x-signature: as8YtJ74WLnjCt2U4vpIqZpYQn7leqGidnmoQckl9iM=
$x_timestamp='1760427849';
$x_signature='as8YtJ74WLnjCt2U4vpIqZpYQn7leqGidnmoQckl9iM=';
$string_to_signature = $post_data.$x_timestamp;
$webhook_secret_key = '123456';
$signature = hash_hmac('sha256', $string_to_signature, $webhook_secret_key, true);
$base64_signature = base64_encode($signature);
// $base64_signature = 'as8YtJ74WLnjCt2U4vpIqZpYQn7leqGidnmoQckl9iM='
return $base64_signature == $x_signature;