钉钉 php curl

admin 105 0
钉钉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