从 0 到 1 接入商业海报生成接口:高清商用海报、品牌宣传海报、电商新媒体海报全流程与代码示例
本文基于公开接口文档整理,未对接口做真实请求实测,文中返回示例均为结构示例(字段与类型以官方文档为准)。集成前请自行验证。
一、技术简介
AI 商业海报生成接口是一类「参考图 + 文字需求 → 成片海报」的图像生成服务。它的调用形态不是一次请求直接拿图,而是异步任务模式:先提交一次生成任务拿到 task_id,再用 task_id 轮询任务状态,直到状态变为成功并取回海报地址。
与「文生图」裸模型相比,这类封装接口在服务端串了一条固定的处理流水线:
| 阶段 | 作用 | 对应产物 |
|---|---|---|
| 意图校验与参数解析 | 解析用途、风格、配色、版式等需求,校验宫格与画幅参数 | 结构化设计意图 structured_intent、校验后参数 validated_params |
| 提示词专业优化 | 把口语化需求补齐为正、反向提示词 | optimized_prompt、negative_prompt |
| 启动高清生图 | 以参考图为视觉基底启动图像生成 | 生成任务状态 |
| 轮询生成状态 | 跟踪生成进度,直到出图 | 海报地址 poster_image_url |
| 视觉质检诊断 | 对成片做合规与质量评分,输出缺陷清单 | quality_report、defect_list |
对调用方来说,这些阶段是「一次提交、一次查询」,不需要自己编排中间步骤;但理解这条链路,有助于判断超时、缺字段、成片不合规等问题出在哪一段。

二、能力概览
2.1 两个端点
| 端点 | 方法 | 用途 | 关键入参 |
|---|---|---|---|
/skills_poster/create |
POST | 创建海报生成任务,返回 task_id |
请求体 JSON |
/skills_poster/query |
GET | 按 task_id 查询任务状态与结果 |
Query 参数 task_id |
两个端点同域,鉴权方式一致:请求头携带 Authorization: APPCODE <appcode>。
2.2 排版与画幅
接口把「一套需求出多版」做成了参数化能力:
| 参数 | 取值 | 说明 |
|---|---|---|
grid_num |
1 / 2 / 4 |
1=单幅;2=双格(2 宫格);4=四宫格(2×2)。传入非法值会被自动降级为 1 |
aspect_ratio |
1:1 / 3:4 / 4:3 / 16:9 / 9:16 |
成品宽高比;不传时默认 3:4 |
常见的组合是:电商主图用 1:1 单幅,小红书/朋友圈竖版用 3:4 或 9:16 单幅,产品对比或「一图多卖点」用 grid_num=4 + 1:1。

2.3 参考图驱动
reference_image 是这条流水线的「视觉锚点」,支持人像、实物产品、风景、品牌 LOGO。它的作用不是简单的图生图,而是让服务端先解析参考图的主体、色调与构图(visual_base_analysis),再与文字需求融合。因此,参考图选得准,成片风格就更容易收敛。
三、适用场景
| 场景 | 典型诉求 | 建议参数 |
|---|---|---|
| 电商主图 / 活动海报 | 商品主体不变,替换背景与文案 | grid_num=1,1:1,参考图取商品白底或场景图 |
| 品牌宣传主视觉 | 保持品牌调性一致,批量出多尺寸 | grid_num=1,按投放位置分别用 1:1 / 3:4 / 16:9 |
| 新媒体竖版投放 | 小红书、朋友圈、短视频封面 | grid_num=1,3:4 或 9:16,参考图取人像或场景 |
| 多卖点对比 / 产品矩阵 | 一套需求出多版式 | grid_num=2 或 4,1:1 |
| 非设计岗自助出图 | 运营、市场同学按模板批量产出 | 固定 prompt 骨架 + 变量替换 |
需要提醒的是:这类接口适合有明确参考物、需求可被文字描述清楚的场景;如果连视觉方向都没有,先把需求写成「用途 + 风格 + 配色 + 版式 + 场景」,出图命中率会明显不同。
四、接入流程
4.1 开通与鉴权
- 在云市场开通该接口服务,得到
AppCode; - 请求头统一携带
Authorization: APPCODE <appcode>(不要把 AppCode 写进前端代码或提交到仓库,建议放在服务端环境变量); - 确认可用的调用额度后,再开始联调。
Authorization: APPCODE 你的AppCode
Content-Type: application/json
4.2 五步接入路径
| 步骤 | 要做的事 | 验收点 |
|---|---|---|
| 1 | 准备一张参考图,放到可公网访问的地址 | 匿名 GET 能直接打开,无防盗链、无登录态 |
| 2 | 按「用途+风格+配色+版式+场景」写好 prompt |
一段话能让人复述出画面结构 |
| 3 | POST /skills_poster/create,拿到 task_id |
返回 showapi_res_code=0 且 task_id 非空 |
| 4 | GET /skills_poster/query?task_id=... 轮询 |
建议 1–2 秒一次,直到 status=SUCCESS |
| 5 | 取 flow_result.output.poster_image_url 落地 |
图片可下载,尺寸与 aspect_ratio 一致 |

