反向开票 · 接口全集
腾讯系面向报废产品回收场景:商户完成向自然人(散户)的收购后,通过接口完成转账付款、企业代缴个税(可选)、反向开具蓝字数电发票, 并可查询进度、下载票面、以及在开票有误/退货时发起全额红冲。 本组共 8 个接口,覆盖企业开通校验 → 提交开票 → 收款二维码 → 状态查询 → 取消 → 发票下载 → 蓝票冲红 → 冲红查询的完整生命周期。本组接口资金通道为腾讯系(微众银行/微信运营账号)。
业务流程 · 泳道图
一票报废收购从开通校验 → 提交开票 → 收款二维码 → 状态查询 → 下载发票 → 蓝票冲红的完整生命周期。蓝色粗线 = 你方系统实际要调的业务接口;细线 = 开灵平台内部替你转发腾讯方、以及腾讯方内部处理。
说明:⑤ 取消申请(cancel_transfer)为异常分支——仅在缴税前可撤销,已开票的改走蓝票冲红。所有查询类接口免费,仅② 提交转账+开票计费。
🤖 AI 接入包(给外部系统的 AI 直接写对接代码)
把下面这份接入包丢给贵方的 AI(Claude / Cursor / 通义 等),它就能按本平台规范、用你指定的编程语言写出可直接运行的对接代码——覆盖鉴权签名 + 全部 8 个接口的字段/示例 + 代理下载 + 错误处理。
接入包地址:https://openapi.kailingteck.com/api/skill/reverse(纯 Markdown,可直接被程序抓取)。
调用地址
| 接口 | 方法 | 地址 |
|---|---|---|
| 查询企业开通状态 | POST | https://openapi.kailingteck.com/api/v1/invoice/reverse/company_query |
| 提交转账和开票申请 | POST | https://openapi.kailingteck.com/api/v1/invoice/reverse/transfer_apply |
| 获取转账和开票申请的二维码 | POST | https://openapi.kailingteck.com/api/v1/invoice/reverse/transfer_qrcode |
| 查询转账和开票申请的状态 | POST | https://openapi.kailingteck.com/api/v1/invoice/reverse/transfer_status |
| 取消转账和开票申请 | POST | https://openapi.kailingteck.com/api/v1/invoice/reverse/cancel_transfer |
| 下载发票 | POST | https://openapi.kailingteck.com/api/v1/invoice/reverse/invoice_download |
| 发起蓝票冲红 | POST | https://openapi.kailingteck.com/api/v1/invoice/reverse/red_invoice |
| 查询冲红状态 | POST | https://openapi.kailingteck.com/api/v1/invoice/reverse/red_invoice_status |
请求体为 JSON,Content-Type: application/json,UTF-8 编码。
鉴权(与发票查验接口同一套)
每次请求携带三个请求头:X-App-Key(平台分配)、X-Timestamp(Unix 秒级时间戳,与服务器时差须在 ±300 秒内)、X-Sign = SHA256(app_key + timestamp + body + app_secret) 的 16 进制小写。
# 签名:sign = SHA256(app_key + timestamp + body + app_secret) 的 16 进制小写
BODY='{"order_no":"20260112000004"}'
TS=$(date +%s)
SIGN=$(printf '%s' "${APP_KEY}${TS}${BODY}${APP_SECRET}" | shasum -a 256 | cut -d' ' -f1)
curl -X POST https://openapi.kailingteck.com/api/v1/invoice/reverse/transfer_status \
-H "Content-Type: application/json" \
-H "X-App-Key: ${APP_KEY}" \
-H "X-Timestamp: ${TS}" \
-H "X-Sign: ${SIGN}" \
-d "$BODY"计费说明
- 提交转账和开票申请:按开票金额(
total_amount价税合计)乘以合同约定费率计费,申请受理成功(code=0返回订单号)才计费,失败不计费; - 其余 7 个接口(开通校验/二维码/状态查询/取消/下载/蓝票冲红/冲红查询):均免费,不限次数,蓝票冲红不单独计费;
- 费用从账户余额中扣减,可在商户中心实时查看每笔费用与余额。
接口一:查询企业开通状态
开票前置校验。回收企业(销方)须完成企业注册审核、乐企开通、微众银行开户三关方可开票。建议在提交开票前先调用本接口,确认三态均为「已开通(=2)」再发起开票,并从返回中取得 bank_account(付款行账号)与 issuer_id(开票员)。
请求参数
| 参数名称 | 类型 | 必填 | 最大长度(字节) | 描述 |
|---|---|---|---|---|
| taxpayer_no | string | 是 | 20 | 企业税号(统一社会信用代码/纳税人识别号) |
响应参数(data)
| 参数名称 | 类型 | 必返 | 描述 |
|---|---|---|---|
| company_status | int | 是 | 企业注册状态:1=正在审核;2=已审核(仅审核通过的企业才能开票) |
| leqi_status | int | 是 | 乐企开通状态:0=未开通;1=正在审核;2=已开通;4=乐企接入失败 |
| bank_status | int | 是 | 微众银行开通状态:0=未开通;1=正在审核;2=已开通;3=需要支付授权 |
| bank_account | string | 否 | 微众银行账号,开通成功后返回(即为提交开票时 buyer_bank_account 的来源) |
| issuer_list | array | 否 | 开票员列表,乐企开通成功后返回(见下方 issuer 字段详情) |
issuer_list 字段详情
| 参数名称 | 类型 | 必返 | 描述 |
|---|---|---|---|
| issuer_id | string | 是 | 开票员 ID(提交开票申请时 issuer_id 的来源) |
| name | string | 是 | 开票员名称,形如「张** 0012」 |
请求示例
{
"taxpayer_no": "914403001234567890"
}响应示例
{
"code": 0,
"data": {
"company_status": 2,
"leqi_status": 2,
"bank_status": 2,
"bank_account": "999967735837012345678",
"issuer_list": [
{ "issuer_id": "1985991047072530434", "name": "张** 0012" }
]
},
"message": null
}开票硬前提:company_status=2 且 leqi_status=2 且 bank_status=2。bank_status=3(需支付授权)时,须企业方先完成微众银行支付授权。
接口二:提交转账和开票申请
当完成报废产品收购,商户为自然人反向开具发票时,调用此接口完成转账申请及蓝字发票开具申请。
请求参数
| 参数名称 | 类型 | 必填 | 最大长度(字节) | 描述 |
|---|---|---|---|---|
| request_id | string | 是 | 128 | 唯一标识一个开票请求,防止重复创建订单 |
| buyer_taxpayer_no | string | 是 | 20 | 购买方统一社会信用代码/纳税人识别号 |
| buyer_bank_account | string | 是 | 50 | 购买方开户银行账号 |
| seller_name | string | 是 | 300 | 销方姓名 |
| seller_phone | string | 是 | 60 | 销方手机号 |
| seller_id_card | string | 是 | 20 | 销方身份证号 |
| seller_bank_name | string | 否 | 120 | 销方开户银行 |
| seller_bank_account | string | 否 | 120 | 销方开户银行账号 |
| invoicing_type | int | 是 | 4 | 开票类型:3=报废产品收购(增值税专用发票);4=报废产品收购(增值税普通发票) |
| total_amount | decimal | 是 | 18,2 | 总价税合计 |
| tax_amount | decimal | 是 | 18,2 | 总税额 |
| net_amount | decimal | 是 | 18,2 | 不含税总金额 |
| issuer_id | string | 是 | 64 | 开票员 ID(来自「查询企业开通状态」的 issuer_list) |
| items | array | 是 | 1 | 开票项目明细(见下方 items 字段详情) |
| is_enterprise_tax | bool | 否 | 1 | 是否启用企业代缴个税 |
| transfer_channel | int | 否 | 4 | 转账渠道:0=微众银行;1=微信运营账号 |
items 字段详情
| 参数名称 | 类型 | 必填 | 最大长度(字节) | 描述 |
|---|---|---|---|---|
| category | string | 是 | 120 | 商品和服务税收分类 |
| tax_class_code | string | 是 | 19 | 商品和服务税收分类合并编码 |
| goods_short_name | string | 是 | 120 | 商品服务简称 |
| goods_name | string | 是 | 600 | 项目名称 |
| goods_specs_model | string | 否 | 150 | 规格型号 |
| goods_unit | string | 是 | 300 | 单位(蓝票必填) |
| goods_quantity | decimal | 是 | 12,10 | 数量 |
| goods_price | decimal | 是 | 12,10 | 单价 |
| goods_tax_rate | decimal | 是 | 10,6 | 税率 |
| goods_total_amount | decimal | 是 | 18,2 | 含税金额 |
响应参数(data)
| 参数名称 | 类型 | 必返 | 描述 |
|---|---|---|---|
| order_no | string | 是 | 订单号,后续查询/二维码/取消/下载/冲红均以此为唯一凭据 |
请求示例
{
"request_id": "32fea2b28b3c4caeac7cf6173c9c15da",
"buyer_taxpayer_no": "914403001234567890",
"buyer_bank_account": "9999677358370100212121",
"seller_name": "张三",
"seller_phone": "18568641234",
"seller_id_card": "41234567890123456789",
"seller_bank_name": "中国工商银行股份有限公司",
"seller_bank_account": "888867735837012345678",
"invoicing_type": 4,
"total_amount": 1.10,
"tax_amount": 0.01,
"net_amount": 1.09,
"issuer_id": "1985991047072530434",
"items": [
{
"category": "废铜",
"tax_class_code": "1110201000000000000",
"goods_short_name": "废铜",
"goods_name": "废铜",
"goods_specs_model": "",
"goods_unit": "斤",
"goods_quantity": 2,
"goods_price": 0.55,
"goods_tax_rate": 0.01,
"goods_total_amount": 1.1
}
]
}响应示例
{
"code": 0,
"data": {
"order_no": "20260112000004"
},
"message": null
}request_id 由贵方生成并保证唯一,同一 request_id 重复提交不会重复创建订单(幂等)。
接口三:获取转账和开票申请的二维码
提交申请后,凭订单号获取收款二维码,供自然人(销方)微信扫码确认收款。返回为 base64 编码的 PNG 图片,前端可直接以 data:image/png;base64,<qrcode> 渲染。
请求参数
| 参数名称 | 类型 | 必填 | 最大长度(字节) | 描述 |
|---|---|---|---|---|
| order_no | string | 是 | 32 | 订单号(提交申请接口返回) |
响应参数(data)
| 参数名称 | 类型 | 必返 | 描述 |
|---|---|---|---|
| qrcode | string | 是 | base64 编码的二维码 PNG 图片 |
请求示例
{
"order_no": "20260112000004"
}响应示例
{
"code": 0,
"data": {
"qrcode": "iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAAB..."
},
"message": null
}接口四:查询转账和开票申请的状态
提交申请后,凭订单号调用此接口查询该笔业务在转账、缴税、开票各环节的实时状态与最终结果。
请求参数
| 参数名称 | 类型 | 必填 | 最大长度(字节) | 描述 |
|---|---|---|---|---|
| order_no | string | 是 | 32 | 订单号(提交申请接口返回) |
响应参数(data)
| 参数名称 | 类型 | 必返 | 描述 |
|---|---|---|---|
| order_status | int | 是 | 订单状态:1=待付款;4=已完成;5=已取消;7=已失效 |
| tax_status | int | 是 | 缴税状态:1=待缴税;2=缴税中;3=缴税成功;4=已取消 |
| invoice_status | int | 是 | 开票状态:1=未开具;2=开具中;3=开具成功;4=开具失败;5=已取消 |
| invoice_no | string | 否 | 发票号码 |
| pay_time | string | 否 | 付款时间,格式 yyyy-MM-dd HH:mm |
| receipt_time | string | 否 | 收款时间,格式 yyyy-MM-dd HH:mm |
| invoice_time | string | 否 | 开票日期,格式 yyyy-MM-dd HH:mm:ss |
| tax_time | string | 否 | 缴税时间,格式 yyyy-MM-dd HH:mm:ss |
| invoice_error_message | string | 否 | 开票失败原因 |
| transfer_error_message | string | 否 | 转账失败原因 |
请求示例
{
"order_no": "20260112000004"
}响应示例
{
"code": 0,
"data": {
"invoice_error_message": null,
"invoice_no": "26367200000123456789",
"invoice_status": 3,
"invoice_time": "2026-01-13 00:05:56",
"order_status": 4,
"pay_time": "2026-01-13 00:05:32",
"receipt_time": "2026-01-13 00:06:30",
"tax_status": 3,
"tax_time": "2026-01-13 00:06:07",
"transfer_error_message": null
},
"message": null
}建议轮询间隔 30 秒以上;开具成功后从返回中取 invoice_no(发票号码)及各环节时间回写贵方业务台账。终态成功 = order_status=4 且 tax_status=3 且 invoice_status=3。
接口五:取消转账和开票申请
凭订单号取消尚未缴税的转账开票申请。仅在缴税前(未进入缴税环节)可取消,已缴税/已开票的订单不可取消,需改走蓝票冲红。
请求参数
| 参数名称 | 类型 | 必填 | 最大长度(字节) | 描述 |
|---|---|---|---|---|
| order_no | string | 是 | 32 | 订单号(提交申请接口返回) |
响应参数(data)
无业务数据,code=0 即取消受理成功(data 为 null)。
请求示例
{
"order_no": "20260112000004"
}响应示例
{
"code": 0,
"data": null,
"message": null
}接口六:下载发票
凭企业税号 + 发票号码,获取蓝字发票文件的下载链接,支持 PDF/XML/OFD 三种格式。下载地址由平台代理转存,直接以 GET 打开即可(无需再带鉴权头,可直接交浏览器/下载器)。
请求参数
| 参数名称 | 类型 | 必填 | 最大长度(字节) | 描述 |
|---|---|---|---|---|
| taxpayer_no | string | 是 | 20 | 企业税号(统一社会信用代码/纳税人识别号) |
| invoice_no | string | 是 | 32 | 发票号码 |
| file_type | int | 是 | 1 | 下载文件类型:1=PDF;2=XML;3=OFD |
响应参数(data)
| 参数名称 | 类型 | 必返 | 描述 |
|---|---|---|---|
| file_url | string | 是 | 平台代理下载地址(GET 直接下载),有效期 24 小时 |
请求示例
{
"taxpayer_no": "914403001234567890",
"invoice_no": "26367200000123456789",
"file_type": 1
}响应示例
{
"code": 0,
"data": {
"file_url": "https://openapi.kailingteck.com/api/v1/invoice/reverse/file/3f9a...c1__26367200000123456789.pdf"
},
"message": null
}file_url 有效期 24 小时,建议拿到后及时下载并转存到贵方系统归档,不要长期缓存该链接。
接口七:发起蓝票冲红
蓝字发票开具成功后,如遇开票有误、销货退回、服务中止或销售折让,调用此接口发起红冲。仅支持全额红冲(不支持部分冲红),凭原蓝字发票的订单号发起。
请求参数
| 参数名称 | 类型 | 必填 | 最大长度(字节) | 描述 |
|---|---|---|---|---|
| order_no | string | 是 | 32 | 原蓝字发票的订单号 |
| reason | int | 是 | 1 | 冲红原因:1=开票有误;2=销货退回;3=服务中止;4=销售折让 |
| issuer_id | string | 否 | 64 | 开票人 ID |
响应参数(data)
无业务数据,code=0 即红冲受理成功(data 为 null);红冲开具进度请调用「查询冲红状态」跟踪。
请求示例
{
"order_no": "20260112000004",
"reason": 1
}响应示例
{
"code": 0,
"data": null,
"message": null
}接口八:查询冲红状态
发起蓝票冲红后,凭原订单号查询红字发票的开具进度与红字发票号码。
请求参数
| 参数名称 | 类型 | 必填 | 最大长度(字节) | 描述 |
|---|---|---|---|---|
| order_no | string | 是 | 32 | 原蓝字发票的订单号 |
响应参数(data)
| 参数名称 | 类型 | 必返 | 描述 |
|---|---|---|---|
| invoice_no | string | 是 | 红字发票号码 |
| invoice_status | int | 是 | 开具状态:2=开具中;3=成功;4=失败 |
| invoice_time | string | 否 | 开票日期,格式 yyyy-MM-dd HH:mm:ss |
| invoice_error_code | string | 否 | 开具失败原因编码 |
| invoice_error_message | string | 否 | 开具失败原因 |
请求示例
{
"order_no": "20260112000004"
}响应示例
{
"code": 0,
"data": {
"invoice_error_code": "",
"invoice_error_message": "",
"invoice_no": "2636720000000123456789",
"invoice_status": 3,
"invoice_time": "2026-01-13 00:12:20"
},
"message": null
}红冲开具成功(invoice_status=3)后,从 invoice_no 取红字发票号码回写台账;失败(invoice_status=4)时依据 invoice_error_message 排查。
错误处理
响应报文壳固定为 { code, message, data },code=0 表示成功;code≠0 时 message 携带失败原因,依据提示修正后重试。
以下情况请求未进入开票通道,返回平台层错误码(报文壳为 { code: "CYT_xxx", msg, requestId, data }):
| 错误码 | HTTP | 含义与处理 |
|---|---|---|
| CYT_40001 | 400 | 参数缺失或格式错误(如 total_amount 缺失或非数字) |
| CYT_40100/40101 | 401 | 缺少鉴权头/app_key 无效,检查密钥配置 |
| CYT_40102 | 401 | 签名校验失败,核对签名拼接顺序与 body 一致性 |
| CYT_40103 | 401 | 时间戳过期(±300 秒),校准服务器时间后重试 |
| CYT_42901 | 429 | 请求过于频繁,稍后重试 |
| CYT_42902 | 402 | 账户余额不足,充值后重试 |
| CYT_50200 | 502 | 开票通道暂时不可用,稍后重试;持续失败请联系平台技术支持 |
