This commit is contained in:
2026-02-26 10:46:16 +08:00
parent 7ac5bcd516
commit f7fa768da1
4 changed files with 150 additions and 1 deletions
+121
View File
@@ -225,4 +225,125 @@ class Feishu
// ];
// return $this->requestResult($url);
// }
/**
* 获取 JSAPI 配置(签名)
* @param string $url 当前页面完整 URL(不包含 # 后面的内容)
* @return array
*/
public function getJsApiConfig($url)
{
// 1. 获取 tenant_access_token
//$accessToken = $this->getTenantAccessToken();
$accessToken = $this->tenantAccessToken();
// 2. 获取 jsapi_ticket
$ticket = $this->getJsapiTicket($accessToken);
// 3. 生成签名参数
$timestamp = time();
$nonceStr = $this->generateNonceStr();
// 4. 生成签名
$signature = $this->generateSignature($ticket, $nonceStr, $timestamp, $url);
return [
'appId' => $this->appId,
'timestamp' => $timestamp,
'nonceStr' => $nonceStr,
'signature' => $signature
];
}
/**
* 获取 jsapi_ticket
* @param string $accessToken
* @return string
*/
private function getJsapiTicket($accessToken)
{
// 检查缓存
$cachedTicket = Cache::get($this->abbr.'-feishu:jsapi_ticket');
// $cachedTicket = $this->getCachedData('feishu:jsapi_ticket');
if ($cachedTicket) {
return $cachedTicket;
}
$url = $this->baseUri . '/open-apis/jssdk/ticket/get';
$headers = [
'Authorization: Bearer ' . $accessToken,
'Content-Type: application/json'
];
$result = $this->httpGet($url, $headers);
if ($result['code'] !== 0) {
throw new BusinessException('获取 jsapi_ticket 失败: ' . json_encode($result));
}
$ticket = $result['ticket'];
$expire = $result['expire_in'] - 300; // 提前5分钟过期
// 缓存 ticket
Cache::set($this->abbr.'-feishu:jsapi_ticket', $ticket, $expire);
// $this->setCachedData('feishu:jsapi_ticket', $ticket, $expire);
return $ticket;
}
/**
* 生成签名
* @param string $ticket
* @param string $nonceStr
* @param int $timestamp
* @param string $url
* @return string
*/
private function generateSignature($ticket, $nonceStr, $timestamp, $url)
{
// 拼接待签名字符串(注意顺序)
$signStr = "jsapi_ticket={$ticket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
return sha1($signStr);
}
/**
* 生成随机字符串
* @param int $length
* @return string
*/
private function generateNonceStr($length = 16)
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str = '';
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
/**
* HTTP GET 请求
*/
private function httpGet($url, $headers = [])
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不验证证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不验证主机名
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new BusinessException("HTTP GET 请求失败: {$httpCode}");
}
return json_decode($response, true);
}
}