⑦ 下单(开票信息预下单)
每卖一票的下单步:把这一票的全部开票信息 + 支付信息报给工行,工行受理后返回一个页面—— 要么展示「订单已受理」、要么直接跳到支付页(视特定要素/是否实名签而定)。页面类:前端 POST → 拿 pageUrl → location.href 跳过去。
接口
POST https://openapi.kailingteck.com/api/v1/icbc/order/pre 工行:/ui/jft/ui/invoice/pre/order/V1 (页面类 · RSA2 签名 · biz_content=JSON)
鉴权:X-App-Key + X-Sign + X-Timestamp。中台注入 appId、invoiceNotifyUrl、verifiedCode、ukeyId,其余业务字段全字段原样透传给工行,不筛不改。
缴税方式:两种,由 taxPaymentMethod 决定
taxPaymentMethod=1或不传 —— 企业委托扣缴(默认)。付款成功后工行自动开票 + 代扣代缴 + 把钱打给散户。taxPaymentMethod=0—— 自然人自行办理。工行不代扣,税由散户本人去办,企业只付货款。仅再生资源场景需要上送,其他场景不用传。
配套字段:iitProject(个人所得税项目)、supplementaryTax(补缴税费标志)。缴税结果可在每日缴税对账单里按「缴纳方式」字段核对。
必看:两个必输字段要成对填
specificElements(特定要素)与 buyerInvTypeCode(收购发票类型代码)是一组,填错会被税局侧退回:
农产品收购 specificElements = 16 buyerInvTypeCode = 01 报废产品收购 specificElements = 24 buyerInvTypeCode = 04
走业务层 /api/v1/rinv/invoice/create 时,只传其中一个,另一个会按上表自动推导;两个都不传按报废产品收购处理(2026-09-15 按客户确认由农产品改为报废)。原子层不做推导,传什么就是什么。
请求参数 · 顶层(工行原字段名 · 共 70 项)
| 工行字段 | 必输 | 最大长度 | 说明 |
|---|---|---|---|
appId | 必输 | 20 | 平台商户标识(开灵自动注入,你不用传) |
outOrderId | 必输 | 35 | 你侧订单号,全流程唯一;查结果、红冲都用它。payChannel 为 04/05 时长度不能超过 34 |
outVendorId | 必输 | 40 | 收方编号;支付渠道为 05 时上送收方自然人或子商户编号 |
outUserId | 必输 | 20 | 付方编号;支付渠道为 05 时上送付方子商户编号 |
trxChannel | 选输 | 2 | 交易渠道:01-PC / 02-移动端 / 03-H5 |
asynFlag | 选输 | 1 | 线上异步支付标识:0-其他 / 1-线上企网异步支付(默认) / 2-直接支付 |
payPhoneno | 选输 | 30 | 付款人手机号 |
province | 选输 | 60 | 收货方省份 |
city | 选输 | 60 | 收货人城市 |
county | 选输 | 60 | 收货人区县 |
email | 选输 | 60 | 收货人邮箱 |
phone | 选输 | 30 | 收货人电话 |
address | 选输 | 100 | 收货人详细地址 |
post | 选输 | 10 | 收货人邮编 |
payRem | 选输 | 200 | 付款备注,登记到交易明细;跨行交易时送到附言字段,最大 140 字符 |
orderRem | 选输 | 140 | 订单备注,会在页面上展示给用户看 |
addRemark | 选输 | 140 | 回单补充信息备注,需要打印在回单上时才传 |
currency | 必输 | 3 | 交易币种,人民币固定填 001 |
summary | 选输 | 20 | 打印到回单的摘要栏 |
purpose | 选输 | 20 | 打印到回单的用途栏 |
payJumpUrl | 必输 | 200 | 支付完成后回跳你们页面的地址(不支持传参) |
invoiceNotifyUrl | 必输 | 200 | 发票状态变更通知地址。开灵自动注入我方回调地址,你不用传 |
invoiceJumpUrl | 选输 | 200 | 自然人确认成功后回跳的页面地址(不支持传参) |
invoiceType | 选输 | 2 | 发票类型:01-增值税专用发票 / 02-普通发票。开票时必输 |
orderAmount | 必输 | 17 | 价税合计。整数位不超过 14 位,小数位不超过 2 位 |
naturalPersonName | 选输 | 100 | 收方(销售方自然人)姓名。开票时必输 |
cardType | 选输 | 3 | 收方身份证件类型,取值见证件类型对照表(如 201 居民身份证)。开票时必输 |
cardNumber | 选输 | 20 | 收方身份证件号码。开票时必输 |
sellerAddress | 选输 | 30 | 收方地址,填自然人销售方居住地 |
sellerTelephone | 选输 | 20 | 收方电话,填自然人销售方手机号。开票时必输 |
taxpayerNo | 选输 | 20 | 付方纳税人识别号(回收企业;特定要素为 16 农产品收购时为农产品收购企业)。开票时必输 |
taxpayerName | 选输 | 160 | 付方纳税人名称。开票时必输 |
drawerName | 选输 | 200 | 开票人。开票时必输 |
drawerCardType | 选输 | 4 | 开票人证件类型。开票时必输 |
drawerCardNumber | 选输 | 30 | 开票人证件号码。开票时必输 |
payeeName | 选输 | 150 | 收款人姓名 |
reviewerName | 选输 | 75 | 复核人姓名 |
specificElements | 必输 | 2 | 特定要素:16-农产品收购 / 24-报废产品收购。要与 buyerInvTypeCode 成对 |
areaCode | 选输 | 20 | 区域代码,填省级税务机关代码(取值见下方对照表);平台经营模式 merBusiModel 为 01-平台自营时必输。走业务层时不传会自动填后台为该客户配置的值 |
isSellerPersonProduct | 选输 | 1 | Y-销售自己使用过的报废产品(报废车普票) / N-销售收购的报废产品 |
iitProject | 选输 | 1 | 个人所得税项目:1-财产转让所得 / 2-经营所得 |
buyerInvTypeCode | 必输 | 2 | 收购发票类型代码:01-农产品收购发票 / 04-报废产品收购发票 |
shouldTaxLocation | 选输 | 11 | 应税行为发生地,填 11 位省市级税务机关代码(如重庆 15000000000) |
notes | 选输 | 450 | 备注(开票时备注) |
mac | 选输 | 17 | mac 地址。开票时必输 |
cpuId | 选输 | 20 | CPU 序列号 |
mainboaedId | 选输 | 20 | 主板序列号(工行字段名如此拼写,原样保留) |
goodsInfo | 必输 | list | 商品信息列表,结构见下一张表 |
taxPayerAccountNo | 选输 | 32 | 缴税付款账户 |
taxPayerBankCode | 选输 | 12 | 缴税付款开户行行号 |
taxPayerOrgName | 选输 | 200 | 缴税单位名称 |
payerName | 选输 | 120 | 付款账户户名。E 企付线上异步支付(asynFlag=1)时必输 |
payerAcctNum | 选输 | 34 | 付款账户。E 企付线上异步支付(asynFlag=1)时必输 |
isShowSellBankAcct | 选输 | 1 | 电票票面是否展示销售方银行账号:Y-展示 / N-不展示 |
isShowBuyBankAcct | 选输 | 1 | 票面是否展示购买方银行账号:Y-展示 / N-不展示 |
taxRate | 选输 | 4,2 | ★增值税税率,填「百分数的数值」不是小数:1% 填 1、3% 填 3、13% 填 13。填 0.01 会被判「增值税税率不合法」。依据:工行对 unuseReduceTaxCode 的说明原文是「增值税税率传 3 时必输」,而 3 对应 3% 征收率。开票时必输 |
supplementaryTax | 选输 | 1 | 补缴税费标志:Y-补缴 / N-不补缴。文档说明目前固定传 Y |
unuseReduceTaxCode | 选输 | 2 | 减按征税类型代码。税率传 3 时必输;54-前期已开 3% 需红冲或重开,55-放弃减按 1% 征收 |
isRedo | 选输 | 1 | 是否重复下单。传 Y 时只有 appId、outOrderId 为必输项,默认 N |
payChannel | 选输 | 2 | 支付渠道:01-e企付 / 02-场景结算 / 04-公对公结算 / 05-公对私结算 / 09-资金流水匹配 / 15-收款流水匹配。反向开票(企业付自然人)场景工行明确固定用 05,业务层不传时按 05 处理。注意它与 asynFlag 是两件事:payChannel 决定走哪条结算渠道,asynFlag 决定推送企业网银(1)还是直接支付(2) |
verifiedCode | 选输 | 30 | 机构编码(开灵自动注入)。特定要素为 16 且支付渠道不为 05 时必输 |
ukeyId | 选输 | 24 | U盾 ID(开灵自动注入)。特定要素为 16 且未换开时必输;支付渠道为 05 时非必输 |
isChange | 选输 | 2 | 是否换开:00-否(默认) / 01-是。仅支持特定要素 16 农产品收购的换开 |
outInvoiceId | 选输 | 35 | 开票请求流水号,换开时必输 |
loanApplyNo | 选输 | 60 | 融资申请编号 |
merBusiModel | 选输 | 2 | 平台经营模式:01-平台自营(默认) / 02-非平台自营 / 03-反向开票助手 |
isBatchSign | 选输 | 1 | 是否批量验签:0-否(默认) / 1-是 |
payBusinessFlag | 选输 | 2 | 支付业务标记:00-普通支付(默认) / 02-先票后款 |
enterpriseConfirm | 选输 | 1 | 企业确认:0 或空-自然人确认(默认) / 1-企业确认 |
taxPaymentMethod | 选输 | 1 | 税费缴纳方式:0-自然人自行办理 / 1 或空-企业委托扣缴(默认)。仅再生资源场景需要上送 |
goodsInfo · 开票明细(数组,每个商品一行)
| 工行字段 | 必输 | 最大长度 | 说明 |
|---|---|---|---|
goodsSeqno | 必输 | 5 | 商品信息子序号,同一订单内不能重复 |
projectName | 必输 | 300 | 项目名称 |
goodsNum | 必输 | 17 | 商品总数 |
goodsAmt | 必输 | 17 | 商品金额(元)。整数位不超过 14 位,小数位不超过 2 位 |
weight | 选输 | 150 | 订单商品规格 |
price | 必输 | 23 | 含税单价(元),整体长度不超过 23 位 |
units | 必输 | 10 | 计量单位,如「个」「公斤」 |
taxRate | 选输 | 4,2 | ★增值税税率,填「百分数的数值」不是小数:1% 填 1、3% 填 3、13% 填 13。填 0.01 会被判「增值税税率不合法」。依据:工行对 unuseReduceTaxCode 的说明原文是「增值税税率传 3 时必输」,而 3 对应 3% 征收率。开票时必输 |
mergedCode | 选输 | 19 | 商品和服务税收分类合并编码。开票时必输 |
preferentialType | 选输 | 2 | 优惠政策标识:03-免税 / 08-按3%简易征收。特定要素为农产品收购时无需上送,再生资源也可以不送 |
算税靠工行/税局:你把 taxRate(税率)、mergedCode(税收分类编码)、金额传对,工行按乐企规则算税,税额从预查询(⑩)取回。中台不自算。
特定要素 · 旅客运输服务发票(specificElements 命中时才传)
| 工行字段 | 必输 | 最大长度 | 说明 |
|---|---|---|---|
travelerCardNumber | 条件必输 | 20 | 有效身份证件号 |
travelDate | 条件必输 | 10 | 出行日期,格式 yyyy-MM-dd |
departurePoint | 条件必输 | 80 | 旅客出发地 |
destination | 条件必输 | 80 | 旅客到达地 |
seatingClass | 条件必输 | 20 | 座位等级。火车:一等座/二等座/软席(软座、软卧)/硬席(硬座、硬卧);飞机:公务舱/头等舱/经济舱;船舶(不含旅游船):一等舱/二等舱/三等舱 |
transportation | 条件必输 | 80 | 交通工具类型:1飞机 2火车 3长途汽车 4公共交通 5出租车 6汽车 7船舶 9其他 |
不动产、建筑服务、机动车等其它特定要素的字段,工行同样按 specificElements 取值追加,透传层一律原样转发。
返回 & 页面行为
{ "code":"CYT_00000", "data":{ "pageUrl":"https://…/redirect/xxx", "mock":false } }前端 location.href = data.pageUrl。工行页面三种走向(视特定要素/是否实名签/是否换开):
- 农产品收购且不需实名签 → 「订单已受理」页,返回按钮跳
payJumpUrl; - 农产品收购且需实名签 → 自动提交表单,打开支付页;
isChange=01换开 → 「换开已受理」页,返回按钮跳payJumpUrl。
省市级税务机关代码对照表(areaCode / shouldTaxLocation 取值)
areaCode(区域代码)与 shouldTaxLocation(应税行为发生地)都填这张表里的 11 位代码。 注意这套代码不等于国标行政区划代码,不能按「重庆=50」去推,必须查表。
| 代码 | 税务机关名称 |
|---|---|
11100000000 | 北京市税务局 |
11200000000 | 天津市税务局 |
11300000000 | 河北省税务局 |
11400000000 | 山西省税务局 |
11500000000 | 内蒙古自治区税务局 |
12100000000 | 辽宁省税务局 |
12102000000 | 大连市税务局 |
12200000000 | 吉林省税务局 |
12300000000 | 黑龙江省税务局 |
13100000000 | 上海市税务局 |
13200000000 | 江苏省税务局 |
13300000000 | 浙江省税务局 |
13302000000 | 宁波市税务局 |
13400000000 | 安徽省税务局 |
13500000000 | 福建省税务局 |
13502000000 | 厦门市税务局 |
13600000000 | 江西省税务局 |
13700000000 | 山东省税务局 |
13702000000 | 青岛市税务局 |
14100000000 | 河南省税务局 |
14200000000 | 湖北省税务局 |
14300000000 | 湖南省税务局 |
14400000000 | 广东省税务局 |
14403000000 | 深圳市税务局 |
14500000000 | 广西壮族自治区税务局 |
14600000000 | 海南省税务局 |
15000000000 | 重庆市税务局 |
15100000000 | 四川省税务局 |
15200000000 | 贵州省税务局 |
15300000000 | 云南省税务局 |
15400000000 | 西藏自治区税务局 |
16100000000 | 陕西省税务局 |
16200000000 | 甘肃省税务局 |
16300000000 | 青海省税务局 |
16400000000 | 宁夏回族自治区税务局 |
16500000000 | 新疆维吾尔自治区税务局 |
工行 API 平台返回码(return_code)
这是网关层的返回码,与业务是否成功是两回事——业务校验不通过时工行会在页面上给出中文提示,不走这张表。
| 返回码 | 返回说明 |
|---|---|
10100000 | 接口访问成功 |
-31 | 响应请求转换失败 |
-30 | 服务方响应状态错误 |
400011 | 参数非法。可能是 appId 为空 / appId 非法 / 签名为空 / 应用系统时间与 API 平台时间差超限 / 时间戳非法 |
500018 | 访问的 API 不存在 |
500020 | 非法调用 |
400016 | app 公钥未维护 |
400017 | 签名验证失败 |
400019 | 授权验证失败 |
500031 | 速率超限 |
500032 | 并发超限 |
-500041 | 代理异常 |
-500042 | 代理超时 |
-500044 | 网关签名失败 |
500043 | 网关配置文件错误,无法读取配置 |
400051 | appId 前缀错误。沙箱测试时 appId 必须加 sandboxie_ 前缀 |
500052 | 沙箱测试不支持 UI 类型的 API |
500091 | 没有管理权限 |
-500099 | 网关内部异常 |
工行原文特别注意:返回 -500041、-500042 或其他未知异常时,切勿重复提交, 应先调对应的查询接口确认最新状态再做处理。
两点说明
- 规格已核实到官方原文:本页「必输 / 最大长度」逐行取自工行《融e聚开票信息预下单接口V1 1.0.11》第 3、4 节规格表。此前该表缺页、只能从示例反推,现已补齐。
- 公对公结算正向开票另有一套参数:
payChannel=04时需上送invoiceNormal节点(文档 4.2~4.7 节,含商品明细、车牌号集合、建筑服务明细、旅客运输明细等嵌套结构)。透传层原样转发,本页暂未展开,需要时找我们要。
