获取营种详情
获取营种完整详情,包含基本信息、规格期次、营销方案(价格)、报名配置四个模块。数据口径与小程序营种详情页同源,图片/视频已做 OSS 链接转换。
POST/api/productInfo
请求参数
| 名称 | 类型 | 描述 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| token | String | 身份校验令牌 | 必填 | - | 由 获取访问令牌 获得 |
| pid | Number | 营种 ID(商品 ID) | 必填 | - | 大于 0 |
CURL
V1
curl --location --request POST 'https://open.xinduobang.cn/api/productInfo' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=YOUR_TOKEN' \
--data-urlencode 'pid=1001'
V2(appid 为 V2 版本)
curl --location --request POST 'https://open.xinduobang.cn/api/productInfo' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'X-Timestamp: 1770000000' \
--header 'X-Nonce: 3f9c1a7b2e6d4058' \
--header 'X-Signature: <computed_hmac_sha256>' \
--data-urlencode 'token=YOUR_TOKEN' \
--data-urlencode 'pid=1001'
信息
V2 签名算法及 X-Signature 计算方式见 V2 接入示例。下方接口 V2 示例均遵循相同规则,不再重复注释。
成功响应
{
"code": 0,
"msg": "",
"data": {
"base_info": {
"pid": 1001,
"name": "夏日山林独立营6天5夜",
"sub_title": "让孩子学会独立",
"desc": "六天五夜山野独立营,含全程食宿与课程",
"ctype": [
{ "id": 12, "name": "夏令营" },
{ "id": 34, "name": "独立营" }
],
"product_type": 1,
"form_id": 88,
"big_form_id": 90,
"cover_pic": "https://cdn.example.com/cover/1001.jpg",
"pic_list": [
"https://cdn.example.com/pic/1001-1.jpg",
"https://cdn.example.com/pic/1001-2.jpg"
],
"video_url": "https://cdn.example.com/video/1001.mp4",
"feature": "<p>营种详情富文本HTML</p>",
"notice": "请携带身份证入园"
},
"spec_period": {
"period_list": [
{
"id": 5001,
"name": "7月5日-7月10日",
"pername": "第一期",
"sku_plu": {
"男": "123456789012",
"女": "234567890123"
}
}
]
},
"market_info": {
"sku_price_list": [
{ "sku_str": "男", "price": 2980, "big_price": 1980 }
],
"qz_price": {
"qz_price_type": 1,
"list": [
{
"sku_str": "男",
"price_list": [
{ "small_number": 1, "big_number": 1, "price": 4680 },
{ "small_number": 1, "big_number": 2, "price": 6880 },
{ "small_number": 2, "big_number": 1, "price": 5980 },
{ "small_number": 2, "big_number": 2, "price": 8180 }
]
}
]
},
"period_diff": {
"is_period_diff": 1,
"list": [
{
"period_id": 5001,
"name": "7月5日-7月10日",
"is_diff_sku": 0,
"sku_diff_list": [
{ "sku_str": "", "price_diff": 100, "big_price_diff": 200 }
]
}
]
}
},
"sign_up_info": {
"is_fill_form": 1,
"add_status": 1,
"is_check_age": 1,
"sage": 6,
"eage": 12,
"is_check_adult_age": 1,
"sadult_age": 18,
"eadult_age": 60
}
}
}
响应字段说明
base_info(基本信息)
| 字段 | 类型 | 说明 |
|---|---|---|
| pid | Number | 营种 ID(商品 ID) |
| name | String | 营种名称 |
| sub_title | String | 营种副标题,无副标题时为空字符串 |
| desc | String | 营种简介 |
| ctype | Array | 分类列表,无分类时为空数组 |
| ctype[].id | Number | 分类 ID |
| ctype[].name | String | 分类名称 |
| product_type | Number | 营种类型:0 儿童单飞(营员营),1 亲子营,3 研学 |
| form_id | Number | 报名表 ID(儿童/营员),0 表示未配置 |
| big_form_id | Number | 报名表 ID(成人),仅亲子营有意义,0 表示未配置 |
| cover_pic | String | 封面图(OSS 全链接) |
| pic_list | Array | 轮播图数组(已过滤空图,最多 5 张) |
| video_url | String | 封面视频链接,无视频为空串 |
| feature | String | 营种详情(富文本 HTML,已解码) |
| notice | String | 用户须知 |
spec_period(规格期次)
| 字段 | 类型 | 说明 |
|---|---|---|
| period_list | Array | 营期配置列表,按开营时间升序;仅含未取消且未隐藏的营期 |
| period_list[].id | Number | 营期 ID |
| period_list[].name | String | 营期名称(日期区间) |
| period_list[].pername | String | 营期自定义名称,可能为空串 |
| period_list[].sku_plu | Object | 该营期下"规格串 → plu 码"映射;单规格时为 {"默认规格": "plu码"} |
market_info(营销方案)
| 字段 | 类型 | 说明 |
|---|---|---|
| sku_price_list | Array | 每个规格组合对应的价格;is_sku=0 时固定单条 sku_str="默认规格" |
| sku_price_list[].sku_str | String | 规格组合串,逗号拼接(与下单 sku_str 口径一致) |
| sku_price_list[].price | Number | 该组合儿童价(元) |
| sku_price_list[].big_price | Number | 该组合成人价(元),亲子营有意义,否则为 0 |
| qz_price | Object | 亲子定价(仅亲子营配置,未开启时 qz_price_type=0 且 list 为空) |
| qz_price.qz_price_type | Number | 亲子定价开关:0 关闭,1 开启 |
| qz_price.list[].sku_str | String | 规格组合串(无规格时为"默认规格") |
| qz_price.list[].price_list | Array | 该规格下所有数量组合,仅返回有价格的组合(后台空价=无库存,已过滤) |
| qz_price.list[].price_list[].small_number | Number | 儿童人数 |
| qz_price.list[].price_list[].big_number | Number | 成人人数 |
| qz_price.list[].price_list[].price | Number | 套餐总价(元) |
| period_diff | Object | 营期差价(按营期 × 规格) |
| period_diff.is_period_diff | Number | 是否亲子不同差价:0 否,1 是(仅亲子营可能为 1) |
| period_diff.list | Array | 营期差价列表;整体营期差价未开启时为空数组 |
| period_diff.list[].period_id | Number | 营期 ID |
| period_diff.list[].name | String | 营期名称 |
| period_diff.list[].is_diff_sku | Number | 0 整期统一差价,1 不同规格不同差价 |
| period_diff.list[].sku_diff_list[].sku_str | String | 规格组合串;is_diff_sku=0 时为空串,表示适用全部规格 |
| period_diff.list[].sku_diff_list[].price_diff | Number | 儿童差价(元),正数=加钱,负数=扣钱 |
| period_diff.list[].sku_diff_list[].big_price_diff | Number | 成人差价(元);is_period_diff=0 时恒等于 price_diff |
sign_up_info(报名配置)
| 字段 | 类型 | 说明 |
|---|---|---|
| is_fill_form | Number | 是否填写报名表:1 是,0 否 |
| add_status | Number | 报名表填写顺序:1 下单时填写,0 支付后填写 |
| is_check_age | Number | 是否验证儿童年龄:0 否,1 是 |
| sage | Number | 报名年龄限制-儿童起(岁) |
| eage | Number | 报名年龄限制-儿童止(岁) |
| is_check_adult_age | Number | 是否验证成人年龄:0 否,1 是 |
| sadult_age | Number | 报名年龄限制-成人起(岁) |
| eadult_age | Number | 报名年龄限制-成人止(岁) |
失败响应
{
"code": 1,
"msg": "缺少必要参数"
}
{
"code": 0,
"msg": "营种不存在或已删除",
"data": []
}
| HTTP状态码 | 错误码 | 描述 | 排查建议 |
|---|---|---|---|
| 200 | 1 | 缺少必要参数 | 请检查 pid 是否传入且大于 0 |
| 200 | 0 | msg 非空时为业务错误 | data 为空数组,根据 msg 提示排查(如"营种不存在或已删除") |
补充说明
sku_price_list与下单链路同口径:多规格时按product.sku_data列式结构逐组合展开;无规格时返回单条sku_str="默认规格",其price/big_price即产品基准价。period_diff(营期差价)为有符号值(正数=加钱、负数=扣钱),与下单计算"规格价 + 差价"一致。is_diff_sku=1时按规格组合逐条列出;is_diff_sku=0时只有一条且sku_str="",表示适用全部规格。qz_price(亲子定价)数据来自 sku_merge 表,后台价格为空的组合代表无库存,接口已过滤不返回;未开启亲子定价时qz_price_type=0且list为空数组。- 图片、视频字段均为 OSS 全链接;
feature为已解码的富文本 HTML。