dd.getAuthCode 是钉钉(DingTalk)JSAPI 中用于获取免登授权码(authCode) 的核心接口。该接口报错是开发钉钉内部应用或H5应用时的常见问题。
报错原因多种多样,需要系统性地排查。以下是详细的错误分析与解决方案:
一、 常见错误类型与原因
| 错误表现 | 可能原因 |
|---|---|
dd.getAuthCode is not a function | JSAPI 未正确引入或版本问题 |
| 接口调用无反应,无回调 | 网络问题、页面未在钉钉客户端打开 |
runtime.invalid / JSAPI not exist | 应用未正确配置JSAPI权限 |
access_denied / permission denied | 当前用户无权限使用该应用或JSAPI |
回调成功但 authCode 为空或无效 | 服务端获取 accessToken 失败,或 authCode 被重复使用 |
corpid not match | 应用配置的 corpId 与当前企业不匹配 |
二、 系统性排查与解决方案
步骤1:确认调用环境
dd.getAuthCode 只能在钉钉客户端(App或PC)内打开的页面中调用。
✅ 正确环境:在钉钉App内点击链接打开你的H5页面。
❌ 错误环境:
在微信、浏览器中直接打开。
在钉钉外部浏览器(如Safari)中打开。
钉钉小程序中(小程序使用
dd.getJSApiTicket)。
解决:确保你在钉钉App内测试。
步骤2:检查 JSAPI 引入与配置
这是最常见的错误来源。
<!-- 1. 引入钉钉JSAPI -->
<script src="https://g.alicdn.com/dingding/open-develop/1.10.5/dingtalk.open.js"></script>
<script>
// 2. 必须在 dd.ready 后调用
dd.ready(function() {
// 3. 调用 getAuthCode
dd.getAuthCode({
corpId: "your_corpId", // 可选,多企业应用时必填
onSuccess: function(result) {
var code = result.code; // 获取 authCode
console.log('authCode: ' + code);
// 立即将 code 发送到你的服务端
sendCodeToServer(code);
},
onFail: function(err) {
console.log('getAuthCode failed: ' + JSON.stringify(err));
}
});
});
// 4. dd.error 用于捕获配置错误
dd.error(function(err) {
console.log('dd error: ' + JSON.stringify(err));
});
</script>检查点:
✅
dingtalk.open.js的CDN链接是否正确、可访问。✅ 是否在
dd.ready回调内调用dd.getAuthCode。✅
onFail和dd.error是否有错误信息输出。
步骤3:检查应用配置(钉钉开发者后台)
JSAPI 权限:
登录 钉钉开发者后台。
进入你的应用。
在 “开发管理” -> “权限管理” 中,确保已添加
获取免登授权码权限。提交审核(如果需要)。
可信域名:
可信域名:
https://yourapp.com允许的页面:
https://yourapp.com/page1.html禁止的页面:
https://sub.yourapp.com/page.html或http://yourapp.com/page.html(协议不同)在 “开发信息” -> “网页授权及JSAPI” 中,配置
可信域名。你调用
dd.getAuthCode的页面URL必须以该域名为根,例如:应用类型:
确认你的应用是 “企业内部应用” 或 “第三方企业应用”,个人应用不支持此接口。
步骤4:处理 authCode
authCode 是一次性的,必须立即发送到你的服务端,并调用钉钉服务端API换取用户信息。
服务端流程(Node.js 示例):
const axios = require('axios');
async function getUserInfo(authCode) {
try {
// 1. 获取 accessToken
const tokenRes = await axios.get('https://oapi.dingtalk.com/gettoken', {
params: {
appkey: 'your_appkey',
appsecret: 'your_appsecret'
}
});
const accessToken = tokenRes.data.access_token;
// 2. 用 authCode 换取用户信息
const userRes = await axios.post('https://oapi.dingtalk.com/topapi/v2/user/getuserinfo', {
code: authCode
}, {
params: { access_token: accessToken }
});
if (userRes.data.errcode === 0) {
const userId = userRes.data.result.userid;
console.log('User ID:', userId);
return userId;
} else {
throw new Error(userRes.data.errmsg);
}
} catch (error) {
console.error('Get user info failed:', error.message);
}
}注意:
authCode有效期为 5分钟。只能使用一次,重复使用会失败。
服务端获取
accessToken时,appkey和appsecret必须与前端应用匹配。
步骤5:调试技巧
使用钉钉开发者工具:
下载“钉钉开发者工具”,可以模拟钉钉环境,方便调试JSAPI。
查看控制台日志:
在钉钉App内,通过“设置”->“开发者选项”开启“JSAPI调试”,查看详细日志。
检查网络请求:
使用 Charles 或 Fiddler 抓包,确认
getAuthCode请求是否发出,响应是什么。
三、 常见错误代码速查
| 错误码 | 含义 | 解决方案 |
|---|---|---|
10000 | dd.error 回调 | JSAPI 配置错误,检查 agentConfig 或可信域名 |
2 | onFail 回调 | 网络问题或用户取消 |
60012 | JSAPI not exist | 未在权限管理中添加 getAuthCode 权限 |
60020 | access_denied | 用户无权限使用该应用 |
60030 | invalid url | 当前页面URL不在可信域名内 |
总结
dd.getAuthCode 报错,90% 的问题出在环境、引入、配置和域名上。
请按此清单检查:
✅ 是否在钉钉App内打开页面?
✅ 是否正确引入了
dingtalk.open.js?✅ 是否在
dd.ready后调用?✅ 应用的 JSAPI权限 是否已添加
获取免登授权码?✅ 当前页面URL是否在 可信域名 白名单内?
✅
authCode是否在服务端立即、一次性使用?
通过以上步骤,绝大多数 dd.getAuthCode 报错都能得到解决。