服务端申请
# 服务端提交
## 提交待开申请(唯一识别码)
- 用户已完成订购/消费,通过合作方页面提交补开发票的请求,需填写抬头信息、邮寄地址和其他备注,而合作方需要传入开票明细内容(订单内容)
### 请求URL
- ` /openapi/invoice/application/addStayOpenApplication`
### 请求方式
- POST
### 请求参数说明
| 名称 | 类型 | 必填 | 说明 |
| ------------ | ------- | ---- | ------------------------- |
| applicationNo | String | 是 | 申请单号|
| invoicePointName | String | 否 | 指定开票点|
| applyType | Integer | 是 | 申请类型 1[待开申请(酒店行业叫后补开票)|
| titleType | Integer | 是 | 抬头类型 1[企业]、2[个人] |
| storeId | Long | 否 | 票申的门店id(合作方为酒店时必填,这种情况下,合作方的storeNo是提前维护在票申数据库的,所以能建立两方门店的对应关系) |
| storeNo | String | 否 | 合作方的门店编号(合作方为电商公司时必填) |
| invoiceType| String|是 |s 专票 c 普票 ce 电票 |
| sellerName| String | 否 | 销方名称 |
| sellerTaxNo| String | 否 | 销方税号 |
| sellerAddress| String | 否 | 销方地址 |
| sellerTel| String | 否 | 销方电话 |
| sellerBankName| String | 否 | 销方开户行名称 |
| sellerBankAccount| String | 否 | 销方开户行账号 |
| purchaserName | String | 是 | 购方名称 |
| purchaserTaxNo | String | titleType=1时必填,专票必填 | 购方税号 |
| purchaserAddress | String | 专票必填 | 购方地址 |
| purchaserTel | String | 专票必填 | 购方电话 |
| purchaserBankName | String | 专票必填 | 购方开户行名称 |
| purchaserBankAccount | String | 专票必填 | 购方开户行账号 |
| purchaserMail | String | 否 | 购方邮箱 |
| receivePhone | String | 否 | 接受开票结果(电票PDF)手机 (发票类型为电票时与购方邮箱选填其一) |
| autoDeal | Boolean | 否 | 是否系统自动开具,并推送给用户,目前只有电票(`invoiceType` = `ce`) 才支持自动开具 |
| extension| String| 否 | 自定义拓展字段,用户可以传json格式的字符串,便于进行后续的搜索等逻辑 |
|ticketHolder|String|否|开票人:只有自动开票时才会用到[但也是选填]|
|payee|String|否|收款人:只有自动开票时才会用到[但也是选填]|
|reviewer|String|否|复核人:只有自动开票时才会用到[但也是选填]。要求:开票人、收款人、复核人不能相同并且选填其一时开票人必填|
| remark | String | 否 | 发票备注 |
| orderList|List<Order>|是|订单列表|
| orderList[#].orderNo|String|否|渠道订单号|
| orderList[#].erpOrderNo|String|否|erp订单号(与渠道订单号选填其一)|
| orderList[#].orderPrice|Double|是|订单金额|
| orderList[#].items|List<Item>|是|订单商品列表|
| orderList[#].items[#].identifier |String|是|商品唯一识别编码。需提前在商户后台上维护,且保证在商户下唯一,后续无法变更。如,酒店行业约定以“ZSF0000001”作为住宿费这一商品的唯一识别码。该方式将避免重复创建相同商品,若不使用约定识别编码,可参考下方【提交待开申请(商品详情)】示例。|
| orderList[#].items[#].quantity|Double|否|数量|
| orderList[#].items[#].unitPrice|Double|否|单价(含税)|
| orderList[#].items[#].totalPrice|Double|是|总价(含税)。注:若单价、数量、均不为空,则要求:总价=单价*数量|
>w
>* 6项销方信息可以不填,默认取开票助手维护的公司数据。如果填了,则要求销方名称和税号跟维护的数据一致;其余4项做替换
>* 订单内容中的商品id(`orderList[#].items[#].id`)为双方约定好的商品唯一编码,每个商户可以用这个商品唯一编码维护独立的商品信息(税率,税收分类编码,免税标识等等),这个需要双方产品单独约定。
### 请求示例
- 待开申请(后补开票)
```json
{
"applicationNo":"test131244",
"invoicePointName":"TEST10105700144_机号1",
"storeId": 123,
"applyType": 1,
"invoiceType":"ce",
"titleType":2,
"purchaserTaxNo":"131245812547125",
"purchaserName":"姓名",
"purchaserAddress":"上海市浦东区",
"purchaserBankName":"ICBC",
"purchaserBankAccount":"12312415125",
"purchaserTel":"021-10103030",
"purchaserMail":"a@qq.com",
"receivePhone":"1308888888",
"autoDeal":false,
"extension":"{\"phone\":\"18776218762\",\"name\":\"张三\",\"roomNum\":\"702\"}",
"orderList":[
{
"orderNo":"order1223124",
"erpOrderNo":"erp1223124",
"orderPrice":24.8,
"items":[
{
"identifier":"ZSF0000001",
"quantity":2,
"unitPrice":12.4,
"totalPrice":24.8
}
]
}
]
}
```
### 返回参数说明
| 字段名 | 类型 | 说明 |
| ------------ | ------------ | ------------ |
| code | Integer | 处理结果 |
| message | String | 结果描述 |
| data | String | 处理结果 |
### 返回示例
- 成功示例
```json
{
"code":0,
}
```
- 失败示例
```json
{
"code":-1,
"message":"找不到对应商品信息",
}
```
```json
{
"code":5001,
"message":"当前无在线税盘,无法自动开票",
}
```
## 提交待开申请(商品详情)
- 用户已完成订购/消费,通过合作方页面提交补开发票的请求,需填写抬头信息、邮寄地址和其他备注,而合作方需要传入开票明细内容(订单内容)
### 请求URL
- ` /openapi/invoice/application/addStayOpenApplication`
### 请求方式
- POST
### 请求参数说明
| 名称 | 类型 | 必填 | 说明 |
| ------------ | ------- | ---- | ------------------------- |
| applicationNo | String | 是 | 申请单号|
| applyType | Integer | 是 | 申请类型 1[待开申请(酒店行业叫后补开票)|
| titleType | Integer | 是 | 抬头类型 1[企业]、2[个人] |
| storeId | Long | 否 | 票申的门店id(合作方为酒店时必填,这种情况下,合作方的storeNo是提前维护在票申数据库的,所以能建立两方门店的对应关系) |
| storeNo | String | 否 | 合作方的门店编号(合作方为电商公司时必填) |
| invoiceType| String|是 |s 专票 c 普票 ce 电票 |
| sellerName| String | 否 | 销方名称 |
| sellerTaxNo| String | 否 | 销方税号 |
| sellerAddress| String | 否 | 销方地址 |
| sellerTel| String | 否 | 销方电话 |
| sellerBankName| String | 否 | 销方开户行名称 |
| sellerBankAccount| String | 否 | 销方开户行账号 |
| purchaserTaxNo | String | titleType=1时必填,专票必填 | 购方税号 |
| purchaserName | String | 是 | 购方名称 |
| purchaserAddress | String | 专票必填 | 购方地址 |
| purchaserBankName | String | 专票必填 | 购方开户行名称 |
| purchaserBankAccount | String | 专票必填 | 购方开户行账号 |
| purchaserTel | String | 专票必填 | 购方电话 |
| purchaserMail | String | 否 | 购方邮箱 |
| receivePhone | String | 否 | 接受开票结果(电票PDF)手机 (发票类型为电票时与购方邮箱选填其一) |
| autoDeal | Boolean | 否 | 是否系统自动开具,并推送给用户,目前只有电票(`invoiceType` = `ce`) 才支持自动开具 |
|ticketHolder|String|否|开票人:只有自动开票时才会用到[但也是选填]|
|payee|String|否|收款人:只有自动开票时才会用到[但也是选填]|
|reviewer|String|否|复核人:只有自动开票时才会用到[但也是选填]。要求:开票人、收款人、复核人不能相同并且选填其一时开票人必填|
| remark | String | 否 | 发票备注 |
| orderList|List<Order>|是|订单列表|
| orderList[#].orderNo|String|否|渠道订单号|
| orderList[#].erpOrderNo|String|否|erp订单号(与渠道订单号选填其一)|
| orderList[#].orderPrice|Double|是|订单金额|
| orderList[#].items|List<Item>|是|订单商品列表|
| orderList[#].items[#].quantity|Double|否|数量|
| orderList[#].items[#].unitPrice|Double|否|单价(含税)|
| orderList[#].items[#].totalPrice|Double|是|总价(含税)。注:若单价、数量、均不为空,则要求:总价=单价*数量|
| orderList[#].items[#].itemNo |String|否|商品编号|
| orderList[#].items[#].name|String|是|商品名称,不能超过47个汉字或94个字符|
| orderList[#].items[#].unit|String|否|单位。只能包括中英文字和数字|
| orderList[#].items[#].specification |String|否|规格型号。只能包括中英文字和数字|
| orderList[#].items[#].taxTypeNo |String|是|税收分类编码|
| orderList[#].items[#].taxRate |String|是|税率,只能为0、3、5、6、9、10、13、16|
| orderList[#].items[#].discountIdentification |Integer|否|使用优惠政策|
| orderList[#].items[#].discountContent |String|否|优惠政策内容|
| orderList[#].items[#].taxFlag |Integer|否|零税率标识|
#### 注意
* 根据传入的商品详情创建商品,创建时商品唯一识别码 = 商品名称_后缀编号。
|使用优惠政策|零税率标识|优惠政策内容|
|--|--|--|
|1=有优惠政策|(空内容)=正常税率| 不征税|
|2=无优惠政策 |1=出口免税和其他免税优惠政策| 免税|
||2=不征增值税 | 先征后退|
||3=普通零税率 | 50%先征后退|
|| | 100%先征后退 |
|| | 简易征收|
|| | 按3%简易征收|
|| | 按5%简易征收|
|| | 即征即退30%|
|| | 即征即退50%|
|| | 即征即退70%|
|| | 即征即退100%|
|| | 稀土产品|
|| | 超税负3%及征即退|
|| | 超税负8%及征即退|
|| | 超税负12%及征即退|
### 请求示例
- 待开申请(后补开票)
```json
{
"applicationNo":"test131244",
"storeId":123,
"applyType":1,
"invoiceType":"c",
"titleType":2,
"purchaserTaxNo":"131245812547125",
"purchaserName":"姓名",
"purchaserAddress":"上海市浦东区",
"purchaserBankName":"ICBC",
"purchaserBankAccount":"12312415125",
"purchaserTel":"021-10103030",
"purchaserMail":"a@qq.com",
"receivePhone":"1308888888",
"orderList":[
{
"orderNo":"order1223124",
"erpOrderNo":"erp1223124",
"orderPrice":24.8,
"items":[
{
"quantity":2,
"unitPrice":12.4,
"totalPrice":24.8,
"itemNo":"TEST00001",
"name":"住宿费",
"unit":"天",
"specification":"酒店",
"taxTypeNo":"TEST2019",
"taxRate":"0"
}
]
}
]
}
```
### 返回参数说明
| 字段名 | 类型 | 说明 |
| ------------ | ------------ | ------------ |
| code | Integer | 处理结果 |
| message | String | 结果描述 |
| data | String | 处理结果 |
### 返回示例
- 成功示例
```json
{
"code":0,
}
```
- 失败示例
```json
{
"code":-1,
"message":"税收分类编码错误",
}
```
```json
{
"code":5001,
"message":"当前无在线税盘,无法自动开票",
}
```
## 提交待开申请(使用商家默认商品)
* 常用于POS、动态小票码场景;商户开票明细相对固定。
* 默认只有一个订单,订单金额即为开票金额。
* 自动获取商户注册时蛇者的默认商品作为开票科目,仅允许使用一个默认商品。
* 获取自动开票配置,如果当前公司有电票资质并且已设置自动开票则提交抬头后会自动开票 (仅申请类型为电票时可自动开具)。
### 请求路径
`/openapi/invoice/submitByPos`
### 请求方法:
`POST`
### 接口参数:
|字段名|类型|必填|说明|
| ------------ | ------------ | ------------ |------------ |
|orderNo|String|是|订单号|
|orderPrice|Double|是|订单金额|
|effectiveDay|Integer|否|有效天数(默认不过期)|
注意:此接口的认证方式需要使用accessKey和accessSecret进行认证,其中:
accessKey:parterStoreNo(即POS终端编号)
accessSecret:activeCode(即POS终端正在使用的激活码)
### 请求参数示例:
```json
{
"orderNo":"order123123",
"orderPrice":12112.23,
"effectiveDay":30
}
```
### 响应结果:
| 字段名 | 类型 | 说明 |
| ------------ | ------------ | ------------ |
|code|Integer|处理结果|
|message|String|结果描述|
|data|Object|提交结果响应|
### 结果示例:
失败:
```json
{
"code": 4002,
"message": "门店不存在"
}
```
成功:
```json
{
"code": 0,
"data": "https://h5.yipiaoyun.cn/blank?id=102046&p=1&an=20190604170000"
}
```
----
## 提交预约申请
- 说明:需搭配订单系统使用,补充预约开票的实际结账详情
- 用户在合作方订购/消费时可提前预约发票,预约的开票请求将展示给商户,在开具前,用户均可在合作方进行预约撤销
### 请求URL
- ` /openapi/invoice/application/addSubscribeApplication`
### 请求方式
- POST
### 请求参数说明
| 名称| 类型| 必填| 说明|
| --- | --- | --- | --- |
| applicationNo | String | 是 | 申请单号|
| applyType | Integer | 是 | 2[预约开票] |
| titleType | Integer | 是 | 抬头类型 1[企业]、2[个人] |
| storeId | Long | 否 | 平台的门店id(合作方为酒店时必填,这种情况下,合作方的storeNo是提前维护在平台数据库的,所以能建立两方门店的对应关系)
| storeNo | String | 否 | 合作方的门店编号(合作方为电商公司时必填) |
| invoiceType| String|是 |s 专票 c 普票 ce 电票 |
| purchaserTaxNo | String | 专票必填 | 购方税号 |
| purchaserName | String | 是 | 购方名称 |
| purchaserAddress | String | 专票必填 | 购方地址 |
| purchaserBankName | String | 专票必填 | 购方开户行名称 |
| purchaserBankAccount | String | 专票必填 | 购方开户行账号 |
| purchaserTel | String | 专票必填 | 购方电话 |
| purchaserMail | String | 否 | 购方邮箱 |
| receivePhone | String | 否 | 接受开票结果(电票PDF)手机 (发票类型为电票时与购方邮箱选填其一) |
| remark | String | 否 | 发票备注 |
| invoiceDate|String|是|取票日期,格式为 `"2018-09-26 18:16:00"` |
| contactName|String|否|开票联系人|
| orderList|Array<订单详情>|是|订单列表|
| orderList[#].orderNo|String|否|渠道订单号|
| orderList[#].erpOrderNo|String|否|erp订单号(与渠道订单号选填其一)|
### 请求示例
```json
{
"purchaserMail":"371522043@qq.com",
"applicationNo":"xuan123456789",
"purchaserAddress":"上海市浦东区9",
"purchaserBankAccount":"622273638889201",
"invoiceDate":"2018-09-10 00:00:00",
"receivePhone":"13599472638",
"remark":"测试",
"storeId":101796,
"purchaserName":"天问",
"purchaserTaxNo":"131245812547125",
"invoiceType":"ce",
"contactName":"天问",
"purchaserTel":"18700000000",
"titleType":1,
"applyType":2,
"purchaserBankName":"中国银行延平路支行",
"orderList":[
{
"orderNo":"3020261779",
"erpOrderNo":"erp1232322"
}
]
}
```
### 返回参数说明
| 字段名 | 类型 | 说明 |
| ------------ | ------------ | ------------ |
| code | Integer | 处理结果 |
| message | String | 结果描述 |
| data | boolean | 客户是否提交抬头 |
### 返回示例
- 成功示例
```json
{
"code": 0,
"data": true
}
```
- 失败示例
```json
{
"code": -1,
"message": "申请单号重复!",
}
```