---
id: "90b94bb24c164725c2ef"
url: "https://www.xmcsl.cn/project/feishu-cli-embed/02-one-click-app/04-%E4%B8%80%E9%94%AE%E5%88%9B%E5%BB%BA%E5%BA%94%E7%94%A8%EF%BC%88Java%EF%BC%89.html"
source_url: "https://open.feishu.cn/document/mcp_open_tools/integrating-agents-with-feishu/create-an-app-in-one-click-java"
source_date: null
checked_at: "2026-11-05T04:21:48.909937+00:00"
status: "ready"
check_scope: "structure_only; not a factual or human review"
body_sha256: "e93d01c6a02a2b8f0957234582a086a0d13d9290f4095aded95d9c54db425721"
---

# 一键创建应用（Java） · 飞书 Agent 接入知识库

Java SDK 提供了 <code>RegisterApp.register</code> 方法，基于 OAuth 2.0 Device Authorization Grant（RFC 8628）协议实现一键创建应用。

 

调用该方法会返回一个验证链接，用户在飞书或 Lark 中打开该链接（或扫码）完成授权后，即可自动注册应用并获取凭据（App ID 和 App Secret），无需手动前往开发者后台创建。

 

查看源码：<a href="https://github.com/larksuite/oapi-sdk-java/blob/v2_main/README.zh.md#%E4%B8%80%E9%94%AE%E5%88%9B%E5%BB%BA%E5%BA%94%E7%94%A8">oapi-sdk-java</a>

 

## 前提条件

 

<ul>&#10;<li>安装 <code>oapi-sdk</code>，且 SDK 版本为 2.6.1 及以上。</li>&#10;</ul>

 

<strong>Maven</strong>：

 

```xml
  <dependency>
      <groupId>com.larksuite.oapi</groupId>
      <artifactId>oapi-sdk</artifactId>
      <version>2.6.1</version>
  </dependency>
```

 

## 快速开始示例

 

```java
import com.lark.oapi.scene.registration.AppPreset;
import com.lark.oapi.scene.registration.RegisterApp;
import com.lark.oapi.scene.registration.RegisterAppException;
import com.lark.oapi.scene.registration.RegisterAppOptions;
import com.lark.oapi.scene.registration.RegisterAppResult;

public class Sample {

public static void main(String[] args) {
        try {
            RegisterAppResult result = RegisterApp.register(
                    RegisterAppOptions.newBuilder()
                            .source("test")
                            .appPreset(AppPreset.newBuilder()
                                    .avatars(
                                            "https://s1-imfile.feishucdn.com/static-resource/v1/v3_00cj_d6bebede-c56b-40a2-b767-8e9da07f3b3g",
                                            "https://s1-imfile.feishucdn.com/static-resource/v1/v2_bc5d2075-fcbd-41f8-bfe3-5a5ecbf0f7dg"
                                    )
                                    .name("{user}的应用")
                                    .desc("由业务平台自动生成")
                                    .build())
                            .onQRCode(info -> {
                                System.out.println("Please scan the QR code:");
                                System.out.println(info.getUrl());
                                System.out.println(String.format("Link expires in %s seconds", info.getExpireIn()));
                            })
                            .onStatusChange(info -> System.out.println(
                                    "status: " + info.getStatus()
                                            + (info.getInterval() > 0
                                            ? String.format(" (Interval: %s seconds)", info.getInterval())
                                            : "")
                            ))
                            .build()
            );

System.out.println("App ID: " + result.getClientId());
            System.out.println("App Secret: " + result.getClientSecret());
            System.out.println("User Info: " + result.getUserInfo());
        } catch (RegisterAppException e) {
            System.err.println("fail: " + e.getCode() + " " + e.getDescription());
        }
    }
}
```

 

真实可运行示例：

 

<ul>&#10;<li><a href="https://www.xmcsl.cn/project/feishu-cli-embed/02-one-click-app/larksuite-oapi/src/test/java/com/lark/oapi/scene/registration/RegisterAppRealDemo.java">RegisterAppRealDemo</a></li>&#10;<li><a href="https://www.xmcsl.cn/project/feishu-cli-embed/02-one-click-app/sample/src/main/java/com/lark/oapi/sample/scene/registration/RegisterAppAppPresetE2E.java">RegisterAppAppPresetE2E</a></li>&#10;<li></li>&#10;</ul>

 

## 自定义权限/事件/回调与更新已有应用

 

创建应用时，可以通过 <code>addons</code> 在平台基础模板上增量申请权限、事件订阅和回调。这些配置会预填到用户打开验证链接后的确认页中，用户确认后生效：

 

