# 上传代码并生成体验版

[调试诊断](https://developers.weixin.qq.com/console/devtools/debug?utm_source=api_tools)

> 接口应在服务器端调用，不可在前端（小程序、网页、APP等）直接调用，具体可参考[接口调用指南](/doc/oplatform/developers/dev/guide.md)。

接口英文名：commit

本接口用于上传第三方代开发小程序的代码并生成体验版。具体使用流程为：第三方平台需要先通过[addToTemplate接口](/doc/oplatform/openApi/thirdparty-management/template-management/api_addtotemplate)将草稿添加到代码模板库，然后从代码模板库中通过[getTemplateList接口](/doc/oplatform/openApi/thirdparty-management/template-management/api_gettemplatelist)获取对应的模板 id（template_id），然后调用本接口可以为已授权的小程序上传代码并生成体验版。

更多关于第三方平台代开发小程序模板库管理查看文档：[小程序模板库](/doc/oplatform/Third-party_Platforms/2.0/operation/thirdparty/template.md)

## 1. 调用方式

### HTTPS 调用

```bash
POST https://api.weixin.qq.com/wxa/commit?access_token=ACCESS_TOKEN
```

### 云调用

- 本接口不支持云调用。

### 第三方调用

- 本接口支持第三方平台代商家调用。

- 该接口所属的权限集 id 为：18

- 服务商获得其中之一权限集授权后，可通过使用 [authorizer_access_token](/doc/oplatform/developers/dev/AuthorizerAccessToken.md) 代商家进行调用，具体可查看 [第三方调用](/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/call_interface.md) 说明文档。

## 2. 请求参数

### 查询参数 `Query String Parameters`

```json
[
  {
    "参数名": "access_token",
    "类型": "string",
    "必填": "是",
    "说明": "接口调用凭证，可使用 [authorizer_access_token](/doc/oplatform/openApi/ticket-token/api_getauthorizeraccesstoken)"
  }
]
```

### 请求体 `Request Payload`

```json
[
  {
    "参数名": "template_id",
    "类型": "number",
    "必填": "是",
    "说明": "代码库中的代码模板 ID，可通过[getTemplateList接口](/doc/oplatform/openApi/thirdparty-management/template-management/api_gettemplatelist)获取代码模板template_id。"
  },
  {
    "参数名": "ext_json",
    "类型": "string",
    "必填": "是",
    "说明": "为了方便第三方平台的开发者引入 extAppid 的开发调试工作，引入[ext.json配置文件](/miniprogram/dev/devtools/ext.md#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF%E5%BC%80%E5%8F%91)概念，该参数则是用于控制ext.json配置文件的内容。关于该参数的补充说明请查看下方的\"ext_json补充说明\"。"
  },
  {
    "参数名": "user_version",
    "类型": "string",
    "必填": "是",
    "说明": "代码版本号，开发者可自定义（长度不要超过 64 个字符）"
  },
  {
    "参数名": "user_desc",
    "类型": "string",
    "必填": "是",
    "说明": "代码描述，开发者可自定义"
  }
]
```

## 3. 返回参数

### 返回体 `Response Payload`

```json
[
  {
    "参数名": "errcode",
    "类型": "number",
    "说明": "返回码"
  },
  {
    "参数名": "errmsg",
    "类型": "string",
    "说明": "返回信息"
  }
]
```

## 4. 注意事项

- 如果接口中涉及地理位置相关隐私接口，需要在ext_json参数中配置requiredPrivateInfos
- 上传代码后，需要等检测任务结束后方可[提交代码审核](api_submitaudit)，否则提交代码审核时会出现61039报错
- 开发者可以通过[getCodePrivacyInfo](api_getcodeprivacyinfo)接口获取检测结果，确认检测任务结束后再提交代码审核
- 不要将[上传代码](api_commit)和[提交代码审核](api_submitaudit)两个接口一起重试，否则每次上传代码后的检测任务未结束又发起新的检测任务，依旧会出现61039报错。
- 如果代码里使用了地理位置相关接口，但是又尚未在ext_json参数中配置requiredPrivateInfos。那么提交代码审核时会出现61040报错。
- 如果代码里使用了地理位置相关接口，但是该小程序appid又未获得对应地理位置api的权限，那么提交代码审核时会出现61040报错。如果开发者确认不需要使用地理位置相关接口，那么不需要去申请权限，只需要通过[提交代码审核](api_submitaudit)接口中的privacy_api_not_use参数进行声明不使用即可

# 其他说明 

## 关于新增requiredPrivateInfos说明

- 关于地理位置接口新增与相关流程调整可以查看社区公告：[https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01](https://developers.weixin.qq.com/community/develop/doc/000a02f2c5026891650e7f40351c01)，7.14后，在代码中使用的地理位置相关接口（共计 8 个，见表1），第三方开发者均需要在 ext_json 参数中 requiredPrivateInfos 配置项中声明
- 在ext_json参数中配置requiredPrivateInfos，其规则为「整体替换」。即如果在app.json里也配置了，那么最终会是ext_json的配置会覆盖app.json配置的requiredPrivateInfos。其余规则可查看下方的「ext_json补充说明」
- 在ext_json参数中配置requiredPrivateInfos示例如下

```json
{
  "template_id": "95",
  "ext_json": "{\"requiredPrivateInfos\":[\"onLocationChange\",\"startLocationUpdate\"]}",
  "user_version": "V1.0",
  "user_desc": "test"
}
```
- requiredPrivateInfos主要会检查格式是否正确，填入的api名称是否正确，填入的api名称是否有权限，填入的api名称是否互斥。对应的错误码可查看文档末尾的错误码文档。
- requiredPrivateInfos在2022.7.14后才会生效，文档提前更新是为了方便开发者可以提前了解接口的参数变更规则，提前进行调整。

### ext_json补充说明

1. 为了便于第三方平台使用同一个小程序模板为不同的小程序提供服务，第三方可以将自定义信息放置在 ext_json 中，在模板小程序中，可以使用 [`wx.getExtConfigSync`](/miniprogram/dev/api/ext/wx.getExtConfigSync.md) 接口获取自定义信息，从而区分不同的小程序。详见：[小程序模板开发](/miniprogram/dev/devtools/ext.md#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF%E5%BC%80%E5%8F%91)
2. ext_json 中的参数可选，参数详见[小程序配置](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html);
3. ext_json 中有限支持 pages，支持配置模板页面的子集（ext_json 中不可新增页面）。
4. ext_json 中有限支持 subPackages，支持配置模板分包及其页面的子集（ext_json 中配置的分包必须已声明于模板中，且不可新增分包页面）。
5. ext_json支持plugins配置，该配置会覆盖模板中的app.json中的plugins配置。关于plugin的使用详情请参考[使用插件](/miniprogram/dev/framework/plugin/using.md)。
6. 如果代码中已经有配置，则配置的合并规则为：

- ext整体替换
- pages整体替换
- extPages中找到对应页面，同级覆盖page.json
- window同级覆盖
- extAppid直接加到app.json
- networkTimeout同级覆盖
- customOpen整体替换
- tabbar同级覆盖
- functionPages整体替换
- subPackages整体替换
- navigateToMiniProgaramAppIdList：整体替换
- plugins整体替换

补充说明：

- 什么叫同级覆盖？以『window同级覆盖』为例，遍历extjson的window对象成员，如果app.json的window对象存在该对象成员，则覆盖，如果不存在，就添加。
- 什么叫整体替换？以『plugins整体替换』为例，如果app.json存在plugin对象，就用extjson里的plugin对象覆盖，如果不存在，就添加。

特殊字段说明：

| 参数     | 说明                                           |
| -------- | ---------------------------------------------- |
| ext      | 自定义字段仅允许在这里定义，可在小程序中调用   |
| extPages | 页面配置                                       |
| extAppid | 授权方 Appid，可填入商户 AppID，以区分不同商户 |
| sitemap  | 用于配置小程序及其页面是否允许被微信索引       |

## 5. 代码示例

请求示例

```json
{
  "template_id": "0",
  "ext_json": "{\"extAppid\":\"\",\"ext\":{\"attr1\":\"value1\",\"attr2\":\"value2\"},\"extPages\":{\"index\":{},\"search/index\":{}},\"pages\":[\"index\",\"search/index\"],\"window\":{},\"networkTimeout\":{},\"tabBar\":{},\"plugin\":{}}",
  "user_version": "V1.0",
  "user_desc": "test"
}
```

返回示例

```json
{
  "errcode": 0,
  "errmsg": "ok"
}
```

## 6. 错误码

以下是本接口的错误码列表，其他错误码可参考 [通用错误码](/doc/oplatform/developers/errCode/README.md)；调用接口遇到报错，可使用官方提供的 [API 诊断工具](https://developers.weixin.qq.com/console/devtools/debug?utm_source=api_errcode) 辅助定位和分析问题。

```json
[
  {
    "错误码": "-60005",
    "错误描述": "",
    "解决方案": ""
  },
  {
    "错误码": "-1",
    "错误描述": "system error",
    "解决方案": "系统繁忙，此时请开发者稍候再试"
  },
  {
    "错误码": "40001",
    "错误描述": "invalid credential  access_token isinvalid or not latest",
    "解决方案": "获取 access_token 时 AppSecret 错误，或者 access_token 无效。请开发者认真比对 AppSecret 的正确性，或查看是否正在为恰当的公众号调用接口"
  },
  {
    "错误码": "40014",
    "错误描述": "invalid access_token",
    "解决方案": "不合法的 access_token ，请开发者认真比对 access_token 的有效性（如是否过期），或查看是否正在为恰当的公众号调用接口"
  },
  {
    "错误码": "80066",
    "错误描述": "",
    "解决方案": "非法的插件版本"
  },
  {
    "错误码": "80067",
    "错误描述": "",
    "解决方案": "找不到使用的插件"
  },
  {
    "错误码": "80082",
    "错误描述": "",
    "解决方案": "没有权限使用该插件"
  },
  {
    "错误码": "85013",
    "错误描述": "invalid ext_json, parse fail or containing invalid path",
    "解决方案": "无效的自定义配置"
  },
  {
    "错误码": "85014",
    "错误描述": "template not exist",
    "解决方案": "无效的模板编号"
  },
  {
    "错误码": "85043",
    "错误描述": "invalid template, something wrong?",
    "解决方案": "模板错误"
  },
  {
    "错误码": "85044",
    "错误描述": "package exceed max limit",
    "解决方案": "代码包超过大小限制"
  },
  {
    "错误码": "85045",
    "错误描述": "some path in ext_json not exist",
    "解决方案": "ext_json 有不存在的路径"
  },
  {
    "错误码": "85046",
    "错误描述": "pagepath missing in tabbar list",
    "解决方案": "tabBar 中缺少 path"
  },
  {
    "错误码": "85047",
    "错误描述": "pages are empty",
    "解决方案": "pages 字段为空"
  },
  {
    "错误码": "85048",
    "错误描述": "parse ext_json fail",
    "解决方案": "ext_json 解析失败"
  },
  {
    "错误码": "85310",
    "错误描述": "is wrong API name",
    "解决方案": "requiredPrivateInfos 的格式有问题或者api名称写错了"
  },
  {
    "错误码": "85311",
    "错误描述": "is mutually exclusive",
    "解决方案": "requiredPrivateInfos包含了互斥的api"
  },
  {
    "错误码": "85312",
    "错误描述": "is not authorized",
    "解决方案": "requiredPrivateInfos 配置了没有权限的api"
  },
  {
    "错误码": "9402202",
    "错误描述": "concurrent limit",
    "解决方案": "请勿频繁提交，待上一次操作完成后再提交"
  },
  {
    "错误码": "9402203",
    "错误描述": "标准模板extjson错误",
    "解决方案": "标准模板ext_json错误，传了不合法的参数， 如果是标准模板库的模板，则ext_json支持的参数仅为{\"extAppid\":'', \"ext\": {}, \"window\": {}}"
  }
]
```

## 7. 适用范围

本接口支持「第三方平台」账号类型代调用，权限集请参考「调用方式」部分。其他账号类型如无特殊说明，均不可调用。
