PHP集成Google Chat:消息回复回调与按钮状态控制问题
解决Google Chat Webhook集成的两个问题
一、接收用户回复消息的实现步骤
普通Google Chat Webhook仅支持单向发送消息,若要接收用户回复,必须通过Google Chat机器人实现双向交互:
- 在Google Workspace开发者控制台创建Chat机器人,将你的PHP服务器HTTPS地址配置为回调URL。
- 当用户在Chat空间回复消息时,Google会向该回调URL发送POST请求,请求体包含完整消息数据(含chat ID、回复内容、用户信息等)。
- PHP端处理逻辑:
- 先验证请求合法性:提取请求头
X-Goog-Signature,用机器人密钥(控制台获取)对请求体做HMAC-SHA256签名验证,确保请求来自Google。 - 解析JSON格式的POST请求体,提取所需字段(如
message.text为回复内容、space.name为chat ID),保存到服务器数据库或文件中。
示例PHP代码片段:
<?php // 替换为你的机器人密钥 $secret = "YOUR_CHAT_BOT_SECRET"; $requestBody = file_get_contents('php://input'); $signature = $_SERVER['HTTP_X_GOOG_SIGNATURE'] ?? ''; // 签名验证 $expectedSignature = 'sha256=' . hash_hmac('sha256', $requestBody, $secret, false); if (!hash_equals($expectedSignature, $signature)) { http_response_code(403); exit('Invalid request'); } // 解析并保存回复数据 $data = json_decode($requestBody, true); $chatId = $data['space']['name']; $replyText = $data['message']['text']; $userId = $data['user']['name']; file_put_contents('chat_replies.log', date('Y-m-d H:i:s') . " | Chat ID: $chatId | User: $userId | Reply: $replyText\n", FILE_APPEND); http_response_code(200); ?> - 先验证请求合法性:提取请求头
二、操作按钮失效/变色的实现方法
当用户点击按钮后,通过Google Chat的更新消息API修改按钮状态:
- 发送初始消息时,给操作按钮指定唯一
action_name,示例卡片按钮配置:{ "cardsV2": [ { "cardId": "task-card", "card": { "actions": [ { "actionLabel": "标记已处理", "actionType": "ACTION_TYPE_CUSTOM", "actionName": "mark_handled", "disabled": false, "button": { "color": "#4285F4" } } ] } } ] } - 用户点击按钮后,回调URL会收到含
action_name的请求,此时调用消息更新接口修改按钮状态:- 接口地址:
https://chat.googleapis.com/v1/{MESSAGE_NAME}(MESSAGE_NAME为初始消息返回的name字段,格式如spaces/AAAAxxx/messages/123456) - 请求方法:PUT
- 修改按钮的
disabled为true,同时将color改为灰色(如#9E9E9E)
示例PHP代码片段:
注:认证可选用API密钥或服务账号,服务账号需提前配置Chat空间的访问权限。<?php // 替换为初始消息的name和你的API密钥/服务账号认证信息 $messageName = "YOUR_MESSAGE_NAME"; $apiKey = "YOUR_GOOGLE_CHAT_API_KEY"; $updatedCard = [ "cardsV2" => [ [ "cardId" => "task-card", "card" => [ "actions" => [ [ "actionLabel" => "已处理", "actionType" => "ACTION_TYPE_CUSTOM", "actionName" => "mark_handled", "disabled" => true, "button" => [ "color" => "#9E9E9E" ] } ] ] ] ] ]; $ch = curl_init("https://chat.googleapis.com/v1/$messageName?key=$apiKey"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($updatedCard)); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); ?> - 接口地址:
内容的提问来源于stack exchange,提问作者Vishnu Fauzdar
相关产品推荐
相关产品推荐

