7.5 创建追问【未授权拦截通过,待登录态联调】

POST /tieup/api/v1/questions/{question_id}/follow-ups

路径参数:

参数 类型 必填 说明
question_id integer 会话链内问题 ID,推荐始终传主问题 ID;服务端自动寻找该链最新问题作为追问父节点

鉴权:需要 Authorization: Bearer <access_token>

请求头:

Idempotency-Key: follow_up_question_10001_20260602143000_x7f9k2

请求体:

{
  "question_content": "可以再详细说一下吗?",
  "attachments": []
}

请求参数:

参数 类型 必填 说明
question_content string 粉丝付费提问或追问内容
attachments array 上传接口返回的附件 URL 或业务文件标识列表

响应字段:

字段 类型 说明
id integer 追问 ID
question_no string 追问编号
parent_question_id integer 上一条问题 ID
root_question_id integer 会话链根问题 ID
fan_user_id integer 粉丝用户 ID
fan_nickname string 粉丝昵称
fan_avatar string 粉丝头像 URL
artist_id integer 艺人 ID
artist_user_id integer 艺人关联用户 ID
artist_name string 艺人名称
artist_avatar string 艺人头像,严格读取独立维护的 tieup_artist.avatar;未配置时返回空字符串,不回退绑定账号的用户头像
business_type string 固定为 follow_up_question
question_content string 追问内容
attachments array 追问附件 URL/key 列表
price_candy_amount string 本次追问消耗糖果数量
answer_content string/null 回答内容,未回答为空
answer_attachments array 回答附件 URL/key 列表
status integer 提问状态:1=待回答,2=已回答,3=已拒绝,4=已退款,5=已取消
submitted_at string/null 提交时间
answered_at string/null 回答时间
rejected_at string/null 拒绝时间
refunded_at string/null 退款时间
reject_reason string/null 拒绝原因
refund_no string/null 退款单号
created_at string/null 创建时间
thread_status integer 会话链最新问题状态
thread_latest_question_id integer 会话链最新问题 ID
thread_items array 完整问答链,按提问、回答、追问、回答顺序排列
parent_question object/null 上一条问题完整快照

响应示例:

{
  "code": 200,
  "message": "成功",
  "data": {
    "id": 50002,
    "question_no": "Q202606170002",
    "parent_question_id": 50001,
    "root_question_id": 50001,
    "fan_user_id": 10001,
    "fan_nickname": "Tieup用户",
    "fan_avatar": "https://cdn.example.com/avatar.png",
    "artist_id": 20001,
    "artist_user_id": 20002,
    "artist_name": "示例艺人",
    "artist_avatar": "https://cdn.example.com/artist.png",
    "business_type": "follow_up_question",
    "question_content": "还想了解每天练习多久",
    "attachments": [],
    "price_candy_amount": "50.00",
    "answer_content": null,
    "answer_attachments": [],
    "status": 1,
    "submitted_at": "2026-06-17 10:05:00",
    "answered_at": null,
    "rejected_at": null,
    "refunded_at": null,
    "reject_reason": null,
    "refund_no": null,
    "created_at": "2026-06-17 10:05:00",
    "thread_status": 1,
    "thread_latest_question_id": 50002,
    "thread_items": [
      {
        "id": 50001,
        "question_no": "Q202606170001",
        "parent_question_id": null,
        "root_question_id": 50001,
        "fan_user_id": 10001,
        "fan_nickname": "Tieup用户",
        "fan_avatar": "https://cdn.example.com/avatar.png",
        "artist_id": 20001,
        "artist_user_id": 20002,
        "artist_name": "示例艺人",
        "artist_avatar": "https://cdn.example.com/artist.png",
        "business_type": "question",
        "question_content": "可以分享练习建议吗?",
        "attachments": [],
        "price_candy_amount": "20.00",
        "answer_content": "建议先从 20 分钟基础练习开始",
        "answer_attachments": [],
        "status": 2,
        "submitted_at": "2026-06-17 10:00:00",
        "answered_at": "2026-06-17 10:03:00",
        "rejected_at": null,
        "refunded_at": null,
        "reject_reason": null,
        "refund_no": null,
        "created_at": "2026-06-17 10:00:00"
      },
      {
        "id": 50002,
        "question_no": "Q202606170002",
        "parent_question_id": 50001,
        "root_question_id": 50001,
        "fan_user_id": 10001,
        "fan_nickname": "Tieup用户",
        "fan_avatar": "https://cdn.example.com/avatar.png",
        "artist_id": 20001,
        "artist_user_id": 20002,
        "artist_name": "示例艺人",
        "artist_avatar": "https://cdn.example.com/artist.png",
        "business_type": "follow_up_question",
        "question_content": "还想了解每天练习多久",
        "attachments": [],
        "price_candy_amount": "50.00",
        "answer_content": null,
        "answer_attachments": [],
        "status": 1,
        "submitted_at": "2026-06-17 10:05:00",
        "answered_at": null,
        "rejected_at": null,
        "refunded_at": null,
        "reject_reason": null,
        "refund_no": null,
        "created_at": "2026-06-17 10:05:00"
      }
    ],
    "parent_question": {
      "id": 50001,
      "question_no": "Q202606170001",
      "parent_question_id": null,
      "root_question_id": 50001,
      "fan_user_id": 10001,
      "fan_nickname": "Tieup用户",
      "fan_avatar": "https://cdn.example.com/avatar.png",
      "artist_id": 20001,
      "artist_user_id": 20002,
      "artist_name": "示例艺人",
      "artist_avatar": "https://cdn.example.com/artist.png",
      "business_type": "question",
      "question_content": "可以分享练习建议吗?",
      "attachments": [],
      "price_candy_amount": "20.00",
      "answer_content": "建议先从 20 分钟基础练习开始",
      "answer_attachments": [],
      "status": 2,
      "submitted_at": "2026-06-17 10:00:00",
      "answered_at": "2026-06-17 10:03:00",
      "rejected_at": null,
      "refunded_at": null,
      "reject_reason": null,
      "refund_no": null,
      "created_at": "2026-06-17 10:00:00"
    }
  }
}

业务规则:

  • 路径参数推荐始终传主问题 ID;兼容传入同一会话链内任一追问 ID,服务端都会按 root_question_id 自动寻找 ID 最大的最新节点。
  • 只能追问当前粉丝自己的会话链;最新节点必须为已回答状态,最新追问未回答时不能继续追问。
  • 粉丝仍必须对该偶像存在有效订阅。
  • 每次追问都是新的付费行为,追问价格取 tieup_business_config.basic.follow_up_question_candy,成功创建时独立扣减糖果。
  • 追问同样写入 tieup_question,通过 parent_question_id 关联上一条已回答问题,通过 root_question_id 归属同一条问答链,糖果扣减使用 business_type = follow_up_question
  • 同一会话链创建追问时会锁定主问题行并在事务内重查最新节点;并发请求不会从同一已回答节点创建两条分叉追问。
  • 同一 Idempotency-Key 只能复用同一会话链、同一追问内容和同一附件快照;换会话链、换内容或换附件会返回 422,提示该幂等键已用于其他提问。