接口说明
1.先调用“商旅订单”接口,获取订单id、票id
2.按选择的订单id或票id,调用“商旅按行程开票”接口,发起开票申请,接口会返回开票申请批id(batch_id)
3.根据申请批id(batch_id)定时调用“发票查询”接口,可查询开票申请的状态
4.根据申请批id(batch_id)调用“电子发票下载”接口,下载发票文件zip包
5.根据申请批id(batch_id)调用“电子发票信息查询”接口,查询发票结构化数据(不含电子行程单)
-
开票规则:只有商旅品类且未开票(is_invoice=0)的订单才可以开票
-
参数限制:
- 普票:invoice_type=4, invoice_title为发票抬头,必填;
- 专票:invoice_type=5, invoice_qid为开票资质ID,必填,并且必须为专票资质列表api返回结果中的资质ID
流程:
基本信息
HTTP URL |
/river/Invoice/applybiz |
---|---|
HTTP Method |
JSON |
权限要求 |
|
请求头
参数名称 |
参数值 |
---|---|
Content-Type |
application/json |
请求参数
字段名 |
字段说明 |
字段类型 |
必填 |
备注 |
---|---|---|---|---|
client_id |
申请应用时分配的AppKey |
string |
Y |
申请应用时分配的AppKey |
access_token |
授权后的access token |
string |
Y |
授权后的access token |
timestamp |
当前时间戳 |
bigint |
Y |
当前时间戳 |
sign |
签名 |
string |
Y |
签名 |
company_id |
公司id |
Long |
Y |
公司id |
sub_business_type |
商旅品类开票子品类 |
int |
Y |
商旅品类开票子品类 |
pay_type |
订单类型 |
int |
Y |
订单类型 |
invoice_no |
开票请求编号 |
string |
Y |
开票请求编号(客户接入方唯一标识) |
remark |
备注 |
string |
N |
备注(长度<=100) |
receiver_email |
开票收件邮箱 |
string |
Y |
开票收件邮箱 |
invoice_info |
invoice_info |
string |
Y |
开票信息(可多个 上限500笔订单或票id),json格式 |
invoice_info
字段名 |
字段说明 |
字段类型 |
必填 |
备注 |
---|---|---|---|---|
order_ids |
酒店订单集合 |
string |
no |
|
ticket_ids |
机票票id 集合 |
string |
no |
机票子品类时必填 |
invoice_type |
发票类型 |
int |
no |
发票类型 (4 数电普票, 5 数电专票),默认专票 |
invoice_title |
发票抬头 |
string |
no |
发票抬头(数电普票时必填,专票时不会使用) |
invoice_qid |
资质id( |
Long |
no |
资质id(数电专票时必填,普票时不会使用) |
is_merge |
发票是否聚合开具 |
Int |
no |
是否聚合开票(相同费项聚合开一张发票,默认“是” ; 这里的合并是:相同开票主体、相同发票类型下 本次申请的订单 或 票id 下相同费项合并开票(机票行程单火车票票根费项除外) |
请求示例
curl -X POST --location "https://api.es.xiaojukeji.com/river/invoice/applybiz" -H "Content-Type: application/json" -d '{"access_token": "a2dbeb9d64573f61427b9003cf646747ef534cd8","invoice_info": "[{\"order_ids\":"1111111111111,1111111111112,1111111111113",\"ticket_ids\":"",\"invoice_type\":4,\"invoice_title\":\"普票抬头 \",\"invoice_qid\":2222111}]","company_id": "xxxxxxxxxx","receiver_email": "xxxxx@xxxxx.com","invoice_no": "aaaaaddddd","sign": "f8b206b0a81e084a3206429c66b7e521","pay_type": 0,"remark": "测试数据","sub_business_type": 201,"client_id": "8c284774bad6368160c489667813f0f7a","sign_key": "fbba07E606f359AC1981","timestamp": "1730448237218"}'
字段名 |
字段说明 |
字段类型 |
备注 |
---|---|---|---|
errno |
错误码 |
string |
0表示成功,非0表示失败 |
errmsg |
错误信息 |
string |
errno=0时为常量"SUCCESS",errno!=0时为错误信息 |
data |
返回数据 |
object |
返回数据 |
data.batch_id |
开票批次id |
|
|
data.status |
申请开票状态 |
int |
该批次申请开票状态,非0时,result有值 |
data.result |
失败明细 |
list |
失败明细合计, 实际开票是以最细粒度去开票的 :酒店是订单, 机票火车票是票; |
data数据格式
字段名 |
字段说明 |
字段类型 |
备注 |
---|---|---|---|
batch_id |
开票批次id |
string |
|
- 多笔订单开票时,相同开票信息的相同开票品类的多个相同开票费项会合并开票,且这些订单会在一个批次里开票,故返回开票申请的批次id
- is_merge 聚合开票的含义是整体开票申请下相同开票抬头相同发票类型相同开票费项聚合开大票,同样机票行程单,火车票票根除外
响应示例
正常示例
{
"errno":0,
"errmsg":"success",
"data":{
"batch_id":11112333322244444
}
}
全部失败示例
// 全部失败示例
{
"errno": 0,
"errmsg": "SUCCESS",
"data": {
"status": 2,
"result": [
{
"message": "未查询到可开票的数据"
}
],
"batch_id": null
}
}
部分失败示例
{
"errno": 0,
"errmsg": "SUCCESS",
"data": {
"status": 1,
"result": [
{
"order_id": 4503547744,
"message": "此订单id没有可开票数据,无法开票,请仔细检查,如有疑问,请联系管理员"
}
],
"batch_id": 1125968374853271
}
}
错误码
错误码 |
错误说明 |
---|---|
50103(该流水号已经开过票了) |
invoice_no不能重复,本次传参中的invoice_no已经被使用过,请换一个 |
版本记录
日期 |
更新人 |
更新内容 |
上线时间 |
---|---|---|---|
2024.11.04 |
陈继诗 |
迁移文档 |
2024.11.20 |
2024.11.20 |
陈继诗 |
迁移文档,修改请求地址为https://api.es.xiaojukeji.com/river/Invoice/applybiz |
2024.11.20 |
2024.12.03 |
陈继诗 |
迁移文档,修改invoice_info为string类型 |
2024.12.03 |
2025.06.20 |
关珺丹 |
更新开票接口字段信息 |
2025.06.13 |