② 查开票结果
拿状态、发票号码和票文件。★票的 PDF / OFD / XML 三种格式都在这个接口返回,不需要再调别的接口下载。
属「正向开票 · 腾讯联用」——开票通道的签名与加密全在开灵中台,你只调这一个。
接口
POST https://openapi.kailingteck.com/api/v1/invoice/forward/query
鉴权:X-App-Key + X-Timestamp(Unix 秒) + X-Sign(= sha256(appKey + 时间戳 + 报文原文 + appSecret) 小写十六进制)。与开灵其它接口完全一致。
请求参数
| 字段 | 必填 | 大白话说明 |
|---|---|---|
seller_taxpayer_num | 必填 | 销方税号(统一社会信用代码,15/17/18/20 位,不含字母 I O S V Z)。★字段名就是 seller_taxpayer_num,写成 taxpayer_id、tax_no 都不行——写错时上游回的是「税号不能为空」,明明传了却说没传,极易误判 |
order_id | 二选一 | 你侧订单号(①开票时传的那个)。与 order_sn 不能同时为空 |
order_sn | 二选一 | ①返回的通道受理号。★注意不能只传 invoice_id |
is_red | 选填 | 查哪种票:0 蓝票(默认)/ 1 红票。★查红票必须传 1,否则查不到。也可以直接用 ④ 查红票接口,那个已经帮你固定成 1 了 |
请求示例
{
"order_id": "ORD20260829001",
"seller_taxpayer_num": "91110119MABQDU249D"
}返回
统一信封 code/msg/requestId/timestamp/data,业务字段都在 data 里。code 为 CYT_00000 表示调用成功。
返回参数(data)
| 字段 | 大白话说明 |
|---|---|
order_id | 你侧订单号。与 order_sn 不会同时为空 |
order_sn | 通道受理号(上游侧的订单唯一标识) |
status | ★开票状态:0 无效 / 1 开票中 / 2 开票失败 / 3 开票成功 / 4 作废中 / 5 作废失败 / 6 作废成功。★数电票没有作废,4~6 见不到 |
message | 开票描述。失败时这里是原因 |
ticket_date | 开票日期 |
ticket_sn | ★发票号码(开成功才有) |
ticket_code | 发票代码。★数电票没有发票代码,这里返回空或 0,属正常 |
check_code | 校验码。★数电票没有校验码,返回空,属正常 |
amount_with_tax | 含税金额(元) |
amount_without_tax | 不含税金额(元) |
tax_amount | 税额(元) |
is_red_washed | 是否已被红冲:0 未红冲 / 1 已红冲 |
pdf_url | ★发票 PDF 下载地址(开灵自有地址,24 小时有效) |
ofd_url | 发票 OFD 下载地址(数电票才有) |
xml_url | 发票 XML 下载地址(数电票才有) |
tax_bureau_url | 税局端下载页地址,该页面含 PDF / OFD / XML 三个下载入口 |
buyer_info | 购方信息回显 |
返回示例(成功)
{
"code": "CYT_00000",
"msg": "success",
"data": {
"order_id": "",
"order_sn": "7499487274632001743",
"status": 3,
"message": "开票成功",
"ticket_date": "2026-08-29",
"ticket_sn": "26117200000004866581",
"ticket_code": "0",
"check_code": "",
"amount_with_tax": "1",
"amount_without_tax": "0.88",
"tax_amount": "0.12",
"is_red_washed": 0,
"pdf_url": "https://openapi.kailingteck.com/api/v1/invoice/forward/file/51f659315f9a0f7a648f571087144cfa__26117200000004866581.pdf",
"ofd_url": "https://openapi.kailingteck.com/api/v1/invoice/forward/file/c91c46f3045b6ba3e80f127a963327a5__26117200000004866581.ofd",
"xml_url": "https://openapi.kailingteck.com/api/v1/invoice/forward/file/4ea8bb05896f1c1e982de6c07b1e0ea1__26117200000004866581.xml",
"tax_bureau_url": "",
"buyer_info": {
"title_type": "1",
"buyer_title": "个人",
"buyer_taxpayer_num": "",
"buyer_address": "",
"buyer_phone": "",
"buyer_bank_name": "",
"buyer_bank_account": "",
"buyer_email": ""
},
"mock": false
}
}返回示例(失败)
{
"code": "CYT_00000",
"data": {
"status": 2,
"message": "蓝票开票失败:具体原因见此字段",
"ticket_sn": "0",
"pdf_url": ""
}
}异常与报错
| 情形 | 含义与处理 |
|---|---|
| 税号不能为空(但你明明传了) | ★销方税号的字段名写错了。必须叫 seller_taxpayer_num,不是 taxpayer_id 也不是 tax_no。上游收不到这个字段就报「为空」,不会告诉你是名字错了 |
| appkey未被 xxx 授权 | ★销方企业还没把开票能力授权给开灵平台的应用。不是参数问题、也不是接入方能自行解决的,请联系开灵,由销方企业在乐企平台完成授权 |
| 找不到对应的发票信息 | 订单号不对,或①开票根本没受理成功 |
| status 一直是 1 | 还在开票中。建议间隔 3~5 秒轮询,设最大次数,别写死循环 |
| status=2 | 开票失败,读 message 拿原因。常见:金额校验、税收编码、税盘未绑定 |
| 票文件链接打不开 | 链接 24 小时有效,过期重新调本接口即可拿到新链接 |
回调推送字段
前端怎么用
// 轮询直到 status === 3
const r = await post('/api/v1/invoice/forward/query', { order_id, seller_taxpayer_num });
if (r.data.status === 3) download(r.data.pdf_url);不想轮询的话,在①开票时配好 callback_url,开票结果会主动推给你——★这个回调和④查红票是同一个接口、同一个地址,蓝票红票都走它,用 notify_type 区分。票文件已由开灵转存,给到的是开灵自有下载地址,不暴露上游。