```java
import com.lark.oapi.scene.registration.AppAddons;

// 创建：增量申请权限/事件/回调，且只允许创建新应用。
RegisterApp.register(RegisterAppOptions.newBuilder()
        .addons(AppAddons.newBuilder()
                .tenantScopes("im:message:send_as_bot")
                .userScopes("calendar:calendar:read")
                .tenantEvents("im.message.receive_v1")
                .callbacks("card.action.trigger")
                .build())
        .createOnly(true)
        .onQRCode(info -> System.out.println(info.getUrl()))
        .build());

// 更新：传入已有应用的 appId，让用户确认增量配置变更。
RegisterApp.register(RegisterAppOptions.newBuilder()
        .appId("cli_xxx")
        .addons(AppAddons.newBuilder()
                .tenantScopes("drive:drive.metadata:readonly")
                .build())
        .onQRCode(info -> System.out.println(info.getUrl()))
        .build());

// 最小底座：preset(false) 把底座切换为最小基础模板，确认页只展示 addons 中显式声明的配置。
// 此时增量项可以为空。
RegisterApp.register(RegisterAppOptions.newBuilder()
        .addons(AppAddons.newBuilder()
                .preset(false)
                .tenantScopes("im:message:send_as_bot")
                .build())
        .onQRCode(info -> System.out.println(info.getUrl()))
        .build());
```

 

<ul>&#10;<li><code>addons</code> 仅支持增量叠加，不能删减基础模板里的权限。</li>&#10;<li><code>addons.preset</code> 控制底座模板：缺省或 <code>true</code> 保留平台默认模板（含默认权限/事件/回调）；<code>false</code> 切换为最小基础模板（仅机器人能力，无业务权限），最终配置完全由 <code>addons</code> 声明。<code>preset(false)</code> 时增量项可以全部为空。</li>&#10;<li>仅支持 5 类公开配置：应用/用户身份权限、应用/用户身份事件、回调。事件请求 URL、<code>security.&#42;</code>、加密 key 等敏感配置不能通过 <code>addons</code> 传入，需要使用<a href="https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/application-v7/application-v7/application-config/patch">更新应用开发配置 OpenAPI</a>。</li>&#10;<li>SDK 校验数据形状和非空值，不校验权限点/事件/回调名称是否存在于平台目录。</li>&#10;</ul>

 

## RegisterAppOptions 参数

 

<table>&#10;<thead>&#10;<tr>&#10;<th>参数</th>&#10;<th>描述</th>&#10;<th>类型</th>&#10;<th>必须</th>&#10;<th>默认</th>&#10;</tr>&#10;</thead>&#10;<tbody>&#10;<tr>&#10;<td><code>source</code></td>&#10;<td>来源标识，拼入二维码 URL 的 <code>source</code> 参数，格式为 <code>java-sdk/&#123;source&#125;</code></td>&#10;<td><code>String</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>domain</code></td>&#10;<td>自定义飞书认证基地址</td>&#10;<td><code>String</code></td>&#10;<td>否</td>&#10;<td><code>https://accounts.feishu.cn</code></td>&#10;</tr>&#10;<tr>&#10;<td><code>larkDomain</code></td>&#10;<td>自定义 Lark 认证基地址，检测到 Lark 租户时自动切换</td>&#10;<td><code>String</code></td>&#10;<td>否</td>&#10;<td><code>https://accounts.larksuite.com</code></td>&#10;</tr>&#10;<tr>&#10;<td><code>appPreset</code></td>&#10;<td>预设应用信息，用于初始化应用创建页。所有字段都是可选的，用户扫码后仍可在页面手动修改。SDK 会自动对原始值做 URL Encode。</td>&#10;<td><code>AppPreset</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>appPreset.avatar</code></td>&#10;<td>应用头像候选 URL，支持 1-6 个；传多个时默认选中第一个。图片格式、GIF 截帧、裁切和展示由页面/服务端处理。</td>&#10;<td><code>String</code> / <code>String&#91;&#93;</code> / <code>List&lt;String&gt;</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>appPreset.name</code></td>&#10;<td>应用名称，支持 <code>&#123;user&#125;</code> 占位符，由应用创建页替换为扫码用户名称。</td>&#10;<td><code>String</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>appPreset.desc</code></td>&#10;<td>应用描述，支持 <code>&#123;user&#125;</code> 占位符。</td>&#10;<td><code>String</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>addons</code></td>&#10;<td>增量权限/事件/回调配置，预填到确认页。</td>&#10;<td><code>AppAddons</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>addons.preset</code></td>&#10;<td>底座模板开关。缺省或 <code>true</code> 保留平台默认模板；<code>false</code> 切换为最小基础模板，确认页只展示 <code>addons</code> 中显式声明的配置。</td>&#10;<td><code>boolean</code></td>&#10;<td>否</td>&#10;<td>平台默认模板</td>&#10;</tr>&#10;<tr>&#10;<td><code>addons.scopes.tenant</code></td>&#10;<td>应用身份权限列表，例如 <code>im:message:send&#95;as&#95;bot</code>。</td>&#10;<td><code>String&#91;&#93;</code> / <code>List&lt;String&gt;</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>addons.scopes.user</code></td>&#10;<td>用户身份权限列表，例如 <code>calendar:calendar:read</code>。</td>&#10;<td><code>String&#91;&#93;</code> / <code>List&lt;String&gt;</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>addons.events.items.tenant</code></td>&#10;<td>应用身份事件列表，例如 <code>im.message.receive&#95;v1</code>。</td>&#10;<td><code>String&#91;&#93;</code> / <code>List&lt;String&gt;</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>addons.events.items.user</code></td>&#10;<td>用户身份事件列表，例如 <code>calendar.calendar.event.changed&#95;v4</code>。</td>&#10;<td><code>String&#91;&#93;</code> / <code>List&lt;String&gt;</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>addons.callbacks.items</code></td>&#10;<td>回调列表，例如 <code>card.action.trigger</code>。</td>&#10;<td><code>String&#91;&#93;</code> / <code>List&lt;String&gt;</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>createOnly</code></td>&#10;<td>为 <code>true</code> 时落地页仅允许创建新应用，并隐藏选择已有应用入口。</td>&#10;<td><code>boolean</code></td>&#10;<td>否</td>&#10;<td><code>false</code></td>&#10;</tr>&#10;<tr>&#10;<td><code>appId</code></td>&#10;<td>已有应用的 App ID（<code>cli&#95;</code> 前缀）。传入后流程会让用户确认 <code>addons</code> 带来的配置 diff。<code>createOnly</code> 为 <code>true</code> 时页面会忽略该参数。</td>&#10;<td><code>String</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>onQRCode</code></td>&#10;<td>验证链接就绪时的回调，参数为 <code>QRCodeInfo</code>，包含 <code>url</code> 和 <code>expireIn</code></td>&#10;<td><code>Consumer&lt;QRCodeInfo&gt;</code></td>&#10;<td>是</td>&#10;<td>-</td>&#10;</tr>&#10;<tr>&#10;<td><code>onStatusChange</code></td>&#10;<td>轮询状态变化时的回调，参数为 <code>StatusChangeInfo</code></td>&#10;<td><code>Consumer&lt;StatusChangeInfo&gt;</code></td>&#10;<td>否</td>&#10;<td>-</td>&#10;</tr>&#10;</tbody>&#10;</table>

 

