【泛知识】添加课程
API 说明
该接口用于添加新课程,调用成功后会返回课程唯一标识 product_id 且课程会进审,审核通过后课程上架。具体添加流程如下:

使用限制
无
接口说明
前提条件
- 添加的课程必须为首次上传,若要修改已有课程请调用修改课程接口
- 资源 uri 类型的字段需要先调用资源上传接口,收到上传成功回调消息,或者调用查询资源上传状态接口确认状态为上传成功后才有效,否则会报"无效的 uri"错误
注意事项
- 审核通过后返回的 product_id 才生效,审核不通过返回的 product_id 失效,按照要求修改后需要重新调用添加课程接口上传获取新的 product_id
- 审核通过后自动上架,无需再调用上架课程接口
- 调用添加接口后,如果需要对审核中的课程进行修改,请调用修改课程接口
- 若未做额外备注,string 类型的字段默认支持字符集为 utf-8
- 价格单位统一为分
基本信息
HTTP URL | https://developer-product.zijieapi.com/product/api/add |
---|---|
HTTP Method | POST |
权限要求 | AccessToken鉴权 |
请求头
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
Content-Type | string | 是 | 请求的MIME类型,统一为application/json | "application/json" |
请求参数
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
access_token | string | 是 | 接口调用凭证 | "0801121846735352506a356a67395167574457583155554e67653d3d" |
product_type | enum | 是 | 商品类型,枚举值 1: 课程 | 1 |
product | object | 是 | 商品信息 | 详见下方product参数 |
参数说明
product--商品信息
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
common_product_params | object | 是 | 商品通用参数 | 详见下方common_product_params参数 |
course_params | object | 否 | 课程参数,当商品类型为课程(product_type=1)时必填 | 详见下方course_params参数 |
common_product_params--商品通用参数
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
appid | string | 是 | 小程序appid | "tt12fd9846e1023401" |
first_class | number | 是 | 一级课程分类,详见这里 | 10000 |
second_class | number | 是 | 二级课程分类,详见这里 | 10100 |
title | string | 是 | 课程名称,12字节<= title字符长度 <=60字节,汉字字符占2个字节 | "python入门教程" |
purchase_precaution | string | 是 | 购课须知,0 < perchase_precaution字符长度<=500字节,汉字字符占1个字节 | "小程序内购买课程为课程兑换权益,购买成功后将自动兑换到您的账户内,可在****中重复学习观看。" |
industry_type | enum | 是 | 行业类目, 枚举值 1-泛知识 | 1 |
product_fulfillment_lst | array | 是 | 课程履约列表,uri需要调用上传资源接口成功后获取 要求:
| [ { "fulfillment_content": { "fulfillment_uri": "product/resource/0001d044d41140d53ce9e57d793a4321", "text": "", "name": "课程履约视频" }, "fulfillment_type": 1 }, { "fulfillment_content": { "fulfillment_uri": "product/resource/1001d044d41140d53ce9e57d793a4321", "text": "", "name": "课程履约音频" }, "fulfillment_type": 2 }, { "fulfillment_content": { "fulfillment_uri": "product/resource/2001d044d41140d53ce9e57d793a4321", "text": "", "name": "课程履约图片" }, "fulfillment_type": 3 } ] |
price_info | object | 是 | 课程价格信息 | { "unit": "天", "price": 5000, "real_price": 4900 } |
path_info_lst | array | 是 | 抖音视频挂载的小程序页面路径列表,0 < 列表长度 <= 5,需要包括此课程的所有路径,只有在该列表中的路径才能在抖音视频锚点处挂载 | [ { "path": "page/index/index", "query": { "curriculum_id": "382648" } } ] |
product_detail_lst | array | 是 | 商品详情列表,0 < 列表长度 <= 2000,列表中的商品详情顺序需要与小程序页面中展示顺序一致 | [ { "text": "1. python安装步骤", "img_uri": "product/resource/5001d044d41140d53ce9e57d793a4321" } ] |
anchor_info | object | 是 | 锚点信息 | { "video_anchor_info": { "anchor_title": "python入门教程" } } |
callback_data | string | 否 | 开发者回调,<= 1024byte | "开发者自定义回调信息" |
product_img_uri | string | 否,若要接入交易2.0则必填 | 课程图片uri, 需要调用资源上传接口获取,开头为"tos-cn-i-b2i6zad4el/" | "tos-cn-i-b2i6zad4el/b0e72a2e9c5ee919c65a9b0276315cf9" |
product_fulfillment--履约内容
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
fulfillment_content | object | 是 | 履约详情,用户购买课程后能学习的内容 | { "fulfillment_uri": "product/resource/0001d044d41140d53ce9e57d793a4321", "name": "课程履约视频" } |
fulfillment_type | enum | 是 | 履约类型,枚举值,详见fulfillment_type枚举列表 | 3 |
fulfillment_content--履约详情
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
fulfillment_uri | string | 否 | 履约文件资源uri,需要调用上传课程资源接口上传后获得,当履约类型不为文字或富文本时必填 | "product/resource/1001d044d41140d53ce9e57d793a4321" |
text | string | 否 | 文字内容,当履约类型为文字,图文和富文本时必填,0 < text字符长度 < 100000字节,中文占1个字符 | "Python支持多种编程范型,包括函数式、指令式、反射式、结构化和面向对象编程。" |
name | string | 是 | 履约内容名称,0 < 字符长度 <= 100字节,中文占1个字符 | "第一节: python介绍" |
price_info--价格信息
价格单位为分
real_price 与 range_min_price,range_max_price 互斥
real_price 与 range_min_price,range_max_price 必选其中一项填写
价格大小限制关系: 0 < real_price <= price <= 1000000,0 < range_min_price <= price <= range_max_price <= 1000000
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
unit | string | 是 | 价格粒度单位,比如50元/节,这里填"节",目前统一写"节" | 节 |
price | number | 是 | 优惠活动前的服务原始价格,0 < price <= 1000000 | 5000 |
real_price | number | 否 | 当前服务的实际成交价格,real_price与价格区间不同时出现,且<= price | 4900 |
range_min_price | number | 否 | 当前服务的实际成交价格区间:最低价格,0 < range_min_price <= 1000000 | 3000 |
range_max_price | number | 否 | 当前服务的实际成交价格区间:最高价格,0 <= range_min_price <= 1000000 | 6000 |
示例:
// 商品原价为50元,实际成交金额为49元
{
"unit": "节",
"price": 5000,
"real_price": 4900
}
// 商品原价为50元,且30元 <= 实际价格 <= 60元
{
"unit": "节",
"price": 5000,
"range_min_price": 3000,
"range_max_price": 6000
}
path_info--路径信息
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
path | string | 是 | 课程商品详情页路径,没有前导的'/',0 < path字符长度 <= 512字节 | "page/index/index" |
query | map(string,string) | 否 | 课程商品详情页路径query参数 0 < key字符长度 <= 64字节 0 < value字符长度 <= 128字节 | { "curriculum_id": "4938274" } |
示例
// 完整路径如果是 page/index/index?curriculum_id=4938274,path_info如下
{
"path": "page/index/index",
"query": {
"curriculum_id": "4938274" // 注意此处key和value都必须为string类型,否则接口会报400错误
}
}
product_detail--商品详情
可以是文字,图片,图文或者富文本类型
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
text | string | 否 | 文字和图文类型必填,0 < text字符长度 <= 100000字节,汉字占1个字符,该字段仅用于填写文字内容,富文本内容请在在填写在rich_text.text字段 | "该节课程主要用于帮助****在***方面得到***的提升" |
img_uri | string | 否 | 图片和图文类型必填,uri需要调用上传课程资源接口成功后获取 | "product/resource/1001d044d41140d53ce9e57d793a4321" |
rich_text | object | 否 | 富文本类型必填,字符不要做转义,需要符合富文本格式,0 < text字符长度 <= 100000字节,汉字占1个字符 |
rich_text--商品详情富文本内容
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
text | string | 是 | 富文本字符串,字符不要做转义,需要符合富文本格式,0 < 字符长度 <= 100000字节,汉字占1个字符 |
anchor_info--锚点信息
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
video_anchor_info | object | 是 | 视频锚点信息,0 < anchor_title字符长度 <= 24字节,汉字占2个字符 | { anchor_title: "示例锚点标题" } |
course_params--课程参数
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
teacher_id | string | 否,若课程需要接入交易系统2.0,老师id和机构id必填其中一个 | 老师id,需要调用添加资质接口获取,老师id必须过审后才能使用 | "T7890378073078" |
institution_id | string | 否,若课程需要接入交易系统2.0,老师id和机构id必填其中一个 | 机构id,需要调用添加资质接口获取,老师id必须过审后才能使用 | "I78947393874947" |
course_num | number | 否,若课程需要接入交易系统2.0则必填 | 课程节数,0 < course_num <= 10000 | 3 |
refund_label | object | 否,若课程需要接入交易系统2.0则必填 | 退款标签,详见下方refund_label参数介绍 | { "type": 1, "day_before_use_info": { "day": 7 } } |
use_label | object | 否,若课程需要接入交易系统2.0则必填 | 使用标签,若不填写则默认为「购买后永久有效」 | { "valid_date": "2022-12-01" } |
start_timestamp | number | 否 | 课程开始时间,毫秒时间戳,0 < start_timestamp < end_timestamp | 1649662751000 |
end_timestamp | number | 否 | 课程结束时间,毫秒时间戳,0 < start_timestamp < end_timestamp | 1649662751000 |
refund_label--退款标签
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
type | enum | 是 | 退款标签类型,枚举值 | 1 |
day_before_use_info | object | 否,若type=1则必填 | 「xx天未学可退」标签,其中「xx」为填写的天数,0 < day <= 100 | { day: 7 } |
rest_not_learn_info | object | 否,若type=2则必填 | 「学习进度不足xx%可退」标签, 0 <= rest_percent <= 100,当rest_percent=0或100时标签和其他情况不同: 0: 「不支持退款」 100: 「随时可退」 | { rest_percent: 80 } |
use_label--使用标签
名称 | 类型 | 是否必填 | 描述 | 示例 |
---|---|---|---|---|
valid_date | string | 是 | 「yyyy-mm-dd前有效」使用标签日期,格式必须为"yyyy-mm-dd" | "2022-06-29" |
请求示例
{
"access_token": "0801121846756b44471029384758795958537a647053646f773d3d",
"product_type": 1,
"product": {
"common_product_params": {
"appid": "tt11fd1220e13bba1234",
"first_class": 10000,
"second_class": 10100,
"title": "python入门教程",
"purchase_precaution": "小程序内购买课程为课程兑换权益,购买成功后将自动兑换到您的账户内,可在****中重复学习观看",
"product_fulfillment_lst": [
{
"fulfillment_content": {
"fulfillment_uri": "product/resource/1001d044d41140d53ce9e57d793a4321",
"name": "第一节: python介绍"
},
"fulfillment_type": 3
}
],
"industry_type": 1,
"price_info": {
"unit": "节",
"price": 5000,
"real_price": 4900
},
"path_info_lst": [
{
"path": "page/index/index",
"query": {
"curriculum_id": "29384759"
}
}
],
"product_detail_lst": [
{
"rich_text": {
"text": "<b><i>1. python安装步骤</i></b>"
}
}
],
"anchor_info": {
"video_anchor_info": {
"anchor_title": "python入门教程"
}
},
"product_img_uri": "tos-cn-i-b2i6zad4el/b0e72a2e9c5ee919c65a9b0276315cf9"
},
"course_params": {
"teacher_id": "T7283947392973",
"institution_id": "I1039473947393",
"course_num": 637,
"refund_label": {
"type": 1,
"day_before_use_info": {
"day": 7
}
},
"use_label": {
"valid_date": "2022-12-01"
},
"start_timestamp": 1649662751000,
"end_timestamp": 1681198751000
}
}
}
响应参数
名称 | 类型 | 描述 | 示例值 |
---|---|---|---|
err_no | number | 错误码,0为成功,其余错误码详见错误码模块 | 0 |
err_msg | string | 错误提示 | "success" |
log_id | string | 日志id,用于定位错误 | "101210271802130982251451520919C123" |
data | object | 返回数据,成功后返回课程id,开发者需要将id记录下来以管理该课程 注意返回的product_id是int64类型的,直接转换成javascript的number类型会导致精度缺失(如果id最后三位是000则大概率是精度缺失),详情请参考这里精度问题及解决方法 audit_id用于定位课程审核情况 | { product_id: 7049216064080592940 audit_id: "KNC202202090019433632267267" } |
data--返回数据
名称 | 类型 | 描述 | 示例值 |
---|---|---|---|
product_id | int64 | 课程id,课程唯一标识,返回的product_id是int64类型的,直接转换成javascript的number类型会导致精度缺失(如果id最后三位是000则大概率是精度缺失),详情请参考这里精度问题及解决方法 | 7049216064080592940 |
audit_id | string | audit_id用于定位课程审核情况 | "KNC202202090019433632267267" |
响应示例
正常示例
{
"err_msg": "success",
"err_no": 0,
"log_id": "2021122721141201022513314212345678",
"data": {
"product_id": 6543216888019123456,
"audit_id": "KNC202202090019433632123456"
}
}
异常示例
{
"err_msg": "无效的AccessToken",
"err_no": 10001,
"log_id": "2021122721141201022513314212345678"
}
枚举参数
fulfillment_type--履约类型
履约类型 | 履约类型编码 | 上传方式 |
---|---|---|
视频 | 1 | 课程资源上传接口上传 |
音频 | 2 | 课程资源上传接口上传 |
图片 | 3 | 课程资源上传接口上传 |
文字 | 4 | 功能接口字段中直接携带上传 |
图文 | 5 | 课程资源上传接口上传 |
富文本 | 6 | 功能接口字段中直接携带上传 |
其他 | 100 | 课程资源上传接口上传 |
refund_label->type(退款标签类型)
退款标签类型 | 退款标签类型编码 |
---|---|
「xx天未学可退」 | 1 |
「学习进度不足xx%可退」 | 2 |