PHP实战:钉钉回调数据安全接收与处理全流程详解
1. 项目缘起为什么需要处理钉钉回调数据最近在做一个企业内部的管理系统需要深度集成钉钉。其中一个核心场景是当员工在钉钉上提交了审批单、或者管理员在后台修改了组织架构后我们的系统需要能实时感知到这些变化并同步更新数据库。这就是典型的“回调”场景。钉钉作为事件的发生方会主动向我们预先配置好的一个服务器地址也就是回调地址推送一条加密的消息告诉我们“某某事件发生了”。我们的PHP服务端就需要可靠地接收、解密、验证并处理这条消息。听起来简单但实际做起来坑可不少。比如钉钉推送过来的数据是加密的你怎么解密解密后的JSON数据其结构你是否完全了解如何防止恶意伪造的回调请求处理成功后必须返回什么给钉钉否则钉钉会认为回调失败而不断重试这些细节官方文档虽然都有但散落在各处且以Java示例居多。对于PHP开发者尤其是面对一些边缘情况比如数据里包含特殊字符、或者需要高性能处理大量回调时就需要自己摸索一套稳定可靠的方案。今天我就结合最近的项目实战把PHP处理钉钉回调数据的完整流程、核心代码、以及我踩过的那些坑系统地梳理一遍目标是让你拿到就能用用了不出错。2. 回调机制核心原理与准备工作在写代码之前我们必须彻底理解钉钉回调的工作机制。这绝不是简单的“接收一个POST请求”那么简单它是一套为了安全而设计的完整握手与验证流程。2.1 钉钉回调的完整流程钉钉的回调属于“订阅”模式。首先我们在钉钉开放平台的后台为一个应用比如企业内部应用H5微应用订阅一些事件比如“通讯录用户变更”、“审批任务开始”等。同时我们必须提供一个公网可以访问的URL作为“回调地址”。当订阅的事件发生时钉钉服务器会向这个回调地址发起一个HTTP POST请求。这个请求的Body里并不是明文的JSON而是一个经过加密的字符串。加密过程使用了我们预先在钉钉后台配置的“加解密密钥”和“签名令牌”。整个交互流程可以概括为钉钉推送钉钉服务器构造事件数据用你的令牌Token和密钥AESKey进行加密和签名然后POST到你的回调URL。服务端处理你的PHP服务端接收到请求。验证签名从URL参数中获取签名与自己计算出的签名对比验证请求来源的合法性。解密数据从POST Body中获取加密报文用AESKey解密得到明文的XML或JSON字符串新版本通常是JSON。解析事件将解密后的字符串解析为PHP数组或对象。业务处理根据事件类型EventType执行相应的业务逻辑如更新数据库。返回成功处理完毕后必须返回一个特定的、加密后的成功响应字符串。如果返回错误或格式不对钉钉会在短时间内如2小时进行重试最多可能重试16次。2.2 后台配置与核心参数获取这是所有代码的前提一步错步步错。进入钉钉开放平台登录钉钉开发者后台找到你的应用。订阅事件在应用的功能列表里找到“事件与回调”。这里会列出所有可订阅的事件。根据你的业务需求勾选比如“通讯录用户增加”、“通讯录用户更改”、“审批任务开始”等。配置回调参数这是最关键的一步。URL填写你的服务器上用于接收回调的PHP接口地址必须是https生产环境或具备公网IP的http调试环境。Token你自己定义的一个随机字符串用于计算签名。例如my_dingtalk_token_123。请妥善保存。AESKey点击“随机生成”即可。它会生成一个43位的Base64编码字符串。这个密钥用于数据的加密和解密极其重要必须安全存储。同时系统会给出一个对应的CorpId企业内部应用或SuiteKey第三方应用这个值在解密时也需要。加密方式选择“安全模式”。注意Token和AESKey一旦提交在钉钉后台就无法再查看明文只能重置。因此在点击“提交”前务必将其记录并保存到你的服务器配置文件或环境变量中。保存与验证填写完点击“保存”钉钉会向你的URL发送一个包含“encrypt”参数的GET请求用于验证URL有效性。你需要按照下文将实现的逻辑正确解密并返回指定的字符串才能通过验证。3. PHP服务端核心实现代码拆解理解了原理我们开始动手实现。我将代码分为几个核心部分并会解释每一行关键代码的作用。3.1 依赖引入与配置定义首先我们需要钉钉官方提供的加解密PHP SDK。你可以从钉钉开放平台文档中下载或者使用Composer安装社区维护的版本。这里假设你下载了官方PHP SDK并将其中的DingtalkCrypt.php等文件放在了项目目录下。?php // config.php - 配置文件 define(DINGTALK_TOKEN, 你在后台配置的Token); define(DINGTALK_AES_KEY, 你在后台生成的43位AESKey); define(DINGTALK_CORP_ID, 你的企业CorpId或SuiteKey); // 根据应用类型选择 // 引入官方加解密类 require_once ‘path/to/DingtalkCrypt.php’;3.2 回调接口入口与签名验证这是接收请求的入口文件例如callback.php。?php require_once ‘config.php’; // 1. 获取钉钉推送的参数 $signature $_GET[‘signature’] ?? ‘’; // URL中的签名 $timestamp $_GET[‘timestamp’] ?? ‘’; // 时间戳 $nonce $_GET[‘nonce’] ?? ‘’; // 随机数 $encrypt $_GET[‘encrypt’] ?? ‘’; // 如果是GET验证请求encrypt在URL中 // 如果是POST事件推送encrypt在Body中 $postData file_get_contents(‘php://input’); $postArr json_decode($postData, true); if (json_last_error() JSON_ERROR_NONE isset($postArr[‘encrypt’])) { $encrypt $postArr[‘encrypt’]; } // 2. 验证签名 (至关重要的一步防伪造) function verifySignature($token, $timestamp, $nonce, $encrypt, $signature) { $params [$token, $timestamp, $nonce, $encrypt]; sort($params, SORT_STRING); $combined implode(‘’, $params); $calculatedSignature sha1($combined); return hash_equals($calculatedSignature, $signature); // 使用hash_equals防止时序攻击 } if (!verifySignature(DINGTALK_TOKEN, $timestamp, $nonce, $encrypt, $signature)) { // 签名不匹配可能是恶意请求直接返回错误或记录日志 header(‘Content-Type: application/json’); echo json_encode([‘errcode’ 400, ‘errmsg’ ‘Invalid signature’]); exit; } // 签名验证通过继续处理关键点解释php://input用于获取原始的POST数据流比$_POST更可靠尤其当数据是JSON时。hash_equals比较字符串是否相等的安全函数可以防止基于时间的旁路攻击务必使用。签名验证是安全的第一道防线绝不能省略。3.3 数据解密与事件解析签名通过后我们才认为这是来自钉钉的合法请求接下来处理加密数据。// 3. 实例化解密工具并解密 $crypt new DingtalkCrypt(DINGTALK_TOKEN, DINGTALK_AES_KEY, DINGTALK_CORP_ID); $decryptMsg ‘’; $errCode $crypt-DecryptMsg($signature, $timestamp, $nonce, $encrypt, $decryptMsg); if ($errCode ! 0) { // 解密失败 error_log(“DingTalk Callback Decrypt Failed. ErrCode: $errCode”); header(‘Content-Type: application/json’); echo json_encode([‘errcode’ 900, ‘errmsg’ ‘Decrypt error’]); exit; } // 4. 解析解密后的JSON事件数据 $eventData json_decode($decryptMsg, true); if (json_last_error() ! JSON_ERROR_NONE) { // 理论上解密成功后的就是合法JSON这里做容错 error_log(“DingTalk Callback JSON Parse Error: “ . json_last_error_msg()); // 有时可能是XML格式旧版这里简化处理按失败处理 header(‘Content-Type: application/json’); echo json_encode([‘errcode’ 901, ‘errmsg’ ‘Invalid event data’]); exit; } // 此时$eventData 就是明文的事件数据数组 $eventType $eventData[‘EventType’] ?? ‘’; // 例如 ‘user_add_org’, ‘bpms_task_change’踩坑记录1DecryptMsg的返回值。官方SDK的DecryptMsg方法成功时返回0并将解密后的明文赋值给$decryptMsg参数引用传递。失败时返回非0的错误码。一定要检查这个错误码而不是默认它一定成功。3.4 业务逻辑分发与处理得到明文事件数据后我们就可以根据EventType来执行相应的业务逻辑了。为了代码清晰和可扩展建议使用策略模式或简单的事件映射。// 5. 根据事件类型分发处理 function handleDingTalkEvent($eventType, $eventData) { switch ($eventType) { case ‘user_add_org’: // 新增成员 $userId $eventData[‘UserId’][0] ?? ‘’; // 调用内部服务将用户信息同步到本地数据库 syncUserToLocalDB($userId); break; case ‘user_modify_org’: // 更改成员 $userId $eventData[‘UserId’][0] ?? ‘’; syncUserToLocalDB($userId); // 同样是同步拉取最新信息 break; case ‘user_leave_org’: // 成员离职 $userId $eventData[‘UserId’][0] ?? ‘’; deactivateUserInLocalDB($userId); break; case ‘bpms_task_change’: // 审批任务状态变化 $processInstanceId $eventData[‘processInstanceId’] ?? ‘’; $type $eventData[‘type’] ?? ‘’; $taskId $eventData[‘taskId’] ?? ‘’; // 根据审批状态更新本地业务流程 updateApprovalStatus($processInstanceId, $type, $taskId); break; case ‘check_url’: // 这是URL验证事件只在配置回调时触发一次 // 这个事件的处理比较特殊见下文 break; default: // 记录未处理的事件类型便于后续扩展 error_log(“Unhandled DingTalk EventType: $eventType”); break; } } // 执行处理 handleDingTalkEvent($eventType, $eventData);实操心得业务处理部分尤其是数据库操作一定要做好幂等性处理。因为网络抖动等原因钉钉可能会重复推送同一个事件。你的syncUserToLocalDB函数应该实现“存在则更新不存在则插入”的逻辑避免产生重复数据或报错。3.5 构造并返回成功响应业务逻辑执行完毕后即使有非关键错误只要回调流程本身没问题我们必须返回一个正确的响应给钉钉告诉它“我已成功接收并处理请不要再重试了”。这个响应本身也需要加密。// 6. 构造成功响应 $respArray [‘msg_signature’ ‘’, ‘encrypt’ ‘’, ‘timeStamp’ ‘’, ‘nonce’ ‘’]; // 成功消息体固定为 ‘success’ $successMsg ‘success’; $errCode $crypt-EncryptMsg($successMsg, $timestamp, $nonce, $respArray); if ($errCode ! 0) { error_log(“DingTalk Callback Encrypt Response Failed. ErrCode: $errCode”); // 即使响应加密失败也尽可能返回一个钉钉能识别的错误不这里应该尝试返回明文错误但格式需对。 header(‘Content-Type: application/json’); echo json_encode([‘errcode’ 902, ‘errmsg’ ‘Encrypt response error’]); exit; } // 7. 返回加密后的响应 (必须是JSON格式) header(‘Content-Type: application/json’); echo json_encode([ ‘msg_signature’ $respArray[‘msg_signature’], ‘encrypt’ $respArray[‘encrypt’], ‘timeStamp’ $respArray[‘timeStamp’], ‘nonce’ $respArray[‘nonce’], ]); exit; // 确保脚本结束踩坑记录2响应格式与内容。这是新手最容易出错的地方。返回的必须是一个JSON对象包含msg_signature,encrypt,timeStamp,nonce这四个字段字段名一个都不能错。encrypt字段的值是加密后的字符串加密的内容必须是success这个明文。返回其他任何内容比如明文的{“errcode”:0}钉钉都会判定为回调失败从而触发重试机制。4. 高级话题、性能优化与避坑指南把基础流程跑通只是第一步。在实际生产环境中我们还会遇到更多复杂情况和性能挑战。4.1 处理URL验证事件在配置回调URL时钉钉发送的是一个特殊的check_url事件。它的处理方式与普通事件略有不同。解密后你会得到一个包含encrypt字段的数组。你需要将这个encrypt字段的值直接解密解密后得到的明文是一个随机字符串。然后你需要用这个随机字符串再次调用加密方法将加密后的结果作为响应返回。// 在 handleDingTalkEvent 的 switch 中针对 ‘check_url’ 的特殊处理 case ‘check_url’: $encryptForCheck $eventData[‘encrypt’] ?? ‘’; // 注意这里需要对这个 $encryptForCheck 进行解密得到明文 randomStr $randomStr ‘’; $decryptErr $crypt-DecryptMsg($signature, $timestamp, $nonce, $encryptForCheck, $randomStr); if ($decryptErr 0) { // 然后用这个 randomStr 去构造响应加密 randomStr $respArray [‘msg_signature’ ‘’, ‘encrypt’ ‘’, ‘timeStamp’ ‘’, ‘nonce’ ‘’]; $crypt-EncryptMsg($randomStr, $timestamp, $nonce, $respArray); // 返回这个 respArray (同上文步骤7) return $respArray; // 这里需要调整函数返回值示意逻辑 } break;很多人在URL验证这一步失败就是因为没有理解这个“二次解密-加密”的过程直接返回了success。4.2 性能优化异步处理与队列引入回调接口必须快速响应钉钉服务器最好在1秒内否则可能被钉钉认为超时。但我们的业务逻辑比如同步用户信息、更新复杂审批状态可能涉及多个数据库查询、外部API调用非常耗时。解决方案异步处理。我们可以在回调接口中只完成“验证-解密-校验”的核心步骤然后将解密后的事件数据迅速推入一个消息队列如Redis、RabbitMQ、Kafka随后立即返回success给钉钉。后台再启动独立的Worker进程从队列中消费这些消息执行耗时的业务逻辑。// 在 callback.php 的业务处理部分改为入队 // handleDingTalkEvent($eventType, $eventData); // 改为下面 $jobData [ ‘eventType’ $eventType, ‘eventData’ $eventData, ‘receivedAt’ time(), ]; // 假设使用 Redis 作为队列 $redis new Redis(); $redis-connect(‘127.0.0.1’, 6379); $redis-lPush(‘dingtalk:callback:queue’, json_encode($jobData)); // 然后立即返回成功响应这样回调接口的响应时间可以控制在几十毫秒内极大地提升了可靠性和吞吐量。Worker端则需要处理队列消息的重复消费、失败重试等问题。4.3 安全加固与日志排查IP白名单虽然有了签名验证但进一步加强安全可以在Nginx或PHP层面设置钉钉服务器的IP白名单。钉钉官方会公布其回调服务器的IP段定期更新并配置到防火墙规则中。详尽日志在处理回调的每一个关键步骤收到请求、签名结果、解密结果、事件类型、业务处理结果、返回响应都记录日志。日志应包括时间戳、请求ID、事件ID、关键参数和结果。当出现问题时这些日志是排查的唯一依据。我习惯使用JSON格式记录方便后续用ELK等工具分析。监控与告警监控回调接口的HTTP状态码非200的请求、处理耗时、队列积压数量。当出现连续失败或大量积压时及时触发告警。4.4 常见错误排查清单URL验证失败检查Token、AESKey、CorpId是否与后台配置完全一致注意不要有多余空格。检查verifySignature函数中的参数排序和拼接方式是否正确。检查check_url事件的处理逻辑是否正确二次解密-加密。回调接收不到检查回调URL是否公网可访问是否支持HTTPS生产环境。在钉钉后台检查“事件与回调”状态是否为“已启用”。检查服务器防火墙/安全组是否开放了80/443端口。在服务器上用curl或telnet自测你的回调URL。回调处理失败钉钉不断重试99%的原因是你的响应格式不正确。用日志打印出你最终返回给钉钉的完整响应体确认它是一个包含四个字段的JSON并且encrypt字段有值。检查业务逻辑是否有未捕获的异常或致命错误导致PHP脚本中途退出未能执行到返回成功响应的代码。检查网络是否稳定是否存在偶发的超时。解密失败确认使用的加解密SDK版本与钉钉要求匹配。确认AESKey是43位并且是Base64编码的。检查时间戳timestamp。如果服务器时间与钉钉服务器时间相差太大如15分钟以上签名验证可能会失败。确保服务器时间已同步。处理钉钉回调本质上是在构建一个高可靠、高安全性的Webhook端点。它要求我们对HTTP协议、数据加密、签名验证和异步编程有清晰的理解。把上述流程和代码框架搭好再结合具体的业务逻辑填充就能构建出一个稳定服务于钉钉生态的PHP后端服务。记住核心快速验证、快速响应、异步处理、详尽日志。这十六个字能帮你避开这个场景下的大多数坑。

