fix: 修复飞书通知模块API路径和卡片格式
- 修改API路径为 /open-apis/im/v1/messages (message/v4已废弃) - 添加卡片config配置 - 修复content格式(直接传卡片对象,不需要包裹) - 添加测试接口 /api/v1/test/notification 测试结果: 成功发送通知到李佳博(feishu_user_id: 481g947d) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -229,88 +229,49 @@ class FeishuNotificationService
|
||||
$type = $params['type'] ?? '申请';
|
||||
$content = $params['content'] ?? '';
|
||||
$url = $params['url'] ?? '';
|
||||
$approveUrl = $params['approve_url'] ?? '';
|
||||
$rejectUrl = $params['reject_url'] ?? '';
|
||||
|
||||
$elements = [
|
||||
[
|
||||
'tag' => 'div',
|
||||
'fields' => [
|
||||
[
|
||||
'is_short' => true,
|
||||
'text' => [
|
||||
'content' => "**申请人**: {$applicant}",
|
||||
'tag' => 'lark_md',
|
||||
],
|
||||
],
|
||||
[
|
||||
'is_short' => true,
|
||||
'text' => [
|
||||
'content' => "**申请类型**: {$type}",
|
||||
'tag' => 'lark_md',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
// 简化版卡片,先测试
|
||||
$elements = [];
|
||||
|
||||
if ($content) {
|
||||
$elements[] = [
|
||||
'tag' => 'div',
|
||||
'text' => [
|
||||
'content' => "**申请内容**:\n{$content}",
|
||||
'content' => "**申请人**: {$applicant}\n**申请类型**: {$type}\n\n{$content}",
|
||||
'tag' => 'lark_md',
|
||||
],
|
||||
];
|
||||
} else {
|
||||
$elements[] = [
|
||||
'tag' => 'div',
|
||||
'text' => [
|
||||
'content' => "**申请人**: {$applicant}\n**申请类型**: {$type}",
|
||||
'tag' => 'lark_md',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
// 构建操作按钮
|
||||
$actions = [];
|
||||
|
||||
if ($approveUrl) {
|
||||
$actions[] = [
|
||||
'tag' => 'button',
|
||||
'text' => [
|
||||
'content' => '通过',
|
||||
'tag' => 'plain_text',
|
||||
],
|
||||
'type' => 'primary',
|
||||
'url' => $approveUrl,
|
||||
];
|
||||
}
|
||||
|
||||
if ($rejectUrl) {
|
||||
$actions[] = [
|
||||
'tag' => 'button',
|
||||
'text' => [
|
||||
'content' => '拒绝',
|
||||
'tag' => 'plain_text',
|
||||
],
|
||||
'type' => 'default',
|
||||
'url' => $rejectUrl,
|
||||
];
|
||||
}
|
||||
|
||||
if ($url) {
|
||||
$actions[] = [
|
||||
'tag' => 'button',
|
||||
'text' => [
|
||||
'content' => '查看详情',
|
||||
'tag' => 'plain_text',
|
||||
],
|
||||
'type' => 'default',
|
||||
'url' => $url,
|
||||
];
|
||||
}
|
||||
|
||||
if (!empty($actions)) {
|
||||
$elements[] = [
|
||||
'tag' => 'action',
|
||||
'actions' => $actions,
|
||||
'actions' => [
|
||||
[
|
||||
'tag' => 'button',
|
||||
'text' => [
|
||||
'content' => '查看详情',
|
||||
'tag' => 'plain_text',
|
||||
],
|
||||
'type' => 'default',
|
||||
'url' => $url,
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'config' => [
|
||||
'wide_screen_mode' => false,
|
||||
],
|
||||
'header' => [
|
||||
'title' => [
|
||||
'content' => "📋 {$title}",
|
||||
@@ -361,6 +322,9 @@ class FeishuNotificationService
|
||||
}
|
||||
|
||||
return [
|
||||
'config' => [
|
||||
'wide_screen_mode' => false,
|
||||
],
|
||||
'header' => [
|
||||
'title' => [
|
||||
'content' => "🔔 {$title}",
|
||||
@@ -428,6 +392,9 @@ class FeishuNotificationService
|
||||
}
|
||||
|
||||
return [
|
||||
'config' => [
|
||||
'wide_screen_mode' => false,
|
||||
],
|
||||
'header' => [
|
||||
'title' => [
|
||||
'content' => "{$icon} {$title}",
|
||||
@@ -445,15 +412,28 @@ class FeishuNotificationService
|
||||
private function sendMessage(string $feishuUserId, array $card): bool
|
||||
{
|
||||
try {
|
||||
$app = $this->getAppConfig();
|
||||
$token = $this->getAccessToken();
|
||||
|
||||
$body = [
|
||||
'receive_id_type' => 'user_id',
|
||||
'receive_id' => $feishuUserId,
|
||||
'msg_type' => 'interactive',
|
||||
'content' => json_encode(['card' => $card]),
|
||||
];
|
||||
|
||||
error_log('📤 发送飞书消息: app_id=' . $app['app_id'] . ', feishu_user_id=' . $feishuUserId);
|
||||
error_log('📦 消息卡片: ' . json_encode($card, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
$content = json_encode($card);
|
||||
error_log('📤 发送的content: ' . $content);
|
||||
|
||||
$response = HttpClient::httpPost(
|
||||
"https://open.feishu.cn/open-apis/message/v4/send_messages",
|
||||
"https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=user_id",
|
||||
[
|
||||
'receive_id_type' => 'user_id',
|
||||
'receive_id' => $feishuUserId,
|
||||
'msg_type' => 'interactive',
|
||||
'content' => json_encode(['card' => $card]),
|
||||
'content' => $content,
|
||||
],
|
||||
[
|
||||
'Authorization: Bearer ' . $token,
|
||||
@@ -461,15 +441,15 @@ class FeishuNotificationService
|
||||
);
|
||||
|
||||
$code = $response['code'] ?? -1;
|
||||
$success = $code === 0;
|
||||
error_log('📥 飞书响应: code=' . $code . ', msg=' . ($response['msg'] ?? 'null'));
|
||||
|
||||
if ($success) {
|
||||
error_log("✅ 飞书消息发送成功: feishu_user_id={$feishuUserId}");
|
||||
if ($code !== 0) {
|
||||
error_log('❌ 飞书消息发送失败: ' . json_encode($response));
|
||||
} else {
|
||||
error_log("❌ 飞书消息发送失败: feishu_user_id={$feishuUserId}, code={$code}, msg=" . ($response['msg'] ?? ''));
|
||||
error_log('✅ 飞书消息发送成功');
|
||||
}
|
||||
|
||||
return $success;
|
||||
return $code === 0;
|
||||
} catch (Exception $e) {
|
||||
error_log('❌ sendMessage 异常: ' . $e->getMessage());
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user