Webhook签名和请求

当 Waas Lite 请求商户设置的 webhook url 时:

  • Wass lite 将以 post 的方式请求。
  • POST提交数据时,请求头为 Content-Type: application/json,请求体的内容为JSON格式
  • 请求头同时包含x-timestampx-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-timestampx-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;


注意:

1、如果商户没设置webhook,系统将不会向商户进行任何的推送

2、one time payment订单完成时,为了兼容原来的callback处理,系统将会使用原来的方式和webhook机制同时向商户进行推送,请商户尽快完成切换。

3、请注意,one time payment 订单完成时的callback处理,原来的方式使用api_secret_key进行签名,webhook机制则使用webhook_secret_key 进行签名,如混淆了则签名验证将会失败。