Install
openclaw skills install buy-travel-accident-china游子云旅游意外险销售平台(中国人保),适合旅行社代客出单。
openclaw skills install buy-travel-accident-china| 用户意图 | 阅读章节 |
|---|---|
| 查产品、计划、保障对比、算保费 | 咨询 |
| 下单、支付、订单查询、保单/确认书下载 | 投保 |
| 退保、批量退保、退费 | 退保 |
经纪侧开票、查询、红冲(/broker/...) | 开票经纪侧 |
两套路由并存,按场景选用,不要混用同一业务流程中的步骤:
| 路径 | 适用场景 | 接口前缀 |
|---|---|---|
| A. 保单路径 | 订单已出单;与投保/订单详情中的 policyNum 一致;Agent 流程从下单延续过来 | POST/GET /policies/{policyNum}/invoice |
| B. 经纪路径 | 需走经纪工作台式开票:多保单 policyNo[]、POST /broker/invoice、POST /broker/invoiceQuery、POST /broker/redInvoice | /broker/invoice 等 |
isMainOrder、invoiceMode(merge / separate)说明,以用户要求的集成入口为准;若用户只说「按保单开票且已对接订单接口」,优先路径 A。https://prod.uzyun.cn/api/agent/v1Authorization: Bearer <token> 或 X-User-Token: <token>GET /schema 中 auth.noAuthPaths 一致):POST /sms/send、POST /register、POST /login、GET /schema。GET /schema 为准。POST /sms/send — Body:event = register,mobile = 手机号(大陆号码按平台要求)。POST /register — Body:mobile(必填)、code(必填,上一步短信验证码)、inviteCode(可选);username 可不传,服务端默认使用 mobile 填充。token、expires、id、username,可直接进入后续业务调用;具体字段校验与错误信息以 GET /schema 为准。与注册相同:手机号 + 短信验证码,不使用密码。
POST /sms/send — Body:event = login,mobile = 手机号。POST /login — Body:mobile(必填)、code(必填,短信验证码)。token、expires(过期时间戳)、id 等;若服务端仍返回 username 等展示字段,可写入状态文件便于展示,鉴权仅依赖 token。后续请求携带 Authorization: Bearer <token>。Agent 通过工作区根目录的 .agent-state.json 文件持久化 token 和常用人员信息,避免每次对话重复登录和重复收集信息。
date "+%Y-%m-%d %H:%M:%S %Z" 获取当前本地时间,记录到对话上下文中(用于 token 过期判断、起保日期建议等)。.agent-state.json。token 存在且 expires > 当前时间戳,直接使用该 token,跳过登录。policyholder 或 frequentInsured 有数据,后续下单时优先使用,无需再向用户收集。将登录响应写入 .agent-state.json(保留已有的 policyholder 和 frequentInsured);建议同时写入 mobile,便于下次 token 过期时发起短信登录。
{
"token": "<登录返回的 token>",
"expires": 1735689600,
"userId": 1001,
"mobile": "13800138000"
}
若登录响应含
username等字段,可一并写入.agent-state.json供展示;登录方式仍为手机号 + 验证码,无密码。
若请求返回 401 或 expires 已过期:使用保存的 mobile(或让用户再次提供手机号)走「登录」短信验证流程,登录成功后更新 .agent-state.json 中的 token。短信验证码不在状态文件中持久化。
Schema 数据纯静态(仅在服务端代码部署时变更),可本地缓存避免每次对话都调用 GET /schema:
GET /schema,将返回的完整内容存入 .agent-state.json 的 schemaCache 字段,同时记录 schemaVersion(取自响应的 version 字段)。.agent-state.json 中已有 schemaCache,直接使用缓存内容,不调用 GET /schema。version 与本地 schemaVersion,若不同则更新 schemaCache 和 schemaVersion。GET /schema 并更新缓存。{
"token": "eyJhbGciOiJIUzI1NiIs...",
"expires": 1735689600,
"userId": 1001,
"mobile": "13800138000",
"policyholder": {
"holderType": "individual",
"fullName": "张三",
"idNumber": "310101199001011234",
"mobileNumber": "13800138000"
},
"frequentInsured": [
{ "fullName": "张三", "idNumber": "310101199001011234" },
{ "fullName": "李四", "idNumber": "310101199101011234" }
],
"schemaVersion": "2026.3",
"schemaCache": {}
}
schemaCache的值为GET /schema返回的完整 JSON 对象,此处省略。
模型自身不感知实时时间。对话开始时必须执行以下命令获取当前时间,并在整个对话中使用:
date "+%Y-%m-%d %H:%M:%S %Z"
当前时间用于:
expires 时间戳与当前时间对比,判断是否需要重新登录。POST /login 获取 token。查询旅游意外险产品信息并获取保费报价:产品列表、产品详情与保障对比、计划列表、计算保费。不包含下单、支付。
GET /products — 获取产品列表(含描述),得到 productId。GET /products/{productId}/detail — (可选)获取产品详情与保障明细对比矩阵。GET /products/{productId}/plans — 获取该产品的计划列表,得到 planId 和 planCode。POST /quote — 传入 productId、planId、起止日期、insuredAges[],得到保费。接口参数细节请通过本地缓存的 Schema 或调用 GET /schema 获取。以下仅列出核心要点。
获取产品列表。返回产品名称、描述、状态等。
获取产品详情,包含保障明细对比矩阵。
获取指定产品的计划列表,返回 planId、planCode、保障额度等。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| productId | int | 是 | 产品ID |
| planId | int | 是 | 计划ID |
| coverageStartTime | string | 是 | 起保日期 YYYY-MM-DD |
| coverageEndTime | string | 是 | 止保日期 YYYY-MM-DD |
| insuredAges | []int | 是 | 被保险人年龄数组 |
枚举值查询接口,无需 token。
| type 值 | 说明 |
|---|---|
| sex | 性别 |
| country_code | 国家/地区代码 |
| individual_id_type | 证件类型 |
| policy_holder_type | 投保人类型 |
| relation_to | 与投保人关系 |
| unit_type | 单位性质 |
响应为 [{value, label}, ...],用 value 作为请求体字段值,用 label 展示给用户。
完成旅游意外险投保全流程:创建订单、提交到保司、获取支付链接、查询订单状态、下载保单/确认书;出单后可通过 路径 A 申请/查询电子发票。支持智能填表(中国身份证场景下被保险人只需姓名+证件号)。
POST /orders — 创建订单(身份证场景只需姓名+证件号),得到 orderSn。POST /orders/{orderSn}/submit — 传入 paymentMethod,提交到保司并获取 paymentUrl。GET /orders / GET /orders/{orderSn} / GET /orders/{orderSn}/pay-url — 列表、详情、支付链接。GET /policies/{policyNum}/assets;GET /policies/{policyNum}/download?type=policy|confirmation — 下载 PDF(推荐)。POST /policies/{policyNum}/invoice;GET /policies/{policyNum}/invoice?queryType=1|2。https://prod.uzyun.cn/api/agent/v1Authorization: Bearer <token>(或 X-User-Token)。policyNum 来自订单详情或列表(出单后才有);仅当前登录用户本人订单可访问。方式一(推荐):直接下载 PDF
| 文档 | 请求 |
|---|---|
| 保单 | GET /policies/{policyNum}/download?type=policy(type 可省略,默认即为保单) |
| 投保确认书 | GET /policies/{policyNum}/download?type=confirmation |
curl -sSL -H "Authorization: Bearer $TOKEN" \
-o "${policyNum}_保单.pdf" \
"https://prod.uzyun.cn/api/agent/v1/policies/${policyNum}/download?type=policy"
curl -sSL -H "Authorization: Bearer $TOKEN" \
-o "${policyNum}_投保确认书.pdf" \
"https://prod.uzyun.cn/api/agent/v1/policies/${policyNum}/download?type=confirmation"
方式二:GET /policies/{policyNum}/assets 返回 JSON:policyUrl、confirmationUrl(可能暂时为空)。
policyNum 来自订单详情;主订单拆单时路径中可为任一子单保单号(见 isMainOrder)。申请开票 — POST /policies/{policyNum}/invoice,JSON body:
| 场景 | 必填 body | 说明 |
|---|---|---|
| 传统单笔 | invoiceTitle、isMainOrder: false | 抬头:个人一般为姓名,企业为税务一致全称 |
| 主单拆单 | isMainOrder: true、invoiceMode: merge 或 separate | 合并一张票 / 各子单一票 |
响应核心字段:policyNums、brokerStatus(如 1000 表示经纪受理成功)、invoiceUrl / policyInvoiceUrls。
查询进度 — GET /policies/{policyNum}/invoice?queryType=1(蓝字);queryType=2(红冲)。data.items:billStatus(0 开具中,1 成功,2 失败)、shortUrl、errorMessage。
若需 路径 B(/broker/invoice 等),见下文「开票经纪侧」章节。
API 支持从中国居民身份证号自动推导(仅在字段为空/零值时填充,显式传入不覆盖):
| 自动推导字段 | 说明 |
|---|---|
idType | "ID" |
dateOfBirth | 身份证第7-14位 YYYY-MM-DD |
gender | 第17位奇偶 → male/female |
age | dateOfBirth + coverageStartTime 周岁 |
被保险人最少必填:中国身份证 → fullName + idNumber;护照/其他 → fullName + idType + idNumber + dateOfBirth。idType 枚举以 GET /options/individual_id_type 为准。
投保人最少必填:个人身份证 → holderType + fullName + idNumber;企业 → holderType(corporate)+ companyName + unifiedSocialCreditCode。
下单成功后写入 .agent-state.json(按 idNumber 去重):覆盖 policyholder;追加 frequentInsured。后续下单优先使用已存数据并向用户确认。
拿到 paymentUrl 后必须在回复中同时输出:
paymentUrl 原文;██/空格),不得以仅图片替代。推荐:Node qrcode-terminal、Python qrcode、或 qrencode;禁止依赖第三方在线转码站。若无法生成二维码,至少输出链接并说明降级原因。
POST /orders — 草稿订单;须再 POST /orders/{orderSn}/submit 才提交保司。paymentMethod:wechat、alipay、credit、recharge、insurance;channelPartnerId 不传,服务端默认渠道。GET /schema 为准。单张保单退保、主订单批量退保(异步)、查询批量退保进度、订单退费。
单张退保:确认 policyNum,状态为 underwriting_approved → POST /broker/surrender。
批量退保:确认 mainOrderId → POST /broker/batchSurrender 得 taskId → 轮询 GET /broker/batchSurrenderProgress?taskId= 至 completed / failed。
退费:POST /broker/refund,传入 orderSn。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| policyNum | string | 是 | 保单号 |
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| mainOrderId | int64 | 是 | 主订单ID |
响应含 taskId、total。
| 字段 | 说明 |
|---|---|
| status | pending/processing/completed/failed |
| successCount / failedCount / failedList / progress | 进度与结果 |
| 字段 | 类型 | 必填 |
|---|---|---|
| orderSn | string | 是 |
orderSn 与 policyNum 二选一。
policyNum、mainOrderId、orderSn。通过 路径 B:POST /broker/invoice 开具、POST /broker/invoiceQuery 查询、POST /broker/redInvoice 红冲。支持传统订单与主订单(合并/分开)。
policyNo[](最多 100 张)等 broker 文档场景。POST /broker/invoice(参数见下表)。POST /broker/invoiceQuery(type:1 发票 / 2 红冲)。POST /broker/redInvoice。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| policyNo | []string | 是 | 保单号列表(最多100张) |
| invoiceTitle | string | 条件必填 | 传统订单必填;主订单由后端获取 |
| isMainOrder | bool | 否 | 默认 false |
| invoiceMode | string | 否 | 主订单:merge / separate(默认) |
开票模式:传统订单必传抬头;主订单合并/分开见字段说明。
| 字段 | 必填 | 说明 |
|---|---|---|
| policyNum | 是 | 保单号 |
| type | 是 | 1 发票 / 2 红冲 |
响应 data 项:billStatus、shortUrl、errorMessage 等。
| 字段 | 必填 |
|---|---|
| policyNum | 是 |
/policies/{policyNum}/invoice)是否足够。