jsapi签名

This commit is contained in:
2026-01-08 14:30:42 +08:00
parent 900254ac0b
commit ffed78f446
8 changed files with 376 additions and 3 deletions
+69
View File
@@ -21,6 +21,75 @@ class AuthService
return ['auth_url' => $feishu->authorize($certificate, $mobile)];
}
/**
* JSAPI鉴权签名
*/
public function feishuSignature(string $app_id, string $url = '')
{
$logic = new AuthLogic();
$certificate = $logic->feishuAppInfo($app_id);
$feishu = new Feishu($certificate['app_id'], $certificate['app_secret'], 'xinyouhe');
// 获取 jsapi_ticket
$jsapiTicket = $feishu->jsapiTicket();
// 处理 URL:移除 # 和 ? 后面的参数
$url = $this->cleanUrl($url);
// 生成随机字符串
$noncestr = $this->generateNonceStr();
// 获取毫秒级时间戳
$timestamp = (int)round(microtime(true) * 1000);
// 拼接签名字符串
$verifyStr = "jsapi_ticket={$jsapiTicket}&noncestr={$noncestr}&timestamp={$timestamp}&url={$url}";
// 生成 SHA1 签名
$signature = sha1($verifyStr);
return [
'jsapi_ticket' => $jsapiTicket,
'noncestr' => $noncestr,
'timestamp' => $timestamp,
'url' => $url,
'signature' => $signature
];
}
/**
* 清理 URL,移除 # 和 ? 后面的参数
*/
private function cleanUrl(string $url): string
{
// 移除 # 后面的内容
$pos = strpos($url, '#');
if ($pos !== false) {
$url = substr($url, 0, $pos);
}
// 移除 ? 后面的内容
$pos = strpos($url, '?');
if ($pos !== false) {
$url = substr($url, 0, $pos);
}
return $url;
}
/**
* 生成随机字符串(由数字、字母组成)
*/
private function generateNonceStr(int $length = 16): string
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$noncestr = '';
for ($i = 0; $i < $length; $i++) {
$noncestr .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $noncestr;
}
/**
* 登录,支持多类型
*/