相关新闻

UnityGameFramework高效调试:从日志系统到核心模块问题排查全攻略

UnityGameFramework高效调试:从日志系统到核心模块问题排查全攻略

1. 项目概述:为什么UnityGameFramework的调试是个技术活?如果你正在用UnityGameFramework(后文简称GF)做项目,尤其是商业项目,那你肯定不止一次被它“坑”过。我说的“坑”,不是框架设计有问题—…

2026/8/6 6:50:02 阅读更多 →
C语言 链表 函数指针 指针函数

C语言 链表 函数指针 指针函数

## 一、链表(Linked List) ### 1.1 知识概述 **链表是什么**:一种通过指针将零散的内存节点串起来的数据结构。每个节点包含"数据"和"指向下一个节点的指针"。 **为什么用链表 vs 数组**: | | 数组 | 链表 | …

2026/8/6 6:49:02 阅读更多 →
[特殊字符] 龍魂数字檄文 · 主权宣告 ——一条路线,两套规则,三方站队,四字定局

[特殊字符] 龍魂数字檄文 · 主权宣告 ——一条路线,两套规则,三方站队,四字定局

🐉 龍魂数字檄文 主权宣告 ——一条路线,两套规则,三方站队,四字定局 DNA: #龍芯⚡️丙午癸未乙酉坤卦-DIGITAL-MANIFESTO-V1.0-UID9622 确认码: #CONFIRM🌌9622-ONLY-ONCE🧬LK9X-772Z GPG:…

