[ 'app_id' => 'rsgxsyt371083', 'app_name' => '农发商城', 'app_secret' => 'T3t6wnKJ6CBn7eaH', 'status' => 1, // 1:启用 0:禁用 'created_time' => time(), ] ]; return $apps[$appId] ?? null; } /** * 验证签名 * @param array $params 请求参数 * @param string $appSecret 应用密钥 * @param int $timestamp 时间戳 * @param string $nonce 随机数 * @param string $signature 签名 * @return bool */ public static function verifySignature(array $params, string $appSecret, int $timestamp, string $nonce, string $signature): bool { // 构建签名字符串 $signString = self::buildSignString($params, $appSecret, $timestamp, $nonce); // 计算签名 $expectedSignature = hash('sha256', $signString); outFileLog($expectedSignature,'sign','$expectedSignature'); return hash_equals($expectedSignature, $signature); } /** * 构建签名字符串 * @param array $params * @param string $appSecret * @param int $timestamp * @param string $nonce * @return string */ private static function buildSignString(array $params, string $appSecret, int $timestamp, string $nonce): string { // 移除签名相关参数 unset($params['signature']); // 参数排序 ksort($params); // 构建查询字符串 $queryString = http_build_query($params); // 构建签名字符串: 参数字符串 + 时间戳 + 随机数 + 密钥 return $queryString . $timestamp . $nonce . $appSecret; } /** * 验证随机数(防重放攻击) * @param string $appId * @param string $nonce * @param int $timestamp * @return bool */ public static function verifyNonce(string $appId, string $nonce, int $timestamp): bool { $cacheKey = 'openapi_nonce_' . $appId . '_' . $nonce; // 检查随机数是否已使用 if (Cache::has($cacheKey)) { return false; } // 缓存随机数,过期时间为10分钟 Cache::set($cacheKey, $timestamp, 600); return true; } /** * 生成签名(供客户端使用) * @param array $params * @param string $appSecret * @param int $timestamp * @param string $nonce * @return string */ public static function generateSignature(array $params, string $appSecret, int $timestamp, string $nonce): string { $signString = self::buildSignString($params, $appSecret, $timestamp, $nonce); return hash('sha256', $signString); } }