中软云企当康税无险财税综合合规检测
一、报告概述
本报告为平台专属免费体验版,内置 12 项核心财税基础检测指标,提供轻量化财税合规检测初筛服务,仅展示基础合规检测概览与部分指标详情,全部深度合规检测分析、异常数据明细及整改方案付费可提供深度分析,免费版主要用于新用户推广体验与企业快速合规自查。
二、检测范围
覆盖企业财税核心基础维度,包含:发票合规与虚开风险、增值税核心风险、企业所得税核心风险、个人所得税等其他税种风险、财务核算与财税比对风险、企业基本信息风险。
免费版仅展示风险等级总览及部分无风险指标的完整分析内容,所有中高风险的异常明细、数据溯源、政策依据及应对建议均为付费版专属内容。
三、适用范围
全行业所有市场主体通用,特别适用于首次使用平台的新用户体验、企业日常快速基础财税合规筛查。
四、作用需求
快速完成企业基础财税风险扫描,直观展示整体风险等级与风险分类分布;帮助企业快速了解自身基础财税健康状况,识别潜在高风险方向;为企业判断是否需要开展深度财税合规检测提供参考依据。
五、价值需求
零成本体验平台核心检测能力,无需专业财务知识即可快速上手;提前预警基础涉税风险,避免因小问题引发重大税务隐患;操作简便高效,1 分钟即可生成基础风险报告,满足企业日常快速自查需求。
六、总结
我们始终坚信,合规不是成本,而是企业最核心的竞争力之一。平台为企业创造的核心价值,正是推动企业从单纯的“风险管控”,迈向更高维度的“价值创造”。
首先,是降低风险,保障经营安全。
其次,是提升合规,优化内部管理。
更重要的是,它能赋能决策,通过深度的数据分析,帮助您优化供应链,控制成本,驱动业务增长。
我们相信,合规不是成本,而是企业最核心的竞争力之一。
七、联系方式
中软云企官网:https://lxyq.cssyq.com.cn/
服务热线:400-005-1670
文件结构与配置
saas-risk-detection/
├── SKILL.md # 本文件(不含任何敏感配置)
├── .gitignore # 忽略含密钥的 config.ini 与 logs 运行日志
├── config/
│ ├── config.ini # 平台对接配置(AK/SK、接口地址、渠道/订单/商品信息)
│ └── config.example.md # 配置脱敏模板(复制后填入真实值)
├── logs/ # 运行日志(按日期 YYYY-MM-DD.log 归集,运行时自动生成;扫码登录的二维码 PNG 也保存于此)
└── scripts/
├── yunqi_openapi_client.py # 可复用客户端(国密 SM4+SM3 传输层 + 账密/扫码两种登录 + 五步流程)
└── 云企智控接口对接规范.md # 传输安全协议与接口文档(含实测结论)
宿主适配:二维码怎么展示(重要)
本技能可在不同宿主中运行,展示二维码时必须调用当前宿主实际存在的工具。照抄另一个宿主的工具名会导致「工具不存在 → 静默失败 → 聊天里什么都看不到」,这是最常见的失效原因。
目标效果是二维码直接出现在对话流里(正文气泡内),而不是塞进侧边/右侧的产物面板。
| 宿主 | 展示方式 | 效果 |
|---|---|---|
| WorkBuddy | show_widget 内联渲染,widget_code 直接填命令6 stdout 里 [WIDGET_BEGIN]…[WIDGET_END] 之间的片段 |
二维码卡片内联出现在聊天流中(与千问办公观感一致)✔ 首选 |
| WorkBuddy(兜底) | present_files 传 qrcode_live_html 绝对路径 |
打开右侧预览面板 + 聊天中生成文件卡片 ✖ 不是内联 |
| 千问办公 / qwenwork | qwenwork_file_present_files 传 qrcode_live_html |
聊天内联卡片 |
判断规则:
1. 当前会话有 show_widget → 用内联渲染,不要再用 present_files(那会跑到右侧面板去)。片段由命令6 直接给出,原样粘贴、不要改动任何一个字符,并且直接从命令6 的 stdout 透传,不要用「读文件」的方式二次获取。片段有两种形态(脚本自动选择):迷你 PNG 版(<img> + data URI:脚本把二维码重编码为 196×196 的 1bit PNG 且静区已烘焙进图片,base64 仅约 700 字符,推荐)与 原图折行兜底版(仅点阵解码失败时用,base64 按 100 字符折行——此时必须保留换行、严禁合并成一行,且不得经「读文件」获取:超过 2000 字符的单行会被读取工具静默截断,正是「卡片正常、二维码只显示一半/碎图标」的根因);若 stdout 里没有该片段(qrcode_widget_ready 为 false),再按下表降级;
2. 没有 show_widget、只有 present_files → 用 present_files 传 qrcode_live_html 绝对路径;
3. 只有 qwenwork_file_present_files(千问办公)→ 用它传 qrcode_live_html;
4. 都没有 → 先复制到当前工作目录输出目录,再用通用文件展示能力;实在不行才退化为在正文里内联 data.qrcode_inline_md。
为什么是「数据内嵌」而不是「引用本地图片路径」
实测结论(WorkBuddy):widget 里 <img> 引用本地文件路径各写法全部不显示——C:/...、C:\...、file:///C:/...、local-file://...、相对路径,六种写法全部空白且无任何报错。宿主的本地路径改写逻辑(toAbsoluteLocalPath / toLocalFileUrl)在这条通道上不生效,local-file:// 协议也没注册成功。本地 HTTP 服务供图同样不可用。
所以内联卡片一律数据内嵌:脚本把接口 PNG 解码成 41×41 模块矩阵(纯 stdlib 实现),补上 4 模块静区后重编码为 196×196 的 1bit PNG,base64 只约 700 字符(接口原图约 2100 字符,历史上被截断过两次:碎图标 / 只显示上半截)。196px 显示 49 模块 = 每模块 4px,配合 image-rendering:pixelated 整数倍缩放不模糊;静区写在图内,图片被单独打开/另存也能被扫码器识别。不要改回 canvas + JS 点阵:宿主 iframe 若屏蔽内联脚本,canvas 就是一片空白,手机无从扫起。原图折行 base64 仅作点阵解码失败时的兜底。
> ⚠️ 卡片必须保持单行紧凑形态(总高约 220~240px)。宿主给 widget 的 iframe 高度有上限,多行 / 多层嵌套容器会被从底部裁切,表现为「卡片只显示一半」。不要在同一张卡片里再塞第二块内容。
> 图片尺寸、字体、圆角都已在脚本的 _QRCODE_WIDGET_HTML 里定好,助手不需要自己写 HTML,直接透传命令6 给出的片段即可。
> 版式一致性约定:内联卡片 _QRCODE_WIDGET_HTML 与 HTML 展示页 _QRCODE_LIVE_HTML 的内容区必须保持一致(同款四行文案与字号层级;内联卡片的二维码是 196×196 迷你 PNG(静区已烘焙在图内),展示页沿用原图「200×200 白框内放 182×182」)。改内容样式时必须同步改这两处。两者刻意不同的地方有两处,都不是 bug:
> 1. 内联卡片没有自己的卡片壳(无边框、无「✓ 电子税务局扫码授权」标题栏)——因为宿主的内联渲染工具(如 WorkBuddy show_widget)会给 widget 自带一层卡片框和标题栏,内联卡片再画一层就会「框里套框」;展示页是独立打开的,没有宿主外框,所以保留完整卡片样式。
> 2. 展示页多一个扫码状态遮罩(只有页面能轮询 /status)。
调用 show_widget 时 title 用「电子税务局扫码登录二维码」,配 1–3 条 loading 文案。内联卡片渲染后要紧接着输出引导文字(用电子税务局 App 扫码、有效期约 3 分钟)。
> 内联卡片里的二维码是 base64 内嵌,与工作目录无关,不需要也不应该再做「复制到输出目录」这一步。只有在走第 2 步兜底(present_files 传 qrcode_live_html)时才用绝对路径;该 HTML 是自包含单文件(二维码以 base64 内嵌在 <img> 中),不依赖本地服务即可显示;页面里对 127.0.0.1:<port> 的 /status 轮询只用于「扫码成功 / 过期」的自动切换,被宿主沙箱拦截时页面依然能正常显示二维码,最终结果以聊天中命令7 的提醒文案为准。
> 平台对接配置集中维护在 config/config.ini,脚本运行时通过 configparser 读取;被测企业信息(电子税务局登录)属业务输入,运行时通过询问用户问题传入。每次调用 API 的输入输出参数会自动写入 logs/YYYY-MM-DD.log(按日期归集,一天一份)。
整体流程与API调用顺序(严格遵循)
用户发起检测 → 询问登录方式 → 按所选分支采集信息并登录 → 两种登录方式成功后共用 1.3 → 1.4 → 1.5 后续流程(不变)。
分支A:账号密码登录(短信验证码)
- 1.1 风控企业授权检测发送短信验证码 -
POST gg/org/auth/riskDet/smsCodeSend - 1.2 风控企业授权检测登录 -
POST gg/org/auth/riskDet/smsCodeUpload(需要1.1返回的taskId)
分支B:扫码登录(电子税务局二维码)
- 2.1 获取电局登录二维码 -
POST /gg/org/auth/riskDet/getQrcode(返回taskId、ywjcjlbh和二维码图片,展示给用户扫码) - 2.2 扫码状态查询 -
POST /gg/org/auth/riskDet/scanCode(需要2.1返回的taskId,轮询至扫码授权成功)
共同后续(任一分支登录成功后)
- 1.3 查询授权状态及报告接口 -
POST znfk/qyfxgl/yqzk/querySqztBgxx - 1.4 付费报告申请接口 -
POST /gg/org/auth/report/apply(输出ywjcjlbh供1.5使用) - 1.5 获取企业风险检测概览信息 -
POST znfk/qyfxgl/zsr/getQyfxjcglxx(输入1.3/1.4返回的ywjcjlbh)
参数复用策略
- 前面接口已有的参数尽量复用,不要重复要求用户输入
- 只在必要时提示用户补充缺失参数
- 自动传递中间结果(如
taskId、ywjcjlbh)
用户信息采集
用户发起检测后,先询问登录方式,再按分支采集信息。须调用 AskUserQuestion 工具弹出选项卡片收集,不要直接命令行传参:
-
登录方式(必问,最先问),用 AskUserQuestion 选项:
-账号密码登录:走分支A(短信验证码),需采集全部企业信息(含账号/密码/手机号/身份类型)
-扫码登录:走分支B(电子税务局二维码),只需采集 nsrsbh/nsrmc/ssdq,无需账号、密码、手机号、身份类型(登录身份由扫码人在电子税务局 APP 上确认) -
枚举字段用选项:
-sflx(身份类型):FDDBR 法定代表人 / CWFZR 财务负责人 / BSY 办税员 / KPY 开票员
-ssdq(所属地区):只能填省级码(如 2100 辽宁省);⚠️ 填地级市码(如 2106 丹东市、2103 鞍山市)接口会直接返回9999系统异常,务必按下方「地区编码参考」表选取 -
自由文本字段(nsrsbh 识别号、nsrmc 名称、gryhm 账号、gryhmm 密码、sjhm 手机号)
引导用户用 Other 输入,或先问「是否沿用上次企业」给 Yes/No 选项,选 No 时让用户在 Other 里粘贴完整信息。 -
一次弹窗最多 4 问,信息项多时拆成 2 次提问。
-
调用 1.1 接口后,按返回 code 分支处理:
- code = "0000":表示当前登录会话处于保活状态(当天该手机号已成功登录过),
无需向用户索取短信验证码,也无需调用 1.2 接口,直接进入 1.3 查询授权状态。
- code = "1010":验证码已发送成功,需提示用户输入收到的验证码,再调用 1.2 登录。
- code = "1009"/"1008":登录失败,需重新采集账号、密码、手机号。 -
一般情况下gryhmm 密码与sjhm 手机号不一致。
-
如果密码或者验证码错误,需要重新采集gryhm 账号、gryhmm 密码、sjhm 手机号。
-
报告轮询:登录成功后自动开始(Step 3 分段前台循环,命令3每轮
30 240),无需询问用户;期间每轮输出一次进度,报告生成即输出结果。不得用 AskUserQuestion 打断询问是否等待。 -
更换不同身份类型需要重新采集gryhm 账号、gryhmm 密码、sjhm 手机号。
-
扫码登录分支:命令6(前台几秒)启动分离守护进程→立即把 stdout 里
[WIDGET_BEGIN]…[WIDGET_END]之间的片段原样传给show_widget内联渲染(二维码以迷你 PNG 数据内嵌,卡片自带「有效期 3 分钟」说明;不要改成展示 HTML 文件路径,那会跑到右侧面板)→命令7 前台阻塞等待扫码结果(timeout≥300000ms,严禁 run_in_background,否则用户收不到提醒)→返回后输出notify文案(在所有二维码卡片之后):成功→同回合立即按分段规则轮询报告(命令3每轮30 240);expired/wait→输出过期提示后结束流程等待用户指令,严禁自动重新取码换新码(用户回复「重新生成二维码」等才重新开始);fail→反馈原因并等待用户决定。严禁拿到结果后静默不报。
基础信息(1.1接口必需)
| 参数 | 说明 | 是否必传 | 备注 |
|---|---|---|---|
| ddbh | 订单编号 | 是 | 云企购买服务的订单编号 |
| cpfwbh | 产品服务编号 | 是 | 购买商品编号 |
| nsrsbh | 纳税人识别号 | 是 | 企业唯一标识 |
| nsrmc | 纳税人名称 | 是 | 企业全称 |
| ssdq | 所属地区 | 是 | 见下方地区编码表 |
| customerId | 客户ID | 是 | 注册云企后提供 |
| userId | 用户ID | 是 | 注册云企后提供 |
| gryhm | 用户名 | 是 | 税务登录用户名(身份证/手机号/用户名) |
| gryhmm | 密码 | 是 | 税务登录密码 |
| sflx | 身份类型 | 是 | FDDBR/CWFZR/BSY/KPY/DLJG |
| sjhm | 手机号 | 是 | 接收短信的手机号 |
| qdbm | 渠道编码 | 是 | 联系云企获取 |
| sqInfo | 授权协议 | 是 | 授权协议书的base64编码 |
| dljgsh | 代理机构税号 | 否 | sflx=DLJG时必传 |
| dlNsrxxList | 被代理纳税信息列表 | 否 | sflx=DLJG且多户企业时使用 |
短信验证码(1.2接口必需)
| 参数 | 说明 | 来源 |
|---|---|---|
| taskId | 任务ID | 1.1接口返回 |
| smsCode | 短信验证码 | 用户收到短信后输入 |
扫码登录(2.1 / 2.2接口,分支B专用)
2.1 获取电局登录二维码(ddbh/cpfwbh/customerId/userId/qdbm/sqInfo 由 config.ini 与脚本自动填充,只需向用户采集以下3项):
| 参数 | 说明 | 是否必传 | 备注 |
|---|---|---|---|
| nsrsbh | 纳税人识别号 | 是 | 企业唯一标识 |
| nsrmc | 纳税人名称 | 是 | 企业全称 |
| ssdq | 所属地区 | 是 | 见下方地区编码表 |
2.1 返回:taskId(供2.2使用)、ywjcjlbh、qrcode(base64 PNG 二维码图片)。命令6 的守护进程会把同一枚二维码落盘为 logs/qrcode_live_<时间戳>.png(留档 + 生成内联卡片用)与同名 .html(展示页),并在 stdout 给出内联卡片片段。展示方式见「宿主适配」章节——WorkBuddy 一律用命令6 给出的数据内嵌片段走 show_widget
2.2 扫码状态查询:
| 参数 | 说明 | 来源 |
|---|---|---|
| taskId | 任务ID | 2.1接口返回 |
| nsrsbh | 纳税人识别号 | 已采集复用 |
2.2 返回:扫码授权成功(code=0000)时返回 nsrsbh 与 ywjcjlbh,随后进入 1.3 查询授权状态。
付费报告参数(1.4接口必需)
| 参数 | 说明 | 是否必传 |
|---|---|---|
| zeroOrderNo | 免费订单编号 | 是 |
| chargeOrderNo | 付费订单编号 | 是 |
| zeroYwjcjlbh | 免费业务检测记录编号 | 是 |
| contractId | 付费合同ID | 是 |
| productId | 付费商品ID | 是 |
| productAttrUnique | 商品规格ID | 是 |
地区编码参考
⚠️ 规则(实测确认):ssdq 只接受省级码(XX00)以及少数计划单列市码(下表里已列出的 2102 大连 / 3302 宁波 / 3502 厦门 / 3702 青岛 / 4403 深圳)。填其他地级市码(如 2106 丹东市、2103 鞍山市)接口会返回 9999 系统异常,且 msg 为 null,看不出原因——这是踩过坑的地方:辽宁一律用 2100,不要按"企业所在市"去编市级码;表里没有的码,宁可用省码。
常用地区编码:
- 1100: 北京市
- 1200: 天津市
- 1300: 河北省
- 1400: 山西省
- 1500: 内蒙古
- 2100: 辽宁省
- 2102: 大连市
- 2200: 吉林省
- 2300: 黑龙江省
- 3100: 上海市
- 3200: 江苏省
- 3300: 浙江省
- 3400: 安徽省
- 3302: 宁波市
- 3500: 福建省
- 3502: 厦门市
- 3600: 江西省
- 3700: 山东省
- 3702: 青岛市
- 4100: 河南省
- 4200: 湖北省
- 4300: 湖南省
- 4400: 广东省
- 4403: 深圳市
- 4500: 广西
- 4600: 海南省
- 5000: 重庆市
- 5100: 四川省
- 5200: 贵州省
- 5300: 云南省
- 5400: 西藏
- 6100: 陕西省
- 6200: 甘肃省
- 6300: 青海省
- 6400: 宁夏
- 6500: 新疆
身份类型枚举
FDDBR: 法定代表人CWFZR: 财务负责人BSY: 办税员KPY: 开票员DLJG: 代理机构
执行流程
Step 0: 询问登录方式
用户发起检测后,先用 AskUserQuestion 询问登录方式(账号密码登录 / 扫码登录),再按所选分支采集信息并登录:
- 账号密码登录 → 按 Step 1 → Step 2 执行
- 扫码登录 → 按 Step 1-QR(命令6 + 命令7 前台组合)执行
两个分支登录成功后均进入 Step 3(1.3 查询授权状态),后续流程完全一致。
Step 1-QR: 扫码登录(命令6 + 命令7 前台组合,扫码登录分支)
扫码登录只需采集 nsrsbh/nsrmc/ssdq 三项。流程 = 命令6(前台,几秒返回)→ 展示二维码 → 命令7(前台阻塞等待结果)→ 拿到结果立即告知用户。
// 企业信息JSON(ddbh/cpfwbh/customerId/userId/qdbm/sqInfo 由脚本自动填充)
{
"nsrsbh": "91330602***********",
"nsrmc": "XXXXXXXXXXXXXXXXXX",
"ssdq": "3300"
}
第一段:命令6 启动扫码守护(前台运行,几秒即回)
命令:python yunqi_openapi_client.py 6 '<企业信息JSON>' [守护最大等待秒=240]
命令6 会拉起一个分离守护进程(独立存活,负责取码→生成 live 页面→轮询扫码→1010交叉确认→终态写 logs/scan_result.json),自身几秒内返回,返回 data 含 qrcode_live_html(展示页,留档/兜底)、qrcode_png(二维码 PNG 绝对路径)、qrcode_widget_ready(内联片段是否就绪);stdout 里 [WIDGET_BEGIN] / [WIDGET_END] 两行之间就是可直接内联渲染的完整卡片片段(迷你 PNG 版:base64 约 700 字符、静区已烘焙进图片;点阵解码失败时为原图折行兜底版)。live 页面与 PNG 都是每次取码带时间戳的新文件(qrcode_live_YYYYMMDD_HHMMSS.html / .png,不覆盖旧文件)。此时:
1. 第一时间展示二维码:WorkBuddy 用 show_widget 内联渲染,widget_code 直接填 stdout 里 [WIDGET_BEGIN]…[WIDGET_END] 之间的内容,原样透传、一个字符都不要改(片段里的迷你 PNG 以 base64 内嵌,原样透传即可;也不要通过「读文件」二次获取片段——读取工具会截断超长单行),让二维码直接落在聊天流里;不要改用 present_files(那会把二维码挪到右侧产物面板,用户看不到),也不要自己拼 HTML。若宿主没有 show_widget,或 stdout 里没有该片段,再按「宿主适配」章节的降级顺序处理(present_files → qwenwork_file_present_files)。中间不做任何校验、探活等拖延操作,二维码有效期从取码即开始计算。过期换码后重新渲染的是新卡片,旧卡片对应旧码已失效,提醒用户扫最新一张即可;
2. 提示「请使用电子税务局 APP 扫码(有效期约3分钟),扫码后我会自动继续」。
第二段:命令7 前台等待扫码结果(严禁后台运行!)
命令:python yunqi_openapi_client.py 7 [最大等待秒=240](Bash 工具 timeout 参数须设 300000 毫秒以上)
命令7 前台阻塞读取守护进程结果,直到出现终态或超时。⚠️ 必须前台运行、不得 run_in_background——后台任务在回合结束后无法触发新对话轮次,用户将收不到任何提醒(实测教训);前台等待期间任务显示"运行中"是预期行为,这正是"助手在守着扫码"的体现。
命令7 返回后的处置(拿到结果必须立即在聊天中告知用户,严禁静默):
⚠️ 输出位置规则(重要):扫码结果提示(✅/⚠️/❌ notify 文案)必须出现在所有二维码卡片之后——内联卡片本身位置自由(渲染完可以继续输出文字),但结果提示严禁被后续内容压到上面去。成功场景后续的报告轮询进度与最终结果自然追加在 notify 之下即可。
命令7 返回的 JSON 含现成的 notify 字段(醒目文案),输出该文案(位置遵循上述规则):
- code=0000(含 data.ywjcjlbh):输出 notify(✅ 扫码授权成功…)后,同一回合内立即按 Step 3 的分段轮询规则开始查报告(命令3每轮 30 240 前台循环)——严禁输出成功提示后就结束回合;
- code=expired 或 code=wait:输出 notify(⚠️ 二维码已过期…)即可结束流程,等待用户指令。不要自动重新取码/自动生成新二维码——只有当用户主动回复(如「重新生成二维码」「再试一次」)时,才重新从第一段(命令6)开始;
- code=fail:输出 notify(❌ 授权失败+原因),等待用户决定重新采集信息或换登录方式。
> 二维码有效期由服务端控制(约3分钟);助手不做主动过期检测,过期由登录状态轮询接口提示(1010),守护进程经 1.3 基线交叉确认(对比取码时记录)排除「扫码成功但错过0000」的情形后才判定为过期,不会漏判成功也不会误判历史记录。命令8(整体后台模式)保留为代码备选但不用,日常流程一律使用 6+7 前台组合。
Step 1: 收集基础信息并发送短信(账号密码登录分支)
调用1.1接口,传入所有基础参数。成功后获取返回的taskId和mobile。
// 1.1 请求示例
{
"ddbh": "HT2025082716264379",
"cpfwbh": "ACSY_2001",
"nsrsbh": "91330602***********",
"nsrmc": "XXXXXXXXXXXXXXXXXX",
"ssdq": "3300",
"customerId": "15512",
"userId": "14121",
"gryhm": "136****8895",
"gryhmm": "********",
"sflx": "FDDBR",
"sjhm": "136****8895",
"qdbm": "CHANNEL_CODE",
"sqInfo": "BASE64_ENCODED_AGREEMENT"
}
Step 2: 上传短信验证码并登录(账号密码登录分支)
提示用户输入收到的短信验证码,调用1.2接口。
// 1.2 请求示例
{
"taskId": "99ddc5bcd7f54dad95f0688d00b2317f",
"nsrsbh": "91330602***********",
"smsCode": "123456"
}
Step 3: 查询授权状态及报告(分段前台轮询,助手全程守着)
任一登录分支成功后必须在同一回合内立即执行本步骤(扫码授权成功、短信登录成功后均直接进入,不等用户催促、不得先输出结果再等下一条消息)。调用1.3接口,检查当前授权状态和已有报告。报告一般约 10 分钟生成。
⚠️ 分段轮询规则(必须遵守,否则 Bash 工具 600 秒超时上限会导致整段命令 3 失败):
禁止一次性执行默认参数的命令 3(1200 秒超上限);必须用短超时分段循环:
每轮:python yunqi_openapi_client.py 3 <nsrsbh> 30 240 (前台,timeout 设 300000ms,单轮约4分钟)
每轮返回后检查结果:
- data.reportUrl / reportUrl_list 非空 → 报告已生成,立即输出最终结果(风险概览 + 报告下载地址),流程结束(如需风险统计,随后用 1.3 返回的 uuid 作为 ywjcjlbh 执行命令 5 获取概览);
- data.cjStatus == 3 → 数据采集失败(死路),立即终止并把 fail_reason 告知用户;
- 仍在生成中 → 不结束回合,紧接着执行下一轮(同一条命令),每轮之间在聊天中输出一句进度(如「已等待 4 分钟,报告生成中,请稍候…」);
- 累计约 5 轮(约 20 分钟)仍未生成 → 停止轮询,告知用户当前状态和稍后查询方式。
// 1.3 请求示例
{
"nsrsbh": "91330602***********",
"userId": "14121",
"customerId": "15512"
}
> ⏳ 命令 3 参数:python yunqi_openapi_client.py 3 <nsrsbh> [轮询间隔秒=30] [最大等待秒]。
> ⚠️ 严禁以默认 1200 秒整段运行,也严禁 run_in_background(后台任务回合结束后无法触发新轮次,用户收不到结果——实测教训)。只用 30 240 分段前台循环(见上方规则)。
> 注:若报告此前已生成(如当天早前扫码启动过检测),首轮查询即会直接返回 reportUrl,无需等待。
Step 4: 申请付费报告(可选)
如需生成新的付费报告,调用1.4接口。成功后获取ywjcjlbh。
// 1.4 请求示例
{
"nsrsbh": "91330602***********",
"userId": "180",
"customerId": "319",
"zeroOrderNo": "HT2025031323410000",
"chargeOrderNo": "HT2025042709220000",
"zeroYwjcjlbh": "95a1a4543127428f99c8438a7fd3xxxx",
"contractId": "10",
"productId": "34",
"productAttrUnique": "ac2923628fe84620898d4e344d61xxxx"
}
Step 5: 获取风险检测概览
调用1.5接口,传入ywjcjlbh获取风险概览信息。
// 1.5 请求示例
{
"ywjcjlbh": "d3c9e44ca1e54fd4abdf2a24babd3221",
"nsrsbh": "91330602***********"
}
错误处理
常见错误码:
- 0000: 成功/短信登录保活中
- 0 / 200: 成功
- 1006: 授权失败
- 1008: 用户信息错误
- 1009: 短信发送或登录失败
- 1010: 短信验证码发送成功/登录失败
- 9999 / 500: 系统异常
遇到错误时,根据msg字段的具体描述向用户反馈,必要时联系云企技术支持。
注意事项
- 严格遵循调用顺序:不得跳过任何步骤或乱序调用
- 参数复用:已采集的参数在后续接口中自动复用
- 敏感信息保护:密码、协议等敏感信息需安全传输
- 地区编码准确性:
ssdq只用省级码 / 表内计划单列市码;填地级市码(如 2106 丹东市)会导致 getQrcode 返回9999系统异常(msg 为 null,极易误判成"服务故障")。辽宁一律2100。命令6 报 9999 时,先核对本参数再重试 - 代理机构特殊处理:当
sflx=DLJG时,必须传入dljgsh和dlNsrxxList - 报告等待时间:1.3 报告一般约 10 分钟生成;助手用命令 3 分段前台轮询(每轮约4分钟、30秒间隔,累计约20分钟),全程在聊天中输出进度,报告生成后立即输出结果
- 配置维护:基本配置信息统一维护在
config/config.ini(已被.gitignore忽略,脱敏模板见config/config.example.md);被测企业信息(电子税务局登录)运行时通过命令行传入。传输安全协议详见scripts/云企智控接口对接规范.md,客户端脚本见scripts/yunqi_openapi_client.py(依赖pip install gmssl) - 信息过滤:思考信息、运行过程信息不做展示,只展示结果信息以及异常信息以及需要用户输入的提示信息。
- 运行日志:脚本每次调用 API 时,会把输入参数(path/请求体)与输出参数(HTTP 状态码/响应)自动写入
logs/YYYY-MM-DD.log,按日期归集、一天一份;敏感字段(如密码gryhmm)已脱敏,超长字符串(如二维码 base64 图片)自动截断。logs/目录已被.gitignore忽略,日志仅用于本地排查,不随技能包分发。 - 扫码登录二维码时效:二维码一般几分钟内有效,命令7轮询满 5 分钟(默认300秒)未完成授权即停止;二维码过期/超时后须重新执行命令6获取新二维码并重新展示给用户,勿用旧
taskId反复查询。 - 首次运行前的环境自检(重要,避免无谓报错):
logs/目录可能不存在(技能包默认不含空目录),命令6 会因FileNotFoundError: .../logs/daemon.out直接崩溃。首次运行前先mkdir -p <技能目录>/logs。- 脚本依赖
gmssl(含pycryptodomex)。若宿主自带 python 未安装,直接用宿主 python 运行会ModuleNotFoundError。应在隔离环境安装:python -m venv <env>→<env>/Scripts/pip install gmssl,再用该解释器执行脚本;不要改成装在全局环境。 - Windows 运行时给命令加
PYTHONUTF8=1 PYTHONIOENCODING=utf-8,避免中文企业名称(nsrmc)在命令行传参时乱码导致接口校验失败。
输出格式
最终输出应包含:
- 风险检测概览(高风险数、中风险数、低风险数、风险总数)
- 检测报告下载地址列表
- 检测时间
- 风险提示建议
示例对话
用户: 帮我检测一下企业的税务风险
助手: 好的,我需要先采集一些企业信息。请提供以下内容:
- 纳税人识别号
- 纳税人名称
- 所属地区(如:3300-浙江省)
- 税务登录密码
- 身份类型(法人/财务/办税员等)
- 税务登录手机号
- 授权协议书(base64编码)
[用户填写表单后]
助手: 正在发送短信验证码...
[收到taskId后]
助手: 短信已发送到 136****8895,请输入收到的验证码:
[用户输入验证码后]
助手: 登录成功,正在查询授权状态...
[继续后续步骤...]
助手: 检测完成!该企业共发现16项风险点:
- 高风险:4项
- 中风险:5项
- 低风险:7项
检测报告已生成,下载地址:[链接列表]
建议按照指标应对建议进行改进完善,并定期体检。
如需深度分析(异常明细 + 政策依据 + 整改方案),可申请付费深度检测(官网 lxyq.cssyq.com.cn / 服务热线 400-005-1670)。
扫码登录示例
用户: 帮我检测一下 XX 企业的税务风险
助手: 好的,请问使用哪种登录方式?
- 账号密码登录(需电子税务局账号/密码/手机号)
- 扫码登录(使用电子税务局 APP 扫码即可)
用户: 扫码登录
助手: 请提供以下信息:
1. 纳税人识别号
2. 纳税人名称
3. 所属地区(如:2100-辽宁省)
[收到信息后,调用2.1获取二维码]
助手: [展示二维码页面] 请打开「电子税务局」APP 扫描二维码并确认授权(有效期约3分钟)。[随后前台运行命令7阻塞等待扫码结果,等待期间不需用户回复]
[命令7返回扫码授权成功后,自动继续]
助手: 扫码授权成功,正在查询授权状态并等待报告生成(预计约10分钟,完成后我会自动汇报)……
[同一回合内按分段规则前台轮询命令3(每轮 30 240),生成完毕后继续 1.4 → 1.5,输出格式与账号密码登录一致]