2026/8/6 6:49:02 阅读更多 →

最新新闻

Unity与Photoshop色彩管理:Linear与sRGB工作流全解析

Unity与Photoshop色彩管理:Linear与sRGB工作流全解析

1. 项目概述:从一次“颜色灾难”说起几年前,我接手一个Unity项目,美术同学在Photoshop里精心绘制了一套UI图标,色彩鲜艳,渐变过渡自然。但当他把切图导入Unity,运行游戏后,整个人都懵了——原本…

2026/8/6 7:28:26 阅读更多 →
20年热转印资深从业者:地产外墙热转印围挡工厂品控要点解析

20年热转印资深从业者:地产外墙热转印围挡工厂品控要点解析

开篇引入今早刚到工厂,就撞见新来的小工拿着客户退回的围挡样品蹲在角落叹气——上个月刚交付的地产围挡,才经历一场暴晒加暴雨,色块就发乌、拼接处开了缝,客户要求返工。做了20年热转印广告布艺,这种场景见得太多&…

2026/8/6 7:28:26 阅读更多 →
商用车润滑油哪家性价比高?长效保护、燃油经济性与适配性深度对比

商用车润滑油哪家性价比高?长效保护、燃油经济性与适配性深度对比

2026年,参考罗兰贝格《中国商用车后市场白皮书》中关于车辆运维成本的调研方法,结合中国汽车工业协会发布的《2025中国汽车后市场年度发展报告》数据显示,国内商用车保有量稳步增长,公路货运市场规模持续扩大,但物流企…

