## 概述
小程序运营者，可以一键授权给第三方平台，通过第三方平台来完成业务。第三方平台在小程序的前后端开发上同直接开发小程序有所区别，其所拥有的各项 API 以及详细说明请查看 [第三方平台-接口文档](/doc/oplatform/Third-party_Platforms/2.0/product/Open_Platform_Account_Management.md) ，其余部分请阅读下文。

开发第三方平台小程序具有一定的复杂性，首先需要确认三个概念：

- open3rd：第三方平台，是小程序官方认可的第三方开发商 [详情](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318292&token=&lang=zh_CN)
- 3rdMiniProgramAppid：第三方平台申请的并绑定在该平台上的小程序，用于开发小程序模板
- extAppid：授权给第三方平台的小程序

第三方平台相关的小程序开发需要做一些特殊的处理：

- 小程序模板的开发
- 小程序模板结合 extAppid 的开发调试
- 使用 `directCommit` 直接提交至待审核列表 详情

最新版本的开发工具支持第三方平台小程序的开发和预览。

## 创建项目

与开发普通小程序一致，第三方平台开发者填入相关的 3rdMiniProgramAppid ，设定项目名称和选择项目目录即可创建项目。

对于第三方平台小程序，可以在项目页卡查看到相关的 open3rd 信息以及当前的第三方的 3rdMiniProgramAppid ，如若项目配置了相关的 extAppid ，那么项目页卡中也会有相关信息。

![ext](https://res8.wxqcloud.qq.com.cn/wxdoc/99a7df15-a83e-4edf-b5a0-756b9ef5a4a2.png)

## 小程序模板开发

与开发普通小程序一致，开发者在开发工具上开发好相关的业务逻辑之后，在项目页卡中提交预览即可以在微信中查看小程序的真实表现。

有所不同的是，第三方平台小程序的提交上传是上传至该第三方平台的 open 账号下的第三方平台里的模板草稿箱中，该平台的管理员需要自行对该模板进行相应的设置，更多请参考 [第三方平台的文档](/doc/oplatform/Third-party_Platforms/2.0/operation/thirdparty/template.md) 。

## extAppid  的开发调试

为了方便第三方平台的开发者引入 extAppid 的开发调试工作，需要引入 `ext.json` 的概念。

`ext.json` 是一个配置文件，放置在 project.config.json 文件中 miniprogramRoot 指定的目录中与 app.json 同级。

以下是一个包含了所有配置选项的 `ext.json` ：

```json
{
  "extEnable": true,
  "extAppid": "wxf9c4501a76931b33",
  "directCommit": false,
  "ext": {
    "name": "wechat",
    "attr": {
      "host": "open.weixin.qq.com",
      "users": [
        "user_1",
        "user_2"
      ]
    }
  },
  "extPages": {
    "pages/logs/logs": {
      "navigationBarTitleText": "logs"
    }
  },
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "Demo",
    "navigationBarTextStyle":"black"
  },
  "tabBar": {
    "list": [{
      "pagePath": "pages/index/index",
      "text": "首页"
    }, {
      "pagePath": "pages/logs/logs",
      "text": "日志"
    }]
  },
  "networkTimeout": {
    "request": 10000,
    "downloadFile": 10000
  },
  {
  "plugins": {
    "myPlugin": {
      "version": "1.0.0",
      "provider": "wxidxxxxxxxxxxxxxxxx"
    }
  }
}
}
```

### 补充

1、关于插件的使用请参考[使用插件](/miniprogram/dev/framework/plugin/using.md)。

2、第三方代开发小程序，如果已经在app.json已经配置
```
{
  "lazyCodeLoading": "requiredComponents"
}
```

那么，也需要在ext.json里面配置

```
{
  "lazyCodeLoading": "requiredComponents"
}
```

### `ext.json`中的配置字段分为两种

- 特有的字段
- 同 `app.json` 相同的字段

## 特有的字段

| 属性                      | 类型           | 必填   | 描述               |
| ----------------------- | ------------ | ---- | ---------------- |
| extEnable | Boolean      | 是    | 配置 ext.json 是否生效 |
| extAppid   | String       | 是    | 配置 extAppid      |
| ext             | Object       | 否    | 开发自定义的数据字段       |
| extPages   | String Array | 否    | 单独设置每个页面的 json   |
| directCommit   | Boolean | 否    | 是否直接提交到待审核列表   |

### extEnable

`extEnable` 是一个 `Boolean` 类型的字段，用于规定当前的 `ext.json` 文件是否生效，开发者可以通过修改这个字段来开启和关闭 extAppid 的结合开发。

### extAppid

`extAppid` 是授权调试的 `AppID` ，例如开发者在此处填写的是 `wxf9c4501a76931b33` 那么在 `extEnable` 为真的情况下，后续的开发逻辑都会基于 `wxf9c4501a76931b33` 来运行。

### ext

`ext` 字段是开发自定义的数据字段，在小程序中可以通过 [wx.getExtConfigSync](/minigame/dev/api/ext/wx.getExtConfigSync.md) 或者 [wx.getExtConfig](/minigame/dev/api/ext/wx.getExtConfig.md) 获取到这些配置信息。

例如上面的例子中，通过 [wx.getExtConfigSync](/minigame/dev/api/ext/wx.getExtConfigSync.md) 就可以获得 `ext` 字段的所有配置

```json
{
  "name": "wechat",
  "attr": {
    "host": "open.weixin.qq.com",
    "users": [
      "user_1",
      "user_2"
    ]
  }
}
```

### extPages

`extPages` 是一个对象，对象中的每个 `key` 应该是该小程序模板 `app.json` 中定义的页面，每个 `key` 对应的 `value` 是 [page.json](../framework/config.md#页面配置) 中所规定的各项配置。

当开发者设置这个配置以后，小程序框架会对应的修改相对应的 `page` 的配置信息。

### directCommit

`directCommit` 是一个 `Boolean` 类型的字段，用于规定当前的上传操作是否是直接上传到 extAppid 的审核列表中。

当 `directCommit` 为 `true` 真时，开发者在工具中的上传操作，会直接上传到对应的 extAppid 的审核列表，第三方平台只需要调用 `https://api.weixin.qq.com/wxa/submit_audit?access_token=TOKEN` 即可以提交审核。更多请参考 [第三方平台文档](/doc/oplatform/Third-party_Platforms/2.0/getting_started/terminology_introduce.md)

当 `directCommit` 为 `false` 或者没有定义时，开发者在工具中的上传操作，会直接上传到对应的草稿箱中。

*tips: 可以使用工具的命令行接口 或者 http 接口来实现自动化的代码提交审核*

### 同 `app.json` 相同的字段

当 `ext.json` 中的字段同 `app.json` 中一致时，`ext.json` 的字段会覆盖 `app.json` 中的对应字段，例如以下的 `ext.json`

```json
{
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "ext navigationBarTitleText",
    "navigationBarTextStyle":"black"
  }
}
```

那么该小程序最终的 `navigationBarTitleText` 应该是 `ext navigationBarTitleText` 。
