接口调用说明
本接口适用于企业内部系统集成场景,用于获取调用钉钉开放能力所需的访问凭证。典型使用流程如下:- 应用启动或首次调用API前,调用本接口获取accessToken。
- 将获取到的accessToken缓存至本地存储(如Redis、内存缓存等),避免重复请求。
- 后续所有依赖鉴权的API调用均携带该accessToken。
- 建议设置缓存过期时间略小于7200秒(例如7000秒),实现自动刷新机制,防止因时间偏差导致凭证失效。
- 注意避免在短时间内频繁调用本接口,否则可能触发频率限制策略,影响服务稳定性。
请求
| 基本信息 | |
|---|---|
| HTTP URL | https://api.dingtalk.io/v1.0/oauth2/accessToke |
| HTTP Method | POST |
| 支持的应用类型 | appType-企业内部应用 |
| 权限要求 | permission-qyapi_base-调用企业API时需要具备的基本权限 |
请求体
| 名称 | 类型 | 是否必填 | 示例值 | 描述 |
|---|---|---|---|---|
| appKey | String | 是 | dingeqqpkv3xxxxxx | 已创建的企业内部应用的 Client ID,获取方式可参考Client ID/Client Secret文档说明。 |
| appSecret | String | 是 | GT-lsu-taDAxxxsTsxxxx | 已创建的企业内部应用的 Client Secre ,获取方式可参考Client ID/Client Secret文档说明。 说明 请妥善保管Client Secret,避免泄露。 |
请求示例
curl -X POST 'https://api.dingtalk.io/v1.0/oauth2/accessToken' \
-H 'Content-Type: application/json' \
-d '{
"appKey": "dingeqqpkv3xxxxxx",
"appSecret": "GT-lsu-taDAxxxsTsxxxx"
}'
// This file is auto-generated, don't edit it. Thanks.
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* 使用 Token 初始化账号Client
* @return Client
* @throws Exception
*/
public static com.aliyun.dingtalkoauth2_1_0.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.protocol = "https";
config.regionId = "central";
return new com.aliyun.dingtalkoauth2_1_0.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.dingtalkoauth2_1_0.Client client = Sample.createClient();
com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest getAccessTokenRequest = new com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest()
.setAppKey("dingeqqpkv3xxxxxx")
.setAppSecret("GT-lsu-taDAxxxsTsxxxx");
try {
client.getAccessToken(getAccessTokenRequest);
} catch (TeaException err) {
if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
} catch (Exception _err) {
TeaException err = new TeaException(_err.getMessage(), _err);
if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
}
}
}
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import sys
from typing import List
from alibabacloud_dingtalk.oauth2_1_0.client import Client as dingtalkoauth2_1_0Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dingtalk.oauth2_1_0 import models as dingtalkoauth_2__1__0_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> dingtalkoauth2_1_0Client:
"""
使用 Token 初始化账号Client
@return: Client
@throws Exception
"""
config = open_api_models.Config()
config.protocol = 'https'
config.region_id = 'central'
return dingtalkoauth2_1_0Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client()
get_access_token_request = dingtalkoauth_2__1__0_models.GetAccessTokenRequest(
app_key='dingeqqpkv3xxxxxx',
app_secret='GT-lsu-taDAxxxsTsxxxx'
)
try:
client.get_access_token(get_access_token_request)
except Exception as err:
if not UtilClient.empty(err.code) and not UtilClient.empty(err.message):
# err 中含有 code 和 message 属性,可帮助开发定位问题
pass
@staticmethod
async def main_async(
args: List[str],
) -> None:
client = Sample.create_client()
get_access_token_request = dingtalkoauth_2__1__0_models.GetAccessTokenRequest(
app_key='dingeqqpkv3xxxxxx',
app_secret='GT-lsu-taDAxxxsTsxxxx'
)
try:
await client.get_access_token_async(get_access_token_request)
except Exception as err:
if not UtilClient.empty(err.code) and not UtilClient.empty(err.message):
# err 中含有 code 和 message 属性,可帮助开发定位问题
pass
if __name__ == '__main__':
Sample.main(sys.argv[1:])
<?php
// This file is auto-generated, don't edit it. Thanks.
namespace AlibabaCloud\SDK\Sample;
use AlibabaCloud\SDK\Dingtalk\Voauth2_1_0\Dingtalk;
use \Exception;
use AlibabaCloud\Tea\Exception\TeaError;
use AlibabaCloud\Tea\Utils\Utils;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Dingtalk\Voauth2_1_0\Models\GetAccessTokenRequest;
class Sample {
/**
* 使用 Token 初始化账号Client
* @return Dingtalk Client
*/
public static function createClient(){
$config = new Config([]);
$config->protocol = "https";
$config->regionId = "central";
return new Dingtalk($config);
}
/**
* @param string[] $args
* @return void
*/
public static function main($args){
$client = self::createClient();
$getAccessTokenRequest = new GetAccessTokenRequest([
"appKey" => "dingeqqpkv3xxxxxx",
"appSecret" => "GT-lsu-taDAxxxsTsxxxx"
]);
try {
$client->getAccessToken($getAccessTokenRequest);
}
catch (Exception $err) {
if (!($err instanceof TeaError)) {
$err = new TeaError([], $err->getMessage(), $err->getCode(), $err);
}
if (!Utils::empty_($err->code) && !Utils::empty_($err->message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
}
}
}
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
require_once $path;
}
Sample::main(array_slice($argv, 1));
// This file is auto-generated, don't edit it. Thanks.
package main
import (
"os"
util "github.com/alibabacloud-go/tea-utils/v2/service"
dingtalkoauth2_1_0 "github.com/alibabacloud-go/dingtalk/oauth2_1_0"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/alibabacloud-go/tea/tea"
)
/**
* 使用 Token 初始化账号Client
* @return Client
* @throws Exception
*/
func CreateClient () (_result *dingtalkoauth2_1_0.Client, _err error) {
config := &openapi.Config{}
config.Protocol = tea.String("https")
config.RegionId = tea.String("central")
_result = &dingtalkoauth2_1_0.Client{}
_result, _err = dingtalkoauth2_1_0.NewClient(config)
return _result, _err
}
func _main (args []*string) (_err error) {
client, _err := CreateClient()
if _err != nil {
return _err
}
getAccessTokenRequest := &dingtalkoauth2_1_0.GetAccessTokenRequest{
AppKey: tea.String("dingeqqpkv3xxxxxx"),
AppSecret: tea.String("GT-lsu-taDAxxxsTsxxxx"),
}
tryErr := func()(_e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
_, _err = client.GetAccessToken(getAccessTokenRequest)
if _err != nil {
return _err
}
return nil
}()
if tryErr != nil {
var err = &tea.SDKError{}
if _t, ok := tryErr.(*tea.SDKError); ok {
err = _t
} else {
err.Message = tea.String(tryErr.Error())
}
if !tea.BoolValue(util.Empty(err.Code)) && !tea.BoolValue(util.Empty(err.Message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
}
return _err
}
func main() {
err := _main(tea.StringSlice(os.Args[1:]))
if err != nil {
panic(err)
}
}
// This file is auto-generated, don't edit it
import Util from '@alicloud/tea-util';
import dingtalkoauth2_1_0, * as $dingtalkoauth2_1_0 from '@alicloud/dingtalk/oauth2_1_0';
import OpenApi, * as $OpenApi from '@alicloud/openapi-client';
import * as $tea from '@alicloud/tea-typescript';
export default class Client {
/**
* 使用 Token 初始化账号Client
* @return Client
* @throws Exception
*/
static createClient(): dingtalkoauth2_1_0 {
let config = new $OpenApi.Config({ });
config.protocol = "https";
config.regionId = "central";
return new dingtalkoauth2_1_0(config);
}
static async main(args: string[]): Promise<void> {
let client = Client.createClient();
let getAccessTokenRequest = new $dingtalkoauth2_1_0.GetAccessTokenRequest({
appKey: "dingeqqpkv3xxxxxx",
appSecret: "GT-lsu-taDAxxxsTsxxxx",
});
try {
await client.getAccessToken(getAccessTokenRequest);
} catch (err) {
if (!Util.empty(err.code) && !Util.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
}
}
}
Client.main(process.argv.slice(2));
// This file is auto-generated, don't edit it. Thanks.
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Tea;
using Tea.Utils;
namespace AlibabaCloud.SDK.Sample
{
public class Sample
{
/**
* 使用 Token 初始化账号Client
* @return Client
* @throws Exception
*/
public static AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client CreateClient()
{
AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
config.Protocol = "https";
config.RegionId = "central";
return new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client(config);
}
public static void Main(string[] args)
{
AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client client = CreateClient();
AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest getAccessTokenRequest = new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest
{
AppKey = "dingeqqpkv3xxxxxx",
AppSecret = "GT-lsu-taDAxxxsTsxxxx",
};
try
{
client.GetAccessToken(getAccessTokenRequest);
}
catch (TeaException err)
{
if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message))
{
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
}
catch (Exception _err)
{
TeaException err = new TeaException(new Dictionary<string, object>
{
{ "message", _err.Message }
});
if (!AlibabaCloud.TeaUtil.Common.Empty(err.Code) && !AlibabaCloud.TeaUtil.Common.Empty(err.Message))
{
// err 中含有 code 和 message 属性,可帮助开发定位问题
}
}
}
}
}
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
from __future__ import unicode_literals
import sys
from alibabacloud_dingtalkoauth2_1_0.client import Client as dingtalkoauth2_1_0Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dingtalkoauth2_1_0 import models as dingtalkoauth_2__1__0_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample(object):
def __init__(self):
pass
@staticmethod
def create_client():
"""
使用 Token 初始化账号Client
@return: Client
@throws Exception
"""
config = open_api_models.Config()
config.protocol = 'https'
config.region_id = 'central'
return dingtalkoauth2_1_0Client(config)
@staticmethod
def main(args):
client = Sample.create_client()
get_access_token_request = dingtalkoauth_2__1__0_models.GetAccessTokenRequest(
app_key='dingeqqpkv3xxxxxx',
app_secret='GT-lsu-taDAxxxsTsxxxx'
)
try:
client.get_access_token(get_access_token_request)
except Exception as err:
if not UtilClient.empty(err.code) and not UtilClient.empty(err.message):
# err 中含有 code 和 message 属性,可帮助开发定位问题
pass
if __name__ == '__main__':
Sample.main(sys.argv[1:])
#!/usr/bin/env xcrun swift
import Cocoa
import Foundation
import Tea
import TeaUtils
import AlibabacloudDingtalkoauth210
import AlibabacloudOpenApi
open class Client {
public static func createClient() throws -> AlibabacloudDingtalkoauth210.Client {
var config: AlibabacloudOpenApi.Config = AlibabacloudOpenApi.Config([:])
config.protocol_ = "https"
config.regionId = "central"
return AlibabacloudDingtalkoauth210.Client(config)
}
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
public static func main(_ args: [String]?) async throws -> Void {
var client: AlibabacloudDingtalkoauth210.Client = try Client.createClient()
var getAccessTokenRequest: AlibabacloudDingtalkoauth210.GetAccessTokenRequest = AlibabacloudDingtalkoauth210.GetAccessTokenRequest([
"appKey": "dingeqqpkv3xxxxxx",
"appSecret": "GT-lsu-taDAxxxsTsxxxx"
])
do {
try await client.getAccessToken(getAccessTokenRequest as! AlibabacloudDingtalkoauth210.GetAccessTokenRequest)
}
catch {
if error is Tea.TeaError {
var err = error as! Tea.TeaError
if (!TeaUtils.Client.empty(err.code) && !TeaUtils.Client.empty(err.message)) {
}
} else {
throw error
}
}
}
}
Client.main(CommandLine.arguments)
响应
响应体
| 名称 | 类型 | 示例值 | 描述 |
|---|---|---|---|
| accessToken | String | fw8ef8we8f76e6f7s8dxxxx | 生成的accessToken。 说明 在使用accessToken时,请注意以下几点: - 开发者应自行缓存accessToken,并根据应用维度进行区分存储,因为每个企业内部应用的accessToken相互独立。 - 不可频繁调用本接口获取凭证,建议结合缓存机制控制调用频次,防止被系统限流。 |
| expireIn | Long | 7200 | accessToken的过期时间,单位秒。 说明 accessToken的有效期为7200秒(2小时),有效期内重复获取会返回相同结果并自动续期,过期后获取会返回新的accessToken。 |
响应体示例
HTTP/1.1 200 OK
Content-Type:application/json
{
"accessToken" : "fw8ef8we8f76e6f7s8dxxxx",
"expireIn" : 7200
}
错误码
若调用该接口报错,可根据错误信息在全局错误码文档中查找解决方案。| HttpCode | 错误码 | 错误信息 | 说明 |
|---|---|---|---|
| 400 | invalidClientIdOrSecret | 无效的clientId或者clientSecret | 无效的clientId或者clientSecret |