实现SignatureValidator接口报错:类非有效签名验证器类
解决Webhook签名验证器接口实现报错问题
问题场景
需要实现Spatie Webhook Client的SignatureValidator接口:
<?php namespace Spatie\WebhookClient\SignatureValidator; use Illuminate\Http\Request; use Spatie\WebhookClient\WebhookConfig; interface SignatureValidator { public function isValid(Request $request, WebhookConfig $config): bool; }
编写的实现代码如下,但触发了接口未实现的错误:
<?php namespace App\Handler; use Illuminate\Http\Request; use Spatie\WebhookClient\WebhookConfig; use Spatie\WebhookClient\Exceptions\InvalidConfig; use Spatie\WebhookClient\SignatureValidator\SignatureValidator as SignatureValidator; class MySignatureValidator implements SignatureValidator { public function isValid(Request $request, WebhookConfig $config): bool { $signature = $request->header($config->signatureHeaderName); if (! $signature) { return false; } $signingSecret = $config->signingSecret; if (empty($signingSecret)) { throw InvalidConfig::signingSecretNotSet(); } $computedSignature = hash_hmac('sha256', $request->getContent(), $signingSecret); return true; //return hash_equals($signature, $computedSignature); } }
错误信息:
Spatie\WebhookClient\Exceptions\InvalidConfig:
App\Handler\MySignatureValidatoris not a valid signature validator class.
A valid signature validator is a class that implementsSpatie\WebhookClient\SignatureValidator\SignatureValidator
错误原因
代码中use语句将接口别名设置为与接口同名的SignatureValidator,导致PHP解析时出现混淆,无法正确识别你要实现的是Spatie提供的目标接口,等同于未正确实现该接口。
修复方案
修改use语句的别名设置,或者直接省略别名(当前命名空间下无同名类,不会冲突):
方案1:去掉别名
<?php namespace App\Handler; use Illuminate\Http\Request; use Spatie\WebhookClient\WebhookConfig; use Spatie\WebhookClient\Exceptions\InvalidConfig; use Spatie\WebhookClient\SignatureValidator\SignatureValidator; class MySignatureValidator implements SignatureValidator { // 原有方法代码保持不变 }
方案2:使用不同别名
<?php namespace App\Handler; use Illuminate\Http\Request; use Spatie\WebhookClient\WebhookConfig; use Spatie\WebhookClient\Exceptions\InvalidConfig; use Spatie\WebhookClient\SignatureValidator\SignatureValidator as SpatieSignatureValidator; class MySignatureValidator implements SpatieSignatureValidator { // 原有方法代码保持不变 }
另外,注意当前代码中临时返回true的逻辑,后续记得恢复注释掉的return hash_equals($signature, $computedSignature);,才能完成真实的签名验证逻辑。
内容的提问来源于stack exchange,提问作者bart
相关产品推荐
相关产品推荐

