1e12) { $ts = (int)($ts / 1000); } $now = time(); $expireSeconds = env('signature.expire_seconds', 300); if (abs($now - $ts) > $expireSeconds) { return false; } } catch (\Exception $e) { return false; } $sortedParams = []; foreach ($params as $k => $v) { $sortedParams[$k] = $v; } ksort($sortedParams); $paramParts = []; foreach ($sortedParams as $k => $v) { if ($v !== null && $v !== '') { $paramParts[] = "{$k}={$v}"; } } $paramStr = implode('&', $paramParts); $fullStr = $paramStr . '×tamp=' . $timestamp; $expectedSign = hash_hmac('sha256', $fullStr, $apiSecretHash); return strcasecmp($expectedSign, $signature) === 0; } /** * 生成签名(用于测试) * * @param array $params 请求参数 * @param string $timestamp 时间戳字符串 * @param string $apiSecret API Secret 明文 * @return string */ public static function sign($params, $timestamp, $apiSecret) { $sortedParams = []; foreach ($params as $k => $v) { $sortedParams[$k] = $v; } ksort($sortedParams); $paramParts = []; foreach ($sortedParams as $k => $v) { if ($v !== null && $v !== '') { $paramParts[] = "{$k}={$v}"; } } $paramStr = implode('&', $paramParts); $fullStr = $paramStr . '×tamp=' . $timestamp; return hash_hmac('sha256', $fullStr, $apiSecret); } }