## 返回值

 

<table>&#10;<thead>&#10;<tr>&#10;<th>字段</th>&#10;<th>类型</th>&#10;<th>描述</th>&#10;</tr>&#10;</thead>&#10;<tbody>&#10;<tr>&#10;<td><code>clientId</code></td>&#10;<td><code>String</code></td>&#10;<td>App ID</td>&#10;</tr>&#10;<tr>&#10;<td><code>clientSecret</code></td>&#10;<td><code>String</code></td>&#10;<td>App Secret</td>&#10;</tr>&#10;<tr>&#10;<td><code>userInfo</code></td>&#10;<td><code>UserInfo</code></td>&#10;<td>扫码用户信息</td>&#10;</tr>&#10;<tr>&#10;<td><code>userInfo.openId</code></td>&#10;<td><code>String</code></td>&#10;<td>用户的 <code>open&#95;id</code></td>&#10;</tr>&#10;<tr>&#10;<td><code>userInfo.tenantBrand</code></td>&#10;<td><code>String</code></td>&#10;<td><code>"feishu"</code> 或 <code>"lark"</code></td>&#10;</tr>&#10;</tbody>&#10;</table>

 

## 状态回调

 

<table>&#10;<thead>&#10;<tr>&#10;<th>状态</th>&#10;<th>描述</th>&#10;</tr>&#10;</thead>&#10;<tbody>&#10;<tr>&#10;<td><code>polling</code></td>&#10;<td>仍在等待用户授权</td>&#10;</tr>&#10;<tr>&#10;<td><code>slow&#95;down</code></td>&#10;<td>服务端要求降低轮询频率，<code>interval</code> 为新的轮询间隔（秒）</td>&#10;</tr>&#10;<tr>&#10;<td><code>domain&#95;switched</code></td>&#10;<td>SDK 检测到 Lark 租户并切换到 <code>larkDomain</code> 继续轮询</td>&#10;</tr>&#10;</tbody>&#10;</table>

 

## 错误处理

 

<code>RegisterAppException</code> 包含 <code>code</code> 和 <code>description</code> 字段：

 

<table>&#10;<thead>&#10;<tr>&#10;<th>code</th>&#10;<th>描述</th>&#10;</tr>&#10;</thead>&#10;<tbody>&#10;<tr>&#10;<td><code>access&#95;denied</code></td>&#10;<td>用户拒绝了授权</td>&#10;</tr>&#10;<tr>&#10;<td><code>expired&#95;token</code></td>&#10;<td>二维码过期或轮询超时</td>&#10;</tr>&#10;<tr>&#10;<td><code>abort</code></td>&#10;<td>通过线程中断取消了注册流程</td>&#10;</tr>&#10;<tr>&#10;<td><code>invalid&#95;response</code></td>&#10;<td>服务端返回了不符合预期的响应</td>&#10;</tr>&#10;</tbody>&#10;</table>
