跳到正文
开灵科技 - 北京开灵科技有限公司API百宝箱

⑧ 申请反向开票退税

红冲或作废成功后为出售人退税:一次调用办完「可退税额预检 → 提交申请 → 受理结果查询」。无可退税额时直接返回预检结果不误提交。数据类接口。

属「乐企联用 · 报废产品收购(9 个业务接口)」——底层编排 乐企原子接口,你只调这一个。

接口(数据类)

POST  https://openapi.kailingteck.com/api/v1/invoice/reverse/lqbiz/refund/apply

鉴权:X-App-Key + X-Timestamp(Unix 秒) + X-Sign(= sha256(appKey + 时间戳 + 报文 + appSecret))。正式 AppKey/AppSecret 请联系开灵商务或您的开灵项目经理获取,联调期可先用演示密钥。

内置能力:可退税额预检 → 申请 → 受理结果,一次调用办完 内部编排:CXTSXX → SQFXKPTS → CXBFCPTSJG

请求参数

参数必填说明
zrrxm必填自然人姓名
sfzjhm必填身份证件号码;sfzjlx 默认 201,gjDm 默认 156
khhszsf必填开户银行所在省份行政区划代码,如 370000 山东省
yhzh必填自然人银行账号(退税入账账户,须与实名一致)
tdssqly选填退抵税申请理由

返回参数(data)

参数说明
refundable.ytssehj应退税税额合计(为 0 时无可退明细,不会发起申请)
refundable.(明细list)逐条:zsxmDm/zspmDm 税种品目、可退税额、skssswjgDm 税款所属机关
apply.sqjg申请结果:0 成功/1 失败
apply.tdssqxh退抵税申请序号(成功时返回,续查凭据)
apply.sbyy失败原因(失败时返回)
status.tssqzt退税申请状态:01 审批中/02 审核不同意/03 审核同意/04 申请表作废/05 收入退还书开具中
status.spbtyyy审批不同意原因(tssqzt=02 时返回)
hint处理指引

请求示例

{
  "zrrxm": "李建国", "sfzjhm": "37061119790101001X",
  "khhszsf": "370000", "yhzh": "6222020000012345678",
  "tdssqly": "发票红冲,申请退还已缴税款"
}

返回示例(成功)

{ "code": "CYT_00000", "msg": "success", "requestId": "cyt_xxx", "data": {
  "refundable": { "ytssehj": 1760,
    "list": [ { "zsxmDm": "10101", "zspmDm": "101014001", "ktse": 1760, "skssswjgDm": "13711000000" } ] },
  "apply": { "sqjg": "0", "tdssqxh": "TS2026071900001" },
  "status": { "tssqzt": "01" },
  "hint": "退税以受理结果为准;未终态可稍后重调本接口查询"
} }

返回示例(失败/业务拦截)

{ "code": "CYT_00000", "msg": "success", "data": {
  "refundable": { "ytssehj": 0 },
  "hint": "暂无可退税额:请先完成红冲或作废,税款缴纳成功后才会产生可退税额"
} }

异常与报错

情形含义与处理
HTTP 200 · refundable.ytssehj=0暂无可退税额:退税前置是红冲/作废成功且税款已缴——先完成红字流程(原子接口红字确认单)再来申请
HTTP 502 · 申请失败(sqjg=1)sbyy 给出原因;常见:银行账号与自然人实名不符、存在在途退税申请
HTTP 200 · status.tssqzt=01税务机关审批中(正常):稍后重调本接口续查,重复调用幂等

前端怎么用

const r = await post('/lqbiz/refund/apply', { zrrxm, sfzjhm, khhszsf, yhzh });
if (r.data.refundable.ytssehj === 0) return toast(r.data.hint);   // 无可退,不误提交
// 有申请序号后轮询终态:03 同意=退款在途;02 不同意=展示 spbtyyy
pollUntil(() => post('/lqbiz/refund/apply', sameBody), d => ['02','03','04'].includes(d.status.tssqzt));