4.3 一个容易踩的点:参考图地址
reference_image 在文档里标注为「海报核心基底参考图 URL」,同时又标 type: base64。这意味着两种传法都可能被接受(URL 或 Base64 数据)。实践上建议优先用公网 URL:
- URL 方式请求体小,日志里也不会出现超长字符串;
- 若你的图片在私有存储里,可先上传到对象存储并签发临时可读链接;
- 无论哪种方式,都不要传
localhost、内网地址或需要 Cookie 才能访问的链接——服务端取不到图,任务大概率在第一步就失败。
五、调用示例与返回结构
5.1 构造请求体
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
grid_num |
integer | 是 | 宫格排版枚举:1=单幅,2=双格,4=四宫格;非法值自动降级为 1 |
prompt |
string | 是 | 海报用途、视觉风格、投放场景、主辅配色、版式布局、整体氛围、材质肌理、光影质感、文字排版要求 |
reference_image |
string | 是 | 参考图 URL(人像 / 实物产品 / 风景 / 品牌 LOGO) |
aspect_ratio |
string | 否 | 画幅比例,默认 3:4 |
{
"grid_num": 1,
"prompt": "新品宣传海报,极简奶油风,低饱和暖米色配色,柔和漫射光,充足留白,适配竖版社媒投放",
"reference_image": "https://your-cdn.example.com/ref/product.jpg",
"aspect_ratio": "3:4"
}
5.2 cURL 创建任务
curl -X POST 'https://poster.market.alicloudapi.com/skills_poster/create' \
-H 'Authorization: APPCODE 你的AppCode' \
-H 'Content-Type: application/json' \
-d '{
"grid_num": 1,
"prompt": "新品宣传海报,极简奶油风,低饱和暖米色配色,柔和漫射光,充足留白,适配竖版社媒投放",
"reference_image": "https://your-cdn.example.com/ref/product.jpg",
"aspect_ratio": "3:4"
}'
创建成功时返回的结构(示例返回,字段含义以官方文档为准):
{
"showapi_res_code": 0,
"showapi_res_error": "",
"showapi_res_id": "6a70xxxxx",
"showapi_res_body": {
"ret_code": 0,
"remark": "success",
"task_id": "1234_6a7xxxxxxxxxxxxxxxxxxxxx",
"flow_id": "6a38xxxxxxxxxxxxxxxxxxxxxx",
"flow_name": "海报生成",
"query_info": {
"long_term_query": {
"endpoint": "查询接入点",
"param": {
"task_id": "1234_6a7xxxxxxxxxxxxxxxxxxxxx" },
"desc": "适用于长期查询,查询有效期 3 天"
},
"short_term_query": {
"preview_url": "https://your-cdn.example.com/preview/xxxx",
"query_status_url": "https://your-cdn.example.com/query/xxxx",
"desc": "短期可视化预览,有效期 1 小时"
}
}
}
}
}
要点:
- 业务是否受理看
showapi_res_code,任务是否建成功看showapi_res_body.ret_code,两者都为 0 才算成功; task_id形如前缀_十六进制串,原样保留,不要做 trim、切片或 URL 解码之外的任何处理;query_info.long_term_query明确写了「查询有效期 3 天」——任务结果不是永久可查,出图后应立刻把地址落到自己的存储里。
5.3 查询任务
curl -X GET 'https://poster.market.alicloudapi.com/skills_poster/query?task_id=1234_6a7xxxxxxxxxxxxxxxxxxxxx' \
-H 'Authorization: APPCODE 你的AppCode'
查询响应(结构示例,已省略中间步骤的大段分析内容):
{
"showapi_res_code": 0,
"showapi_res_error": "",
"showapi_res_body": {
"status": "SUCCESS",
"remark": "",
"flow_name": "海报生成",
"steps_num": 6,
"progress": 100,
"flow_result": {
"input": {
"reference_image": "https://your-cdn.example.com/ref/product.jpg",
"prompt": "新品宣传海报,极简奶油风……",
"aspect_ratio": "3:4"
},
"output": {
"generated_prompt": "(专业优化后的完整正向提示词)",
"visual_base_analysis": "(参考图主体、色调、光影的解析结论)",
"poster_image_url": "https://your-cdn.example.com/output/poster.png"
},
"step_1_visual_analyzer": {
"result": {
"data": {
"result": "……" } } },
"step_2_prompt_architect": {
"result": {
"data": {
"result": "……" } } },
"step_3_print_prompt": {
"result": {
"data": {
"result": "……" } } }
}
}
}
| 字段 | 类型 | 说明 |
|---|---|---|
showapi_res_body.status |
string | 任务状态,成功为 SUCCESS,失败为 FAILED |
showapi_res_body.remark |
string | 成功时为空;失败时给出错误说明 |
showapi_res_body.progress |
number | 进度百分比,可用于进度条 |
showapi_res_body.steps_num |
number | 本次流水线的步骤数 |
flow_result.input |
object | 回显本次请求的三个入参,便于核对 |
flow_result.output.poster_image_url |
string | 最终海报地址,落库就取这个字段 |
flow_result.output.generated_prompt |
string | 实际用于生图的提示词,可留作复现与调优依据 |
flow_result.output.visual_base_analysis |
string | 参考图的视觉解析结论 |
flow_result.step_* |
object | 各阶段明细(意图解析、提示词架构等),调试时按需读取 |
5.4 Python 版完整调用(创建 + 轮询)
import os
import time
import requests
APPCODE = os.environ["POSTER_APPCODE"] # 不要硬编码在代码里
BASE = "https://poster.market.alicloudapi.com"
HEADERS = {
"Authorization": f"APPCODE {APPCODE}"}
payload = {
"grid_num": 1,
"prompt": "新品宣传海报,极简奶油风,低饱和暖米色配色,柔和漫射光,充足留白,适配竖版社媒投放",
"reference_image": "https://your-cdn.example.com/ref/product.jpg",
"aspect_ratio": "3:4",
}
# 1) 创建任务
resp = requests.post(f"{BASE}/skills_poster/create", json=payload, headers=HEADERS, timeout=30)
data = resp.json()
if data.get("showapi_res_code") != 0 or data.get("showapi_res_body", {
}).get("ret_code") != 0:
raise RuntimeError(f"创建失败: {data}")
task_id = data["showapi_res_body"]["task_id"]
print("task_id:", task_id)
# 2) 轮询查询(建议 1~2 秒一次,给出总超时上限)
deadline = time.time() + 300
poster_url = None
while time.time() < deadline:
q = requests.get(f"{BASE}/skills_poster/query", params={
"task_id": task_id},
headers=HEADERS, timeout=30).json()
body = q.get("showapi_res_body", {
})
status = body.get("status")
print("status:", status, "progress:", body.get("progress"))
if status == "SUCCESS":
poster_url = body.get("flow_result", {
}).get("output", {
}).get("poster_image_url")
break
if status == "FAILED":
raise RuntimeError(f"生成失败: {body.get('remark')}")
time.sleep(2)
if not poster_url:
raise TimeoutError("轮询超时,任务仍未完成")
print("poster:", poster_url)
# 3) 立刻转存到自己的存储,避免结果过期后取不到
5.5 Node.js 版本(仅创建 + 查询一次)
const APPCODE = process.env.POSTER_APPCODE;
const BASE = "https://poster.market.alicloudapi.com";
const headers = {
Authorization: `APPCODE ${
APPCODE}`, "Content-Type": "application/json" };
async function main() {
const createRes = await fetch(`${
BASE}/skills_poster/create`, {
method: "POST",
headers,
body: JSON.stringify({
grid_num: 1,
prompt: "新品宣传海报,极简奶油风,低饱和暖米色配色,柔和漫射光,充足留白,适配竖版社媒投放",
reference_image: "https://your-cdn.example.com/ref/product.jpg",
aspect_ratio: "3:4",
}),
});
const createJson = await createRes.json();
const taskId = createJson.showapi_res_body.task_id;
const queryRes = await fetch(`${
BASE}/skills_poster/query?task_id=${
encodeURIComponent(taskId)}`, {
headers });
const queryJson = await queryRes.json();
console.log(queryJson.showapi_res_body.status, queryJson.showapi_res_body.flow_result?.output?.poster_image_url);
}
main().catch((e) => console.error(e));

