申请发票开票
接口说明
接口描述:发票开票接口,商户配置好开发票所需必要参数之后,商户业务系统调用此接口开发票。
适用对象:特约商户
请求URL:https://pay.yintongzaixian.com/api/invoice/open
请求方式:POST
请求类型:application/json 或 application/x-www-form-urlencoded
请求参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 商户号 | mchNo | 是 | String(30) | M1621873433953 | 商户号 |
| 应用ID | appId | 是 | String(24) | 60cc09bce4b0f1c0b83761c9 | 应用ID |
| 商户开票单号 | mchOrderNo | 是 | String(30) | 20160427210604000490 | 商户生成的开票单号,保证唯一 |
| 开票方式 | invoiceWay | 是 | byte | 2 | 开票方式: 2-获取开票链接 |
| 含税开票金额 | amount | 是 | int | 100 | 含税开票金额,单位分 |
| 客户端IP | clientIp | 是 | String(128) | 210.73.10.148 | 客户端IPV4地址 |
| 开票链接有效期 | expiredDay | 否 | int | 3 | 开票方式为2时,可设置开票链接有效期,设置区间1~999天,默认4天 |
| 购方信息 | buyerInfo | 是 | String(256) | {} | 购方信息,json格式字符串,详见购方信息说明 |
| 销方信息 | sellerInfo | 否 | String(256) | {} | 销方信息,json格式字符串,保留字段 |
| 商品信息 | goodsList | 否 | String(256) | [{}] | 商品信息,json格式字符串,保留字段 |
| 渠道参数 | channelExtra | 否 | String(256) | {} | 特定渠道发起的额外参数,json格式字符串.保留字段 |
| 备注 | remark | 否 | String(256) | 开票备注 | 备注 |
| 请求时间 | reqTime | 是 | long | 1622016572190 | 请求接口时间,13位时间戳 |
| 接口版本 | version | 是 | String(3) | 1.0 | 接口版本号,固定:1.0 |
| 签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 签名值,详见签名算法 |
| 签名类型 | signType | 是 | String(32) | MD5 | 签名类型,目前只支持MD5或RSA2方式 |
购方信息说明
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 购方名称 | buyerName | 是 | String(20) | 张三 | 购方开票名称 |
| 购方税号 | taxNo | 否 | String(128) | abcde12345 | 购方开票税号,企业抬头必传 |
| 购方地址 | address | 否 | String(20) | 河北省沧州市解放西路华商大厦 | 购方地址 |
| 购方固定电话 | telphone | 否 | String(20) | 0317-xxx | 购方固定电话 |
| 开户行 | bankName | 否 | String(20) | 中国农业银行 | 开户行 |
| 开户账号 | bankAccount | 否 | String(20) | 62xxxxx | 开户账号 |
| 交付手机 | pushPhone | 否 | String(20) | 131xxxx | 交付手机,交付邮箱和交付手机需必传其一 |
| 交付邮箱 | pushEmail | 否 | String(20) | xx@xx.xx | 交付邮箱,交付邮箱和交付手机需必传其一 |
请求示例数据
{
"buyerInfo": "{\"buyerName\":\"张三\",\"pushPhone\":\"12966668888\",\"taxNo\":\"556418D585E5FHG3Q\"}",
"amount": 100,
"mchOrderNo": "1715412578007",
"invoiceWay": 2,
"appId": "653b67b90d14f66aa119a518",
"clientIp": "110.244.120.23",
"sign": "1F98058E61DAA86AC909462C59F574AE",
"signType": "MD5",
"reqTime": "1715412578",
"mchNo": "M1698391993",
"version": "1.0"
}
返回参数
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 返回状态 | code | 是 | int | 0 | 0-处理成功,其他-处理有误,详见错误码 |
| 返回信息 | msg | 否 | String(128) | 签名失败 | 具体错误原因,例如:签名失败、参数格式校验错误 |
| 签名信息 | sign | 否 | String(32) | 7C165045B92700E60693423D32AD6446 | 对data内数据签名,如data为空则不返回 |
| 返回数据 | data | 否 | String(512) | {} | 返回下单数据,json格式数据 |
data数据格式
| 字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
|---|---|---|---|---|---|
| 发票单号 | invoiceOrderId | 是 | String(30) | FP1789196148628787202 | 支付系统发票单号 |
| 商户开票单号 | mchOrderNo | 是 | String(30) | 1715412578007 | 返回商户传入的开票单号 |
| 开票状态 | state | 是 | int | 2 | 开票状态: 0-订单生成 1-开票中 2-开票成功 3-开票失败 4-开票任务关闭 5-已冲红 6-已作废 |
| 开票链接地址 | channelInvoiceQrcodeUrl | 是 | String(128) | http://www.jeequan.com/pay.html | 开票链接地址 |
| 开票链接失效时间 | expiredTime | 是 | String(30) | 2024-05-15 00:00:00 | 开票链接失效时间 |
| 渠道错误码 | errCode | 否 | String | ACQ.PAYMENT_AUTH_CODE_INVALID | 上游渠道返回的错误码 |
| 渠道错误描述 | errMsg | 否 | String | Business Failed 失败 | 上游渠道返回的错误描述 |
返回示例数据
{
"code": 0,
"data": {
"channelInvoiceQrcodeUrl": "https://openapi.tianquetech.com/merchant/makeInvoice.html?id=NTNmZTBlODU4YWFkNDFhN2EwYzA1ODM3ZTk4Yzc2MTU=",
"expiredTime": "2024-05-15 00:00:00",
"invoiceOrderId": "FP1789196148628787202",
"mchOrderNo": "1715412578007",
"state": 1
},
"msg": "SUCCESS",
"sign": "7C165045B92700E60693423D32AD6446"
}
SDK调用示例(Java):
JeepayClient jeepayClient = JeepayClient.getInstance(Jeepay.appId, Jeepay.apiKey, Jeepay.getApiBase());
InvoiceOrderCreateRequest request = new InvoiceOrderCreateRequest();
InvoiceOrderCreateReqModel model = new InvoiceOrderCreateReqModel();
model.setMchNo(Jeepay.mchNo); // 商户号
model.setAppId(jeepayClient.getAppId()); // 应用ID
request.setBizModel(model);
try {
InvoiceOrderCreateResponse response = jeepayClient.execute(request);
_log.info("验签结果:{}", response.checkSign(Jeepay.apiKey));
if (response.isSuccess(Jeepay.apiKey)) {
_log.info("data:{}", response.getData());
} else {
_log.info("请求失败:mchNo={}, msg={}", Jeepay.mchNo, response.getMsg());
}
} catch (JeepayException e) {
_log.error(e.getMessage());
}