钉钉API调用中,PHP可通过curl实现HTTP请求交互,核心步骤包括:初始化curl句柄,设置请求URL(如access_token接口)、请求头(Content-Type、签名等)及请求方式(GET/POST),传入应用凭证、加签密钥等参数;执行请求后解析返回JSON数据,提取access_token、接口响应结果等,需注意access_token的有效性管理,遵循钉钉签名算法(如HMAC-SHA256),并处理网络超时、API错误码等异常,curl作为轻量级HTTP客户端,是钉钉API集成的常用方式,规范参数配置与异常处理可保障接口调用的稳定性和安全性。
钉钉API对接实战:基于PHP与Curl的消息自动化推送方案
在企业数字化办公生态中,钉钉作为主流协同平台,通过开放API接口支持开发者实现消息通知、组织架构管理、审批流程等深度定制功能,PHP凭借其灵活性和广泛的服务器兼容性,结合Curl扩展可高效构建钉钉API交互层,本文以**工作通知消息自动化发送**为核心场景,系统讲解PHP实现钉钉API调用的完整流程,助力企业快速构建消息推送自动化解决方案。
前置准备:获取API调用权限
创建企业内部应用
- 访问钉钉开放平台,依次进入「企业内部开发」→「应用开发」→「企业内部应用」,创建「企业自建应用」
- 在应用详情页记录核心凭证:AppKey(应用唯一标识)和AppSecret(应用密钥),用于后续获取访问令牌
- 于「权限管理」模块开通必要权限:
消息通知→发送工作通知(必选)及其他扩展权限(如需发送富媒体消息)
理解Access Token机制
钉钉API调用需基于access_token进行身份验证,该令牌具有以下特性:
- 有效期:2小时(需定时刷新)
- 获取接口:
GET https://oapi.dingtalk.com/gettoken?appkey=APPKEY&appsecret=APPSECRET - 返回数据示例:
{ "errcode": 0, "access_token": "xxx", "expires_in": 7200 }
核心实现:PHP+Curl API调用方案
获取Access Token(带缓存优化)
为避免频繁请求,建议结合文件缓存或Redis实现令牌复用:
<?php
/**
* 获取钉钉Access Token(含本地缓存机制)
* @param string $appKey 应用AppKey
* @param string $appSecret 应用密钥
* @param string $cacheFile 缓存文件路径(如:/tmp/dingtalk_token.cache)
* @return string|false 成功返回token,失败返回false
*/
function getDingTalkAccessToken($appKey, $appSecret, $cacheFile = null) {
// 尝试读取缓存
if ($cacheFile && file_exists($cacheFile) && (time() - filemtime($cacheFile) < 7000)) {
return file_get_contents($cacheFile);
}
$url = "https://oapi.dingtalk.com/gettoken?appkey=" . urlencode($appKey) . "&appsecret=" . urlencode($appSecret);
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false, // 生产环境建议配置CA证书
CURLOPT_TIMEOUT => 10
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
error_log("[DingTalk] Curl Error: " . curl_error($ch));
curl_close($ch);
return false;
}
curl_close($ch);
$result = json_decode($response, true);
if ($result['errcode'] == 0) {
// 写入缓存
if ($cacheFile) {
file_put_contents($cacheFile, $result['access_token']);
}
return $result['access_token'];
} else {
error_log("[DingTalk] Token Error: " . $result['errmsg']);
return false;
}
发送工作通知(完整实现)
采用异步接口POST https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2实现消息推送:
<?php
/**
* 发送钉钉工作通知(支持多消息类型)
* @param string $accessToken 访问令牌
* @param int $agentId 应用AgentID(应用详情页获取)
* @param string $userIdList 接收人ID(逗号分隔,如:"user1,user2")
* @param array $message 消息结构体
* @return array|false 响应数据或false
*/
function sendDingTalkMessage($accessToken, $agentId, $userIdList, $message) {
$url = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=" . urlencode($accessToken);
$postData = [
'agent_id' => $agentId,
'userid_list' => $userIdList,
'to_all_user' => false, // 是否全员发送(false时需指定userid_list)
'msg' => $message
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($postData, JSON_UNESCAPED_UNICODE),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => 15
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
error_log("[DingTalk] Send Error: " . curl_error($ch));
curl_close($ch);
return false;
}
curl_close($ch);
return json_decode($response, true);
// 示例:发送文本消息
$textMessage = [
'msgtype' => 'text',
'text' => ['content' => '【系统通知】您的月度报表已生成,请查收!']
];
$result = sendDingTalkMessage($token, $agentId, "123456,789012", $textMessage);
// 示例:发送卡片消息(更丰富的交互体验)
$cardMessage = [
'msgtype' => 'actionCard',
'actionCard' => [
'title' => '项目进度提醒',
'text' => '\n\n当前进度: 75%\n\n查看详情',
'btnOrientation' => '0', // 0垂直按钮 1水平按钮
'singleTitle' => '立即查看',
'singleURL' => 'https://example.com/detail'
]
];
进阶实践与优化建议
标签: #钉钉php curl