六、调试方法与示例返回
这一节讲怎么测,不涉及实测结果。
6.1 先测创建,再测查询
- 用最小请求体调创建:只填
grid_num、prompt、reference_image,不传aspect_ratio,验证默认3:4是否生效; - 创建返回里核对三件事:
showapi_res_code=0、ret_code=0、task_id非空; - 复制
task_id手工调查询,观察status与progress的变化; - 拿到
poster_image_url后,用浏览器直接打开验证可访问性(很多「图片打不开」其实是地址过期或防盗链,不是接口问题)。
6.2 参数怎么填
| 想验证的点 | 怎么填 | 看什么 |
|---|---|---|
| 默认画幅 | 不传 aspect_ratio |
成片是否为 3:4 |
| 非法宫格降级 | grid_num=3 |
是否被处理为单幅,结果是否仍返回成功 |
| 画幅是否生效 | 分别用 1:1、16:9 |
成片宽高比是否与入参一致 |
| 参考图是否被采用 | 换一张风格差异大的参考图 | visual_base_analysis 是否随之变化 |
| 需求表达是否够细 | 同一张参考图,粗/细两版 prompt |
generated_prompt 的补全程度与成片差异 |
6.3 返回怎么读
status是唯一判断任务终态的字段:SUCCESS与FAILED是终态,其余都按「进行中」处理;progress只用于展示,不要拿它做完成判定;flow_result.output.poster_image_url是结果地址,只在这一层取图,不要去step_*里翻中间图;flow_result.input会回显你的三个入参,可作为「请求是否被正确处理」的自证材料;- 失败时
remark是唯一有信息量的字段,step_status_list(如有)只包含执行到的阶段。
七、调用限制与规范
| 维度 | 现状 | 工程建议 |
|---|---|---|
| 任务结果有效期 | 文档标注长期查询有效期 3 天,短期可视化查询 1 小时 | 出图后即刻转存,不依赖接口地址长期可用 |
| 单次耗时 | 生成属于重计算,创建后需要轮询 | 轮询间隔 1–2 秒,总超时给到分钟级;不要同步等待 |
| 并发 | 以账号额度为准 | 用队列 + 限流器控制并发,避免瞬时打满 |
| 参数容错 | 非法 grid_num 自动降级为 1 |
服务端先做枚举白名单校验,别把错误留给下游 |
| 参考图 | 需公网可访问 | 上传对象存储 + 临时签名链接,不用内网地址 |
| 结果判定 | 依赖 status |
不要用 progress 或 HTTP 200 直接判成功 |
几条落地规范:
- 幂等:同一次业务请求不要重复创建任务,用业务单号做幂等键,命中则复用已有
task_id; - 重试:只重试「创建阶段的网络错误 / 5xx」,生成失败(
FAILED)不要盲目重试,先看remark; - 降级:轮询超时后不要继续无限等,落一条待补偿记录,由后台任务续查;
- 缓存:同一组(参考图 + 需求 + 参数)可做结果缓存,避免重复消耗;
- 监控:记录
task_id、status、progress终值、耗时与失败原因,便于定位是哪一阶段出的问题。
八、能力边界与免责
- 不做真实性校验:生成的画面与文案是模型产出,涉及产品参数、售价、资质、功效等对外宣称时,必须由业务方复核后再投放;
- 文字渲染有不确定性:海报内中文长句、生僻字、密集小字可能出现字形异常,重要文案建议在后期工具里二次排版;
- 参考图版权:上传人像、LOGO、产品图前,确认你拥有使用权或已获得授权;
- 合规责任在使用方:广告法、平台投放规则、行业特殊规定(医疗、金融、教育等)由使用方负责,接口只提供图像生成能力;
- 结果不保证可复现:同参数多次调用,成片存在差异,这属于生成式模型的固有特性。
九、错误码排查
接口文档未单独列出业务错误码表,排查按两层走:
| 层级 | 字段 | 常见取值 | 处理方式 |
|---|---|---|---|
| 网关 / 平台层 | showapi_res_code |
非 0 | 多半是鉴权、额度、参数格式问题;先看 showapi_res_error |
| 业务受理层 | showapi_res_body.ret_code |
非 0 | 任务未被受理,读 remark |
| 任务执行层 | showapi_res_body.status |
FAILED |
生成没跑完,读 remark 定位阶段 |
常见现象与定位思路:
| 现象 | 大概率原因 | 排查顺序 |
|---|---|---|
| 返回 401 / 鉴权失败 | Authorization 头缺失或格式不对 |
确认是 APPCODE <值>,不是 Bearer,也不是 appkey= 查询参数 |
ret_code 非 0 |
必填字段缺失、reference_image 取不到 |
检查三个必填项、参考图能否匿名访问 |
一直 progress 不动 |
生成排队或参考图解析失败 | 换一张更小、更清晰的参考图重试 |
SUCCESS 但地址打不开 |
结果地址过期或防盗链 | 出图后即刻转存,别过几天再取 |
| 成片构图与预期差距大 | prompt 信息不足或与参考图冲突 |
补「用途 + 版式 + 配色 + 场景」,必要时换参考图 |