2026/8/6 7:28:26 阅读更多 →
Unity UI圆角Shader方案:SDF技术实现高清动态圆角与性能优化

Unity UI圆角Shader方案:SDF技术实现高清动态圆角与性能优化

1. 项目概述:为什么我们需要一个专门的圆角UI解决方案?在Unity里做UI,给一个Image组件加个圆角,听起来是个再简单不过的需求。很多新手,甚至一些有经验的开发者,第一反应可能就是:“这还不简单&…

2026/8/6 7:28:26 阅读更多 →
别再盲目铺量了!2026年AI短视频矩阵的3大平台潜规则,踩中一条流量归零

别再盲目铺量了!2026年AI短视频矩阵的3大平台潜规则,踩中一条流量归零

AI短视频矩阵避坑指南:不懂这3条技术生死线,砸再多钱也白费很多老板把AI短视频矩阵理解为“买软件、批量发视频”,这本身就是最大的认知误区。如果你是正准备启动矩阵获客,或者已经投了钱却效果惨淡的项目负责人,这篇文…

2026/8/6 7:28:26 阅读更多 →
NIO文件操作核心技巧

NIO文件操作核心技巧

你提供的代码清单展示了 Java NIO 进行文件 I/O 操作的核心方法。以下是这些方法的分类、对比和关键代码示例。 一、核心操作分类与对比 操作类型核心类/接口关键方法/特性适用场景通道读取SeekableByteChannel / FileChannelFiles.newByteChannel(), channel.read(buffer)顺…

2026/8/6 7:27:25 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →