# 创建项目接口
# 1.概述
通过调用【创建项目接口】,企业可以将项目同步到美团企业版,如需停用项目,请调用更新项目接口
# 2.接口基本信息
| 信息名称 | 信息描述 |
|---|---|
| 请求方式 | POST |
| 调用地址 | 测试环境:https://waimai-openapi.apigw.test.meituan.com/api/sqt/open/project/create 正式环境:https://bep-openapi.meituan.com/api/sqt/open/project/create |
| 调用方 | 客户平台 |
| 响应方 | 美团企业版 |
| 响应超时时间 | 5s |
| 调用限频 | 每分钟访问不超过100次,每天累计访问不超过100,000次 |
# 2.1 请求体
| 名称 | 类型 | 是否必填 | 示例 | 说明 |
|---|---|---|---|---|
| accessKey | String | 是 | B3GFJIEHNEM1RLV-TK | 美团企业版分配给客户的接入秘钥 |
| content | String | 是 | UgxoCGPQIzoP | 请求体内容,将请求参数JSON序列化后进行加密的结果值,参照:签名实例 |
# content 加密前数据结构
| 名称 | 类型 | 是否必填 | 示例 | 说明 |
|---|---|---|---|---|
| ts | Long | 是 | 1617085650321 | 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 |
| entId | Long | 是 | 46574 | 企业ID |
| projectNo | String | 是 | openapiProject2 | 项目编码(长度[1,128]),唯一标识,不可重复 |
| projectName | String | 是 | 项目1 | 项目名字(长度[1,128]) |
| customField1 | String | 否 | 自定义字段1 | 项目自定义字段1(长度[0,100]) |
| customField2 | String | 否 | 自定义字段2 | 项目自定义字段2(长度[0,100]) |
| customField3 | String | 否 | 自定义字段3 | 项目自定义字段3(长度[0,100]) |
| customField4 | String | 否 | 自定义字段4 | 项目自定义字段4(长度[0,100]) |
| customField5 | String | 否 | 自定义字段5 | 项目自定义字段5(长度[0,100]) |
| parentProjectNo | String | 否 | openapiProject1 | 项目父级编码 |
| suitableType | Integer | 是 | 2 | 项目适用类型(1:全员可用;2:部分适用) |
# 2.2 响应体
| 名称 | 类型 | 是否必填 | 示例 | 说明 |
|---|---|---|---|---|
| traceId | String | 是 | 9042536864303509624 | 日志查询ID |
| status | Integer | 是 | 0 | 0为成功,其他错误见错误码 |
| msg | String | 是 | 失败时的错误描述 | |
| data | String | 是 | null | 响应数据,将响应参数JSON序列化后进行加密的结果值,解密秘钥使用secretKey参数,参照:签名实例 |
# 3.请求示例
# 3.1 请求示例
{
"accessKey": "CC1NRDRJLC76-TK",
"content": "xLui_V-tTTRuqDIp48uFsoCbwnemwtNaKut8miqTJutwdHrUHkzVzX0DTbhpLHBgobaOb1nm2WRBgTmFzwwuVjAHy0s6zu6p1Lw3_5ruURdHUmYhIib1Fyuc_8NjugGFo52oa-EGFk762yWtJ3PSJWg_FjNXcXIrrqAorKWJEYLEk7IYxswJHjXIbmRessLe"
}
# content 明文
{
"ts":1703660390000,
"entId": 101730,
"projectNo": "openapiProject2",
"projectName": "项目",
"customField1": "自定义字段1",
"customField2": "自定义字段2",
"customField3": "自定义字段3",
"customField4": "自定义字段4",
"customField5": "自定义字段5",
"parentprojectNo": "openapiProject1",
"suitableType": 2
}
# 3.2 响应示例
{
"traceId":"56a0af18ae30a168d4006c7c",
"status":0,
"msg":"成功",
"data":null
}
# 4.错误码
# 4.1.公共错误码
| 错误码 | 错误描述 | 解决方案 |
|---|---|---|
| 10010002 | 企业已停止合作,请联系客户经理进行确认 | 将接口调用的entId参数给到客户经理,由客户经理确认企业状态是否在合作中 |
| 10010003 | content不合法 | 详细阅读content参数加密说明(签名实例),确认content加密方式和content解密前传参是否正确 |
| 10010004 | ts缺失或ts时间已过期 | 确认ts是否传值并为13位时间戳,如果正确传值,则确认请求发起时间与美团企业版接受请求的时间差是否超过10分钟 |
| 10010005 | entId不能为空 | entId参数不可为空,如果未拿到entId参数,可以咨询客户经理获取 |
| 20010001 | accessKey不合法 | 检查accessKey是否为客户经理给到的值,如果accessKey值正确,确认调用环境是否和accessKey一致,如使用测试环境的accessKey调用线上的接口 |
| 20010002 | 请求path不合法 | 检查接口调用地址是否正确,如是否有非法字符 |
| 20010003 | 鉴权失败,无接口访问权限 | 将接口调用地址给到客户经理,由客户经理检查接口权限是否开通并保存成功 |
| 20010004 | 越权访问,无法访问该企业数据,请检查entId的正确性 | 检查accessKey和entId两个参数的对应关系是否正确 |
| 30010001 | 访问频率过高 | 请确认接口访问频率,每个接口默认调用限频为每分钟不超过100次,超出调用频率会调用此错误 |
| 30010002 | 访问次数超过配额 | 请确认接口的累计访问次数,每个接口的默认累计调用量为10w次,超出限额则会报错 |
# 4.2.业务错误码
| 错误码 | 错误描述 | 解决方案 |
|---|---|---|
| 10300001 | 参数错误 | 请根据msg中内容排查传值情况,确认必填字段是否传值,字段长度是否正确 |
| 10300007 | 项目已经存在 | 检查当前项目编码是否已经创建 |
| 10300009 | 父级不存在 | 检查父级项目是否存在 |
| 10300016 | 适用类型无效 | 检查suitableType是否合法 |
| 40300001 | 服务错误 | 请提供响应结果中的traceId参数,联系客户经理进行排查 |
| 40300002 | 请勿重复调用 | 检查是否多次重复调用 |
| 40300004 | 创建项目失败 | 请稍后重试或提供请求中的项目编码,联系客户经理排查 |
# 5.代码实例
依赖SDK包地址:SDK下载地址
package com.meituan.sqt.demo.in.project;
import com.meituan.sqt.client.SqtClient;
import com.meituan.sqt.constant.CommonConstants;
import com.meituan.sqt.enums.ResponseStatusEnum;
import com.meituan.sqt.exception.MtSqtException;
import com.meituan.sqt.request.in.project.ProjectCreateRequest;
import com.meituan.sqt.response.in.BaseApiResponse;
import java.util.Objects;
public class ProjectCreateDemo {
private static final String invokeUrl = "https://waimai-openapi.apigw.test.meituan.com/api/sqt/open/project/create";
private static SqtClient sqtClient = null;
static {
// 初始化SqtClient,只需要初始化一次即可
// entId,accessKey,secretKey需要根据不同环境动态的设置获取
sqtClient = new SqtClient.Builder()
.setEntId(CommonConstants.entId)
.setAccessKey(CommonConstants.accessKey)
.setSecretKey(CommonConstants.secretKey)
.build();
}
public static void main(String[] args) throws MtSqtException {
// 1. 构建请求对象
ProjectCreateRequest projectCreateRequest = new ProjectCreateRequest();
projectCreateRequest.setTs(System.currentTimeMillis());
projectCreateRequest.setEntId(sqtClient.getEntId());
projectCreateRequest.setProjectNo("openapiProject2");//唯一标识,不可重复,必填
projectCreateRequest.setProjectName("测试成本中心");//必填
projectCreateRequest.setCustomField1("额外字段1");
projectCreateRequest.setCustomField2("额外字段2");
projectCreateRequest.setCustomField3("额外字段3");
projectCreateRequest.setCustomField4("额外字段4");
projectCreateRequest.setCustomField5("额外字段5");
projectCreateRequest.setParentProjectNo("openapiProject1");
projectCreateRequest.setSuitableType(2);//1:全员适用 2:部分适用;必填
// 2. API调用
// 注意:超时时间默认以请求对象中注解ApiMeta上设置的为准,也可以自定义传递对应的超时时间
BaseApiResponse<String> response = sqtClient.invokeApi(invokeUrl, projectCreateRequest, null, null);
// 3. 响应结果为空处理
if (response == null) {
// 处理响应结果为空情况
// ...
}
// 4. 获取请求结果
if(Objects.equals(ResponseStatusEnum.SUCCESS.getCode(), response.getStatus())) {
// 4.1 处理创建成功后的业务逻辑
} else {
// 处理请求失败场景
handleRespFailResult(response);
}
}
private static void handleRespFailResult(BaseApiResponse<String> response) {
// 访问频率过高
if (ResponseStatusEnum.HIGH_FREQUENCY_ACCESS.getCode().intValue() == response.getStatus()) {
// 解决方案参照:https://h5.dianping.com/app/bep-docs/open-platform-doc/guide/rate_limiting.html
}
// 访问次数超过配额
if (ResponseStatusEnum.EXCEED_ACCESS_NUMBER.getCode().intValue() == response.getStatus()) {
// 解决方案参照:https://h5.dianping.com/app/bep-docs/open-platform-doc/guide/rate_limiting.html
}
// 其它失败场景,解决方案参考:https://h5.dianping.com/app/bep-docs/open-platform-doc/cost/cost_create.html
System.out.println(response.getMsg());
}
}
# 6.版本记录
| 版本号 | 版本日期 | 更新内容 |
|---|---|---|
| V1.0 | 2024-01-08 | 初版 |