dd.getAuthCode接口报错

阿里云服务器

dd.getAuthCode 是钉钉(DingTalk)JSAPI 中用于获取免登授权码(authCode) 的核心接口。该接口报错是开发钉钉内部应用或H5应用时的常见问题。

报错原因多种多样,需要系统性地排查。以下是详细的错误分析与解决方案:


一、 常见错误类型与原因

错误表现可能原因
dd.getAuthCode is not a functionJSAPI 未正确引入或版本问题
接口调用无反应,无回调网络问题、页面未在钉钉客户端打开
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

  • onFaildd.error 是否有错误信息输出。

步骤3:检查应用配置(钉钉开发者后台)

  1. JSAPI 权限

    • 登录 钉钉开发者后台

    • 进入你的应用。

    • “开发管理” -> “权限管理” 中,确保已添加 获取免登授权码 权限。

    • 提交审核(如果需要)。

  2. 可信域名

    • 可信域名:https://yourapp.com

    • 允许的页面:https://yourapp.com/page1.html

    • 禁止的页面https://sub.yourapp.com/page.htmlhttp://yourapp.com/page.html(协议不同)

    • “开发信息” -> “网页授权及JSAPI” 中,配置 可信域名

    • 你调用 dd.getAuthCode 的页面URL必须以该域名为根,例如:

  3. 应用类型

    • 确认你的应用是 “企业内部应用”“第三方企业应用”,个人应用不支持此接口。

步骤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 时,appkeyappsecret 必须与前端应用匹配。

步骤5:调试技巧

  1. 使用钉钉开发者工具

    • 下载“钉钉开发者工具”,可以模拟钉钉环境,方便调试JSAPI。

  2. 查看控制台日志

    • 在钉钉App内,通过“设置”->“开发者选项”开启“JSAPI调试”,查看详细日志。

  3. 检查网络请求

    • 使用 Charles 或 Fiddler 抓包,确认 getAuthCode 请求是否发出,响应是什么。


三、 常见错误代码速查

错误码含义解决方案
10000dd.error 回调JSAPI 配置错误,检查 agentConfig 或可信域名
2onFail 回调网络问题或用户取消
60012JSAPI not exist未在权限管理中添加 getAuthCode 权限
60020access_denied用户无权限使用该应用
60030invalid url当前页面URL不在可信域名内

总结

dd.getAuthCode 报错,90% 的问题出在环境、引入、配置和域名上

请按此清单检查

  1. ✅ 是否在钉钉App内打开页面?

  2. ✅ 是否正确引入了 dingtalk.open.js

  3. ✅ 是否在 dd.ready 后调用?

  4. ✅ 应用的 JSAPI权限 是否已添加 获取免登授权码

  5. ✅ 当前页面URL是否在 可信域名 白名单内?

  6. authCode 是否在服务端立即、一次性使用?

通过以上步骤,绝大多数 dd.getAuthCode 报错都能得到解决。