1. 接口信息
1.1. 调用地址
https://fapiao.glority.cn/v1/item/get_item_info
1.2. 请求方式
GET/POST
1.3. 返回类型
JSON
2. 请求参数
名称 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
Key | app_key | true | String(32) | c5ed72329fece2fe0010a437505b01cb | 分配的key |
令牌 | token | true | String(32) | 7007bd1257dce8d47489166a7c77a926 | 授权令牌 |
时间戳 | timestamp | true | String(32) | 1522374165 | timestamp 为January 1 1970 00:00:00 GMT 到现在的秒数 |
图片链接 | image_url | false | String | http://t.cn/EbhjOOq | 图片链接地址 |
图片文件 | image_file | false | Binary | 图片文件或Ofd文件 | |
图片Base64数据 | image_data | false | String | 图片Base64数据 | |
识别类型 | type | false | int | 0 | 要识别的发票类型: 0: 自动识别(默认值) 1: 增值税发票(大票) 2: 出租车,火车票, 机打发票, 增值税卷票(小票-自动识别) |
2.1. 请求说明
- 支持的图片类型: jpg, jpeg, png及pdf. 图片最大支持8M.
- 建议分辨率过大的可以进行压缩(查看压缩示例代码)
- token 的值计算方式为:
md5($appkey+$timestamp+$appSecret)
token=md5("c5ed72329fece2fe0010a437505b01cb+1522374165+5c9597f3c8245907ea71a89d9d39d08e")=7007bd1257dce8d47489166a7c77a926
- API请求示例:
https://fapiao.glority.cn/v1/item/get_item_info?app_key=c5ed72329fece2fe0010a437505b01cb×tamp=1522374165&token=7007bd1257dce8d47489166a7c77a926&image_url=http://t.cn/EbhjOOq
- 生成token时,字符串连接中的“+”是必需的,缺少这个符号会无法验证通过验证
3. 返回值
3.1. 正确返回参数
名称 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
返回状态码 | result | true | int | 0或1 | 请求状态. 1:成功, 0:失败 |
回复 | response | true | json |
3.2. 正确返回样例
{
'result': 1,
'response': {
'data': {
'version': '4.8_20180226',
'result': 1,
'timestamp': 1092098766,
'message': 'success',
'id': 'a744aa6929b97355430ab6b5ee831854',//识别结果标识id,用于结果反馈
'sha1': '00a09af73198ab3ea81a6b58ba6a1f5879f47c63',//识别图片唯一标识
'time_cost': '1000',//识别花费的时长,单位毫秒
'identify_results': [
{
'type': '10101', -- 发票类型
'orientation': 90, -- 发票顺时针旋转方向
'image_size': [1024,768], -- 图片分辨率
'page': 0, -- 页码
'details': { // 发票识别的具体信息, 不同发票类型会不一样
//增值税(专用/普通)发票
'code': '6300161320', -- 印刷发票代码
'number': '15064112', -- 印刷发票号码
'code_confirm': '6300161320', -- 机打发票代码
'number_confirm': '15064112', -- 机打发票号码
'date': '2017年03月28日', -- 开票日期
'pretax_amount': '2648.54', -- 税前金额
'total': '3098.79', -- 价税合计(小写)
"total_cn":"壹佰圆整", --价税合计(大写)
'tax': '450.25', -- 税额
'check_code': '52657910788452871589' -- 校验码
'machine_code': '499924850051', -- 机器编号
'seller': 'XXXXXX有限公司', -- 销售方名称
'seller_tax_id': '15260000000000000G', -- 销售方纳税人识别号
'seller_addr_tel': 'XX市XX区XX街道XX号 1234567890', --销售方地址、账号
'seller_bank_account':'1234567890', --销售方银行账号
'buyer': 'XXXXXX有限公司', -- 购买方方名称
'buyer_tax_id': '11684616000000000D', -- 购买方纳税人识别号
'buyer_bank_account':'12345678910', --购买方银行账号
'buyer_addr_tel':'XX市XX区XX街道XX号 1234567890', --购买方地址、账号
'company_seal': '1', -- 是否有公司印章(0: 没有; 1: 有)
'company_seal_mark': '1', -- 是否有 '销售方(章)' 标记(0: 没有; 1: 有)
'form_type': '第二联', -- 发票是第几联
'form_name': '发票联', -- 发票联次
'kind': '餐饮', -- 发票消费类型
'ciphertext': '<42/93+*/+2*+81*851<9,940-<9*>5+2-91,<1+>7*<81>7/8*140,50<\/<62-<1491+6+9', -- 密码区,四行密码,每行以逗号隔开
'travel_tax': '65.50', -- 车船税
'receiptor': 'xxx', -- 收款人
'reviewer': 'xxx', -- 复核
'issuer': 'xxx', -- 开票人
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'service_name': '餐饮服务', -- 服务类型
'remark': '账期:201702, 号码:185750654', --备注
'item_names': '*餐饮服务*餐饮服务,*酒*白酒', --品名,每个以逗号隔开
'agent_mark': '1', -- 是否代开
'acquisition_mark': '1', -- 是否收购
'block_chain': '1', -- 区块链标记
'electronic_mark': '1', --是否为电子增票
'transit_mark': '1', -- 通行费标志
'oil_mark': '1', -- 成品油标志
'vehicle_mark': '1', -- 机动车标志
'title':'XX省增值税XX发票' --标题
'items':[
{
"name": "*保险服务*保费", --货物或应税劳务、服务名称
"specification": "1", --规格型号
"unit": "单", --单位
"quantity": "1", --数量
"price": "1066.04", --单价
"total": "1066.04", --金额
"tax_rate": "6%", --税率
"tax": "63.96" --税额
}
]
//增值税电子专用发票
"code": "12345678910", -- 发票代码
"number": "00000001", -- 发票号码
"date": "2020年09月01日", -- 开票日期
"pretax_amount": "86797.75", -- 税前金额
"tax": "11283.71", -- 税额
"check_code": "12345123451234512345", --校验码
"total": "98081.46", -- 总金额
"kind": "其他", -- 消费类型
"ciphertext": "00945*1<0-3>2*62377>93158<5<\n<4024141+0091580+/30920879<8\n4+3-*<3><21/723494/+/+01+225\n0*6220933>43/501+<>71+>>><7/\n", -- 密码区,每行以\n隔开
"machine_code": "667900296527", --机器编号
'receiptor': 'xxx', -- 收款人
'reviewer': 'xxx', -- 复核
'issuer': 'xxx', -- 开票人
"item_names": "*纺织产品*200g/m2 100%羊毛1*1罗纹", --品名,每个以逗号隔开
'seller': 'XXXXXX有限公司', -- 销售方名称
'seller_tax_id': '15260000000000000G', -- 销售方纳税人识别号
'seller_addr_tel': 'XX市XX区XX街道XX号 1234567890', --销售方地址、账号
'seller_bank_account':'1234567890', --销售方银行账号
'buyer': 'XXXXXX有限公司', -- 购买方方名称
'buyer_tax_id': '11684616000000000D', -- 购买方纳税人识别号
'buyer_bank_account':'12345678910', --购买方银行账号
'buyer_addr_tel':'XX市XX区XX街道XX号 1234567890', --购买方地址、账号
'company_seal_mark': '1', -- 是否有 '销售方(章)' 标记(0: 没有; 1: 有)
"electronic_mark": "1"
'items':[
{
"name": "*保险服务*保费", --货物或应税劳务、服务名称
"specification": "1", --规格型号
"unit": "单", --单位
"quantity": "1", --数量
"price": "1066.04", --单价
"total": "1066.04", --金额
"tax_rate": "6%", --税率
"tax": "63.96" --税额
}
]
//增值税电子普通发票
'code': '6300161320', -- 发票代码
'number': '15064112', -- 发票号码
'date': '2017年03月28日', -- 开票日期
'pretax_amount': '2648.54', -- 税前金额
'total': '3098.79', -- 价税合计(小写)
"total_cn":"壹佰圆整", --价税合计(大写)
'tax': '450.25', -- 税额
'check_code': '52657910788452871589' -- 校验码
'machine_code': '499924850051', -- 机器编号
'seller': 'XXXXXX有限公司', -- 销售方名称
'seller_tax_id': '15260000000000000G', -- 销售方纳税人识别号
'seller_addr_tel': 'XX市XX区XX街道XX号 1234567890', --销售方地址、账号
'seller_bank_account':'1234567890', --销售方银行账号
'buyer': 'XXXXXX有限公司', -- 购买方方名称
'buyer_tax_id': '11684616000000000D', -- 购买方纳税人识别号
'buyer_bank_account':'12345678910', --购买方银行账号
'buyer_addr_tel':'XX市XX区XX街道XX号 1234567890', --购买方地址、账号
'company_seal': '1', -- 是否有公司印章(0: 没有; 1: 有)
'company_seal_mark': '1', -- 是否有 '销售方(章)' 标记(0: 没有; 1: 有)
'kind': '餐饮', -- 发票消费类型
'ciphertext': '<42/93+*/+2*+81*851<9,940-<9*>5+2-91,<1+>7*<81>7/8*140,50<\/<62-<1491+6+9', -- 密码区,四行密码,每行以逗号隔开
'travel_tax': '65.50', -- 车船税
'receiptor': 'xxx', -- 收款人
'reviewer': 'xxx', -- 复核
'issuer': 'xxx', -- 开票人
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'service_name': '餐饮服务', -- 服务类型
'remark': '账期:201702, 号码:185750654', --备注
'item_names': '*餐饮服务*餐饮服务,*酒*白酒', --品名,每个以逗号隔开
'agent_mark': '1', -- 是否代开
'acquisition_mark': '1', -- 是否收购
'block_chain': '1', -- 区块链标记
'electronic_mark': '1', --是否为电子增票
'transit_mark': '1', -- 通行费标志
'oil_mark': '1', -- 成品油标志
'vehicle_mark': '1', -- 机动车标志
'title':'XX省增值税xx发票' --标题
'items':[
{
"name": "*保险服务*保费", --货物或应税劳务、服务名称
"specification": "1", --规格型号
"unit": "单", --单位
"quantity": "1", --数量
"price": "1066.04", --单价
"total": "1066.04", --金额
"tax_rate": "6%", --税率
"tax": "63.96" --税额
}
]
//区块链电子发票
'code': '6300161320', -- 发票代码
'number': '15064112', -- 发票号码
'date': '2017年03月28日', -- 开票日期
'pretax_amount': '2648.54', -- 税前金额
'total': '3098.79', -- 价税合计(小写)
"total_cn":"壹佰圆整", --价税合计(大写)
'tax': '450.25', -- 税额
'check_code': '52657' -- 校验码
'seller': 'XXXXXX有限公司', -- 销售方名称
'seller_tax_id': '15260000000000000G', -- 销售方纳税人识别号
'seller_addr_tel': 'XX市XX区XX街道XX号 1234567890', --销售方地址、账号
'seller_bank_account':'1234567890', --销售方银行账号
'buyer': 'XXXXXX有限公司', -- 购买方方名称
'buyer_tax_id': '11684616000000000D', -- 购买方纳税人识别号
'buyer_bank_account':'12345678910', --购买方银行账号
'buyer_addr_tel':'XX市XX区XX街道XX号 1234567890', --购买方地址、账号
'company_seal': '1', -- 是否有公司印章(0: 没有; 1: 有)
'company_seal_mark': '1', -- 是否有 '销售方(章)' 标记(0: 没有; 1: 有)
'kind': '餐饮', -- 发票消费类型
'ciphertext': '<42/93+*/+2*+81*851<9,940-<9*>5+2-91,<1+>7*<81>7/8*140,50<\/<62-<1491+6+9', -- 密码区,三行密码,每行以逗号隔开
'receiptor': 'xxx', -- 收款人
'reviewer': 'xxx', -- 复核
'issuer': 'xxx', -- 开票人
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'service_name': '餐饮服务', -- 服务类型
'remark': '账期:201702, 号码:185750654', --备注
'item_names': '*餐饮服务*餐饮服务,*酒*白酒', --品名,每个以逗号隔开
'block_chain': '1', -- 区块链标记
'title':'XX省增值税xx发票' --标题
'items':[
{
"name": "*保险服务*保费", --货物或应税劳务、服务名称
"specification": "1", --规格型号
"unit": "单", --单位
"quantity": "1", --数量
"price": "1066.04", --单价
"total": "1066.04", --金额
"tax_rate": "6%", --税率
"tax": "63.96" --税额
}
]
//收费公路通行费增值税电子普通发票
'code': '6300161320', -- 发票代码
'number': '15064112', -- 发票号码
'date': '2017年03月28日', -- 开票日期
'pretax_amount': '2648.54', -- 税前金额
'total': '3098.79', -- 价税合计(小写)
"total_cn":"壹佰圆整", --价税合计(大写)
'tax': '450.25', -- 税额
'check_code': '15512212271381098068' -- 校验码
'seller': 'XXXXXX有限公司', -- 销售方名称
'seller_tax_id': '15260000000000000G', -- 销售方纳税人识别号
'seller_addr_tel': 'XX市XX区XX街道XX号 1234567890', --销售方地址、账号
'seller_bank_account':'1234567890', --销售方银行账号
'buyer': 'XXXXXX有限公司', -- 购买方方名称
'buyer_tax_id': '11684616000000000D', -- 购买方纳税人识别号
'buyer_bank_account':'12345678910', --购买方银行账号
'buyer_addr_tel':'XX市XX区XX街道XX号 1234567890', --购买方地址、账号
'company_seal': '1', -- 是否有公司印章(0: 没有; 1: 有)
'company_seal_mark': '1', -- 是否有 '销售方(章)' 标记(0: 没有; 1: 有)
'kind': '餐饮', -- 发票消费类型
'ciphertext': '<42/93+*/+2*+81*851<9,940-<9*>5+2-91,<1+>7*<81>7/8*140,50<\/<62-<1491+6+9', -- 密码区,三行密码,每行以逗号隔开
'transit_mark': '1', -- 通行费标志
'receiptor': 'xxx', -- 收款人
'reviewer': 'xxx', -- 复核
'issuer': 'xxx', -- 开票人
'province': '浙江省', -- 省
'city': '杭州市', -- 市
"service_name": "经营租赁", -- 服务类型
'remark': '账期:201702, 号码:185750654', --备注
"item_names": "*经营租赁*通行费", --品名,每个以逗号隔开
'title':'XX省增值税xx发票' --标题
"items": [
{
"name": "*经营租赁*通行费", --项目名称
"total": "21.21", --金额
"tax_rate": "3%", --税率
"tax": "0.64", --税额
"license_plate": "XXXXX", --车牌号
"vehicle_type": "客车", --类型
"start_date": "20200702", --通行日期起
"end_date": "20200702" --通行日期止
}
]
//出租车
'code': '133011680478', -- 发票代码
'number': '01670989', -- 发票号码
'date': '2017年08月29日', -- 乘车日期
'time_geton': '12:47', -- 上车时间
'time_getoff': '12:52', -- 下车时间
'mileage': '1.9', -- 里程
'total': '11.00', -- 总金额
'place': '浙江省杭州市', -- 发票所在地
'kind': '交通', -- 发票消费类型
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'license_plate': '浙A88888', -- 车牌号
//火车票
'number': 'Z125C004574', -- 号码
'date': '2017年11月21日', -- 乘车日期
'time': '21:53', -- 乘车时间
'name': '张三', -- 乘车人姓名
'station_geton': '杭州东', -- 上车车站
'station_getoff': '金华', -- 下车车站
'train_number': 'G7383', -- 车次
'seat': '二等座', -- 座位类型
'total': '74.00', -- 总金额
'kind': '交通', -- 发票消费类型
'serial_number': '34682301830312L063003', -- 序列号
'user_id': '12345678910111213', -- 身份证号
'gate_number': '6A', -- 检票口
'seat_number': '06车无座', -- 座位号
'pick_up_address': '无锡售' -- 取票地址
//机打发票
'code': '6300161320', -- 发票代码
'number': '15064112', -- 号码
'date': '2017年11月21日', -- 日期
'time': '12:22:22', -- 时间
'check_code': '52657910788452000000', -- 校验码
'category': 'oil', -- 种类,oil 表示是加油票
'pretax_amount' : '74.00', -- 税前金额
'total': '74.00', -- 总金额
'total_cn': '柒拾肆元整' --大写合计金额
'seller': 'XXXXXX有限公司', -- 销售方名称
'seller_tax_id': '15260000000000000G', -- 销售方纳税人识别号
'buyer': 'XXXXXX有限公司', -- 购买方方名称
'buyer_tax_id': '11684616000000000D', -- 购买方纳税人识别号
'kind': '服务', -- 发票消费类型
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'seller_addr_tel': 'XX市XX区XX街道XX号 1234567890', --销售方地址、账号
'seller_bank_account':'1234567890', --销售方银行账号
'buyer_bank_account':'12345678910', --购买方银行账号
'buyer_addr_tel':'XX市XX区XX街道XX号 1234567890', --购买方地址、账号
'company_seal': '1', -- 是否有公司印章(0:没有; 1: 有)
'electronic_mark': '1', -- 是否为浙江/广东通用机打电子发票
'title':'XX机打发票' --标题
'items':[
{
"name": "*其他金属制品*干冰桶", --货物或应税劳务、服务名称
"unit": "台", --单位
"quantity": "1", --数量
"total": "174.26", --金额
"tax_rate": "0.01", --税率
"price": "238.00", --单价
"tax": "1.74" --税额
}
]
//增值税普通发票 卷票
'code': '6300161320', -- 发票代码
'number': '15064112', -- 发票号码
'code_confirm': '6300161320', -- 机打代码
'number_confirm': '15064112' -- 机打号码
'date': '2017年11月21日', -- 开票日期
'check_code': '52657910788452871589' -- 校验码
'seller': 'XXXXXX有限公司', -- 销售方名称
'seller_tax_id': '15260000000000000G', -- 销售方纳税人识别号
'buyer': 'XXXXXX有限公司', -- 购买方方名称
'buyer_tax_id': '11684616000000000D', -- 购买方纳税人识别号
'category': 'oil', -- 种类,oil 表示是加油票
'total': '74.00', -- 总金额
'kind': '服务', -- 发票消费类型
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'company_seal': '1', -- 是否有公司印章(0:没有; 1: 有)
'service_name': '汽油', -- 服务类型
'item_names': '*95#汽油', --品名,每个以逗号隔开
'title':'XX增值税普通发票(卷票)' --标题
'items': [
{
'name': '*汽油*95号汽油(VIA)', --项目
'quantity': '40.99', --数量
'price': '7.32', --单价
'total': '300.00' --金额
}
]
//定额发票
'code': '6300161320', -- 发票代码
'number': '15064112', -- 号码
'total': '74.00', -- 总金额
'kind': '交通', -- 发票消费类型
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'company_seal': '1', -- 是否有公司印章(0:没有; 1: 有)
'title': 'XX定额发票' --标题
//过路费
'code': '6300161320', -- 发票代码
'number': '15064112', -- 发票号码
'date': '2018年01月10日', -- 日期
'time': '12:14', -- 时间
'entrance': '4001', -- 入口
'exit': '6754', -- 出口
'total': '74.00', -- 总金额
'kind': '交通', -- 发票消费类型
'highway_flag': '1', -- 高速标志(0:没有; 1: 有)
'title': '通行费发票' --标题
//客运汽车
'code': '6300161320', -- 发票代码
'number': '15064112', -- 发票号码
'date': '2018年01月10日', -- 日期
'time': '12:14', -- 时间
'station_geton': '杭州', -- 出发车站
'station_getoff': '金华', -- 达到车站
'total': '74.00', -- 总金额
'name': '张三', -- 姓名
'kind': '交通', -- 发票消费类型
'user_id': '256548545211254523', -- 身份证号
'title': '客运汽车票' --标题
// 航空运输电子客票行程单
'user_name': '张三', -- 乘机人姓名
'user_id':'256548545211254523', -- 身份证号
'number': '1506498784112', -- 电子客票号码
'check_code': '2345', -- 验证码
'date': '2018年04月04日', -- 填开日期
'agentcode': 'XMN098,0987677', -- 销售单位代号
'issue_by': '上海华城西南国际旅行社有限公司', -- 填开单位
'fare': '730.00', -- 票价
'tax': '10.00', -- 税费
'fuel_surcharge': '10.00', -- 燃油附加费
'caac_development_fund': '50.00', -- 民航发展基金
'insurance': '10.00', -- 保险费
'total': '800.00', -- 总额
'flights': [ -- 航班信息
{
'from':'上海', -- 出发站
'to':'北京', -- 到达站
'class_name': '经济舱' -- 舱位等级
'flight_number':'GS7563', -- 航班号
'date':'2018年02月20日', -- 乘机日期
'time':'12:34', -- 乘机时间
'seat':'N', -- 座位等级
'carrier':'南航', -- 承运人
'allow':'20K', --免费行李
'fare_basis': 'R', --客票级别
'not_valid_before': '2020年03月07日', --客票生效日期
'not_valid_after': '2020年03月07日' --有效截至日期
},
{
'from':'北京', -- 出发站
'to':'伦敦', -- 到达站
'class_name': '经济舱' -- 舱位等级
'flight_number':'QR890', -- 航班号
'date':'2018年02月21日', -- 乘机日期
'time':'15:06', -- 乘机时间
'seat':'S', -- 座位等级
'carrier':'南航', -- 承运人
'allow':'20K', --免费行李
'fare_basis': 'R', --客票级别
'not_valid_before': '2020年03月07日', --客票生效日期
'not_valid_after': '2020年03月07日' --有效截至日期
}
],
'kind': '交通', --发票消费类型
'international_flag': '国内(D)', -- 国内国际标签
'print_number': '30925566965', -- 印刷序号
'endorsement': 'TOUR', --签注
'title': '航空运输电子客票行程单' --标题
//二手车销售统一发票
'code': '6300161320', -- 发票代码
'number': '15064112', -- 发票号码
'date': '2017年03月28日', -- 开票日期
'total': '100000.00', -- 总金额
'seller': 'XXXXXX有限公司', -- 卖方单位/个人
'seller_id': '330517489552522146', -- 卖方单位代码/个人身份证号
'seller_address': 'XX市XX区XX街道', --卖方单位/个人住址
'buyer': 'XXXXXX有限公司', -- 买方单位/个人
'buyer_id': '350822221211525564', -- 买方单位代码/个人身份证号
'buyer_address':'XX市XX区XX街道', --买方单位/个人住址
'company_name': 'xxx二手车交易管理有限公司', -- 二手车市场
'company_tax_id': '15260000000000000G', -- 二手车市场纳税人识别号
'company_bank_account': 'XX银行XX支行1234567890' --二手车市场开户银行、账号
'company_phone': '1234567890' --二手车市场电话
'company_address': 'XX市XX区XX街道' --二手车市场地址
'license_plate': '浙A88888', -- 车牌号
'registration_number': '320027731473', -- 登记证号
'car_code': 'LVSHKAML8FG461612', -- 车架号/车辆识别代码
'car_model': '丰田牌CAF7150N4', -- 厂牌型号
'kind': '用车', -- 发票消费类型
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'title': '二手车销售统一发票' --标题
'company_seal': '1', -- 是否有公司印章(0: 没有; 1: 有)
'machine_id': '123456789', --机器编号
'form_type': '第二联', -- 发票是第几联
'form_name': '发票联', -- 发票联次
//机动车销售统一发票
'code': '6300161320', -- 发票代码
'number': '15064112', -- 发票号码
'machine_code': '123001221606', -- 机打代码
'machine_number': '00213744', -- 机打号码
'date': '2017年03月28日', -- 开票日期
'pretax_amount': '930000.00', -- 税前金额
'total': '1000000.00', -- 总金额
'seller': 'XXXXXX有限公司', -- 销售单位
'seller_tax_id': '330517489552522146', -- 销货单位纳税人识别号
'address': 'XX市XX区XX街道', -- 销货单位地址
'phone': '1234567890' --销货单位电话
'account': '1234567890' --销货单位账号
'buyer': 'XXXXXX有限公司', -- 买方单位/个人
'buyer_id': '350822221211525564', -- 买方单位代码/个人身份证号
'tax_authorities': 'xxx市国家税务局xx分局', -- 主管税务机关
'tax_authorities_code': '144030613', -- 主管税务机关代码
'car_code': 'LVSHKAML8FG461612', -- 车架号/车辆识别代码
'car_engine_code': 'Q035277', -- 发动机号码
'car_model': '丰田牌CAF7150N4', -- 厂牌型号
'certificate_number': 'YE80X1001351257', -- 合格证号
'kind': '用车', -- 发票消费类型
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'tax': '70000', -- 税额
'tax_rate': '7%', -- 税率
'company_seal': '1', -- 是否有公司印章(0:没有; 1: 有)
'title': '机动车销售统一发票', --标题
'car_type': '多用途货车', --车辆类型
'tonnage': '0.71', --吨位
'form_type': '第二联', -- 发票是第几联
'form_name': '发票联', -- 发票联次
'issuer': '王XX' --开票人
'tax_num': '1234567890', --完税凭证号码
'max_people_num': '5', --限乘人数
'origin': '浙江杭州' --产地
// 小票
'store_name': 'storename', -- 店名
'date': '2018年05月03日', -- 日期
'time': '12:22:10', -- 时间
'subtotal': '80.00', -- 税前金额
'tax': '10.00', -- 税费
'discount': '1.00', -- 折扣
'tips': '1.00', -- 小费
'total': '90.00' -- 总金额
'currency_code':'CNY', -- 币种, 使用 ISO 4217 Currency Codes 标准
'type': 'Shopping', -- 消费类型
// 出行行程单
'title': '滴滴出行/T3/高德地图打车/花小猪打车—行程单', --标题
'date': '2019年03月20日', -- 申请日期
'date_start': '2019年01月12日', -- 行程开始时间
'date_end': '2019年03月13日', -- 行程结束时间
'phone': '178xxxxxxxx', -- 行程人手机号
'total': '55.80', -- 总计
'items': [ -- 行程信息
{
'car_type': '快车', -- 车型
'time_geton': '01-02 12:42 周三', -- 上车时间
'time_getoff': '01-02 12:52 周三', -- 下车时间(T3行程单)
'city': '杭州市', -- 城市
'station_geton': '杭州市滨江医院', -- 起点
'station_getoff': '金盛曼城(东门)' -- 终点
'mileage': '8.6', -- 里程(公里)
'total': '26.12', -- 金额
'producer': '添猫出行', -- 服务商(高德行程单)
'time_order': '01-02 12:32 周三', -- 下单时间(T3行程单)
},
{
'car_type': '快车', -- 车型
'time_geton': '01-03 22:00 周四', -- 上车时间
'time_getoff': '01-03 22:50 周四', -- 下车时间(T3行程单)
'city': '杭州市', -- 城市
'station_geton': '海创基地北楼', -- 起点
'station_getoff': '金盛曼城(东门)' -- 终点
'mileage': '3.8', -- 里程(公里)
'total': '13.26', -- 金额
'producer': '添猫出行', -- 服务商(高德行程单)
'time_order': '01-03 21:50 周四', -- 下单时间(T3行程单)
},
{
'car_type': '快车', -- 车型
'time_geton': '03-13 21:10 周三', -- 上车时间
'time_getoff': '03-13 21:30 周三', -- 下车时间(T3行程单)
'city': '杭州市', -- 城市
'station_geton': '海创基地北楼', -- 起点
'station_getoff': '金盛曼城(东门)' -- 终点
'mileage': '4.1', -- 里程(公里)
'total': '16.42', -- 金额
'producer': '添猫出行', -- 服务商(高德行程单)
'time_order': '03-13 21:00', -- 下单时间(T3行程单)
}
],
'kind': '交通', -- 发票消费类型
// 完税证明
'number': '15064112', -- 发票号码
'total': '3098.79', -- 总金额
'buyer': 'XXXXXX有限公司', -- 购买方名称
'buyer_tax_id': '11684616000000000D', -- 购买方纳税人识别号
'date': '2018年05月03日', -- 日期
'tax_authorities': '国家税务总局',
"title": "中华人民共和国税收完税证明", // 标题
"total_cn": "壹拾壹万肆仟伍佰陆拾柒元玖角整", // 大写金额
"remark": "...", // 备注
"items": [
{
"actual_paid_amount": "433.70", // 实缴金额
"entry_date": "2021-08-13", // 入库日期
"amount_paid": "0.00", // 已缴金额
"tax_agency": "国家税务总局杭州市滨江区税务局", // 征收机关
"name": "市区", // 品目名称
"quantity": "", // 课税数量
"original_number": "31308619010000216", // 原凭证号
"tax_period": "2021-07-01至2021-07-31", // 税款所属期
"tax_rate": "0.001", // 税率
"tax_type": "印花税" // 税种
"total": "43920.00" // 计税金额或销售收入
}
]
//船票
'code': '6300161320', -- 发票代码
'number': '15064112', -- 发票号码
'date': '2018年01月10日', -- 日期
'time': '12:14', -- 时间
'station_geton': '杭州', -- 出发车站
'station_getoff': '上海', -- 达到车站
'total': '174.00', -- 总金额
'name': '张三', -- 姓名
'kind': '交通', -- 发票消费类型
'province': '浙江省', -- 省
'city': '杭州市', -- 市
'currency_code':'CNY' -- 币种
//其他
"code": "1234567890", //代码
"number": "1234567890", //号码
"date": "2018年01月05日", //日期
"total": "1135.13", //金额
"kind": "其他", //消费类型
"title": "" //标题
},
'extra': {
//增值税
'check_code_candidates':['52657910788452871583','52657910788452871588'], -- 校验码备选
'check_code_last_six':['871583','871588'] -- 校验码后六位备选
'number_order_error': ['15064115','15064116'] -- 发票号码备选(如发现可能错号等情况)
//二维码或者条码
'qrcode': ['01,10,044000003111,20000010,123.40,20210701,01812343072612345678'], – 二维码,返回信息包含发票代码、发票号码、税前金额、开票日期、校验码
'barcode': ['00000102180000'], -- 条码
}
}
]
}
}
}
3.3. 错误返回参数
名称 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
---|---|---|---|---|---|
返回状态码 | result | true | int | 0或1 | 请求状态. 1:成功, 0:失败 |
错误码 | error | true | int | 10002 | |
信息说明 | message | true | String | "Autdenticate failed" |
3.4. 错误返回样例
{
'result': 0,
'error': 10002,
'message': 'Authenticate failed'
}
4. 请求示例
4.1. C#
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Test
{
class Program
{
const string appSecret = "APPSECRET"; //这里输入提供的app_secret
const string appKey = "APPKEY"; //这里输入提供的app_key
const string image_url = "http://fapiao.glority.cn/dist/img/sample.jpg"
public static string CalculateMD5Hash(string input)
{
// step 1, calculate MD5 hash from input
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
byte[] hash = md5.ComputeHash(inputBytes);
// step 2, convert byte array to hex string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString().ToLower();
}
public static double ConvertToUnixTimestamp(DateTime date)
{
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
TimeSpan diff = date.ToUniversalTime() - origin;
return Math.Floor(diff.TotalSeconds);
}
static void Main(string[] args)
{
double timeStamp = ConvertToUnixTimestamp(DateTime.Now);
string token = CalculateMD5Hash(appKey + '+' + timeStamp + '+' + appSecret);
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("app_key", appKey);
dic.Add("timestamp", timeStamp.ToString());
dic.Add("token", token);
dic.Add("image_url", image_url);
string result = "";
string url = "http://fapiao.glority.cn/v1/item/get_item_info";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
#region 添加Post 参数
StringBuilder builder = new StringBuilder();
int i = 0;
foreach (var item in dic)
{
if (i > 0)
builder.Append("&");
builder.AppendFormat("{0}={1}", item.Key, item.Value);
i++;
}
byte[] data = Encoding.UTF8.GetBytes(builder.ToString());
req.ContentLength = data.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
#endregion
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream stream = resp.GetResponseStream();
//获取响应内容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();
}
Console.WriteLine(result);
Console.ReadLine();
}
}
}
4.2. JAVA
//依赖项:okio-1.14.0,shiro-core-1.4.0,okhttp-3.11.0
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.apache.shiro.crypto.hash.Md5Hash;
import java.io.IOException;
public class Test {
public static void main(String...args) throws IOException {
String appKey = "APPKEY"; //这里输入提供的app_key
String appSecret = "APPSECRET"; //这里输入提供的app_secret
String imageUrl = "http://fapiao.glority.cn/dist/img/sample.jpg";
String host = "http://fapiao.glority.cn/v1/item/get_item_info";
long timestamp = System.currentTimeMillis() / 1000;
String token = new Md5Hash(appKey + "+" + timestamp + "+" + appSecret).toString();
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(host)
.post(new FormBody.Builder()
.add("app_key", appKey)
.add("timestamp", String.valueOf(timestamp))
.add("token", token)
.add("image_url", imageUrl)
.build())
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}
4.3. Objective-C
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonDigest.h>
NSString *appKey = @"appKey"; ///这里替换成提供的appkey
NSString *appSecret = @"appSecret"; //这里替换成提供的appSecret
NSString *imageUrl = @"http://fapiao.glority.cn/dist/img/sample.jpg";
NSString *host = @"http://fapiao.glority.cn/v1/item/get_item_info";
NSString *timestampString = [NSString stringWithFormat:@"%d", (int)[[NSDate date] timeIntervalSince1970]];
NSString *method = @"POST";
NSString *md5String = [NSString stringWithFormat:@"%@+%@+%@", appKey, timestampString, appSecret];
const char * pointer = [md5String UTF8String];
unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(pointer, (CC_LONG)strlen(pointer), md5Buffer);
NSMutableString *string = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[string appendFormat:@"%02x",md5Buffer[i]];
NSString *token = string;
NSString *urlString = [NSString stringWithFormat:@"%@?app_key=%@×tamp=%@&token=%@&image_url=%@", host, appKey, timestampString, token, imageUrl];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:10.0f];
[request setHTTPMethod:method];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData * _Nullable data , NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
}
else {
NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"result: %@" , dataString);
}
}];
[dataTask resume];
4.4. PHP
<?php
$appKey = "APPKEY"; //这里输入提供的app_key
$appSecret = "APPSECRET"; //这里输入提供的app_secret
$host = "http://fapiao.glority.cn";
$path = "/v1/item/get_item_info";
$method = "POST";
$timestamp = time();
$token = md5($appKey.'+'.$timestamp.'+'.$appSecret);
$imageUrl = 'http://fapiao.glority.cn/dist/img/sample.jpg';
$querys = "?app_key=$appKey×tamp=$timestamp&token=$token&image_url=$imageUrl";
$url = $host . $path . $querys;
$headers = ["Content-Type: multipart/form-data"];
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
$response = curl_exec($curl);
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$body = substr($response, $header_size);
curl_close($curl);
echo $body;
4.5. Python3
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import math
import os
import io
import requests
import time
import datetime
import hashlib
import codecs
import uuid
import traceback
def testapi():
appkey = "APPKEY" #这里输入提供的app_key
appsecret = "APPSECRET" #这里输入提供的app_secret
api_url = "http://fapiao.glority.cn/v1/item/get_item_info"
image_url = "http://fapiao.glority.cn/dist/img/sample.jpg"
result = {}
try:
# generate timestamp
timestamp = int(time.time())
# generate token
m = hashlib.md5()
token = appkey + "+" + str(timestamp) + "+" + appsecret
m.update(token.encode('utf-8'))
token = m.hexdigest()
# post request
data = {'image_url': image_url, 'app_key': appkey, 'timestamp': str(timestamp), 'token': token}
r = requests.post(api_url, data=data)
if r.status_code != 200:
print("failed to get info from : ", image_url)
else:
result = r.json()
print(result)
except:
traceback.print_exc()
return result
if __name__ == '__main__':
testapi()