十、技术 FAQ
Q1:这个接口是同步返回图片吗?
不是。创建接口只返回 task_id,必须再调查询接口轮询,直到 status=SUCCESS 才拿到 poster_image_url。
Q2:为什么创建成功后还要查询两次以上?
生成属于重计算任务,创建只代表任务已入队。轮询间隔建议 1–2 秒,progress 可用于展示进度,但终态判断只看 status。
Q3:grid_num 传 3 会报错吗?
不会报错,非法值会被自动降级为 1(单幅)。但建议调用方自己先做枚举校验,避免静默降级带来预期偏差。
Q4:不传 aspect_ratio 会怎样?
默认按 3:4 出图。需要方形或宽屏时显式传入 1:1、16:9 等值。
Q5:reference_image 能传 Base64 吗?
文档把该字段标为 base64 类型,同时又描述为「参考图 URL」,实际以官方文档为准。稳妥做法是传公网可访问的 URL。
Q6:参考图有什么要求?
需公网可直接访问,主体清晰、无水印遮挡。人像、实物产品、风景、品牌 LOGO 都可以作为基底。
Q7:任务结果能保存多久?
文档标注长期查询有效期为 3 天,短期可视化预览为 1 小时。不要把接口返回的图片地址当永久地址用。
Q8:怎么判断任务失败?showapi_res_body.status 为 FAILED,失败原因在 remark;此时 flow_result 里可能只有部分产物,不应直接用于投放。
Q9:同一份需求能出多个版式吗?
可以,但需要多次调用:单幅用 grid_num=1;双格 / 四宫格分别用 2 / 4。一次调用只对应一种排版。
Q10:调用额度怎么控制?
按账号额度计算,长文本 prompt 与高分辨率成片会带来更高消耗。工程上建议做结果缓存与队列限流,prompt 保持精简但信息完整。
Q11:生成的图能直接商用吗?
接口提供的是图像生成能力,是否可商用取决于你的参考图授权、画面内容合规性与投放平台规则,需业务方自行复核。
Q12:报「图片地址无法访问」怎么办?
确认链接是 https、无需登录态、未开启防盗链、有效期足够长;私有存储请先转成带签名的临时链接。
十一、内容小结
- 形态是异步任务:
POST /skills_poster/create拿task_id,GET /skills_poster/query轮询到status=SUCCESS,再从flow_result.output.poster_image_url取图。 - 四个入参决定成片:
grid_num(1/2/4)、prompt(需求描述)、reference_image(视觉基底)、aspect_ratio(默认3:4)。 - 三个判断层级要分清:
showapi_res_code(平台)、ret_code(受理)、status(执行)。 - 三条工程红线:AppCode 只放服务端、结果即刻转存、任务创建做幂等。
- 本文所有返回示例均为结构示例,实际字段与取值请以官方文档为准。
