第四章 接口参数 - 结算流程
>d 接口调用细节流程:
◆ 参数RSA加密[接口签名,加解密说明](https://easydoc.xyz/doc/34671874/hj1P5V2K/QWZA1Opy)
◆ 将加密结果以及公共参数拼接成新的字符串通过MD5加密生成签名
◆ 将公共参数以及签名通过header传输,参数加密结果通过body传输,发起http请求
◆ 返回结果解密[接口签名,加解密说明](https://easydoc.xyz/doc/34671874/hj1P5V2K/QWZA1Opy)
## 接口响应参数都为如下固定json格式
|参数名称|参数含义|数据类型|是否必有|参数备注|
|-|-|-|-|-|
|resopnseType| 返回类型|int|是|无需关注此值|
|errorCode|错误码 |String|是|详情参考[系统错误码](https://easydoc.xyz/doc/34671874/hj1P5V2K/FHeIkGcB)|
|errorMessage| 错误信息|String|是|详情参考[系统错误码](https://easydoc.xyz/doc/34671874/hj1P5V2K/FHeIkGcB)|
|status|状态码|int|是|详情参考[系统错误码](https://easydoc.xyz/doc/34671874/hj1P5V2K/FHeIkGcB)|
|success|是否成功|boolean|是|true:成功 false:失败|
|data|返回结果数据|String|否|只有当success为true才会有该值,该值为RSA加密值,需解密使用,解密规则请看[接口签名,加解密说明](https://easydoc.xyz/doc/34671874/hj1P5V2K/QWZA1Opy)|
## 1.结算接口
## 1.1 查询商户可开票列表、主体接口
>d 通过该接口可获取公司的可开发票列表,以及所拥有主体列表,无需频繁请求。请求到之后保存自己库即可。当签署主体信息有变更。或者发票内容有调整重新请求接口即可。
开发环境:https://pay-dev.lx-rhino.com
生产环境:https://api.lx-rhino.com
#### 接口地址:
/open/api/v1/company/queryInvoices
#### 请求方式:POST
#### 请求参数说明:
|参数名称|参数含义|是否必填|参数备注|
|-|-|-|-|
|无参数|||该接口无需参数|
#### 响应参数说明:
|参数名称| 参数含义|数据类型| 是否必有| 参数备注|
|-|-|-|-|-|
|name| 主体名称| String|是|主体名称|
|mainstayId| 主体ID|int| 是|主体ID|
|taxRate| 税率|BigDecimal| 是||
|invoiceOpResponseList| 发票列表| 是|发票列表为List数组|
|invoiceCode| 发票列表里面属性值发票编码|String| 是|invoiceOpResponseList里面属性|
|name| 发票列表里面属性值发票名称|String| 是|invoiceOpResponseList里面属性|
解密结果示例如下:
```json
[{
"invoiceOpResponseList": [{
"invoiceCode": "XXJSFWJSFWF1", //发票编码
"name": "信息技术服务,技术服务费" //发票内容
}, {
"invoiceCode": "XXJSFWJSZXFWF2",
"name": "信息技术服务,技术咨询服务费"
}],
"mainstayId": 1, //主体ID
"name": "xxx" //主体名称
}, {
"invoiceOpResponseList": [{
"invoiceCode": "JZZXFWZXFWF19",
"name": "鉴证咨询服务,咨询服务费"
}, {
"invoiceCode": "JZZXFWQYGLZXF20",
"name": "鉴证咨询服务,企业管理咨询费"
}],
"mainstayId": 2,
"name": "xxx",
"taxRate" : 0.050
}]
```
## 1.2 结算订单提交接口
>d 备注:该接口所生成订单超过五天未确认发放,系统会默认清除
开发环境:https://pay-dev.lx-rhino.com
生产环境:https://api.lx-rhino.com
#### 接口地址:
/open/api/v1/bill/submitBill
#### 请求方式:POST
#### 请求参数说明:
|参数名称|参数含义|是否必填|参数备注|
|-|-|-|-|
|payeeName|收款人姓名|是||
|payeeAccount|收款人账号|是|根据支付类型对应不同参数, 0.银行卡对应的是银行卡信息 1.支付宝对应支付宝账号 2.微信对应个人的openID|
|payeeIdCard|收款人身份证号码|是||
|amount |收款金额|是||
|thirdOrderId|商户订单号|是|商户自己生成,不可重复提交|
|payeePhone|收款人手机号|否|该参数用于用户接收到款短信|
|payeeBankName|收款账户开户银行|否||
|payeeBankNo|收款账户开户银行联行号|否||
|thirdBizOrderId|第三方业务订单ID|否|该参数为商户自己的业务订单号,通过该订单号能够查询该笔金额来源明细|
|payType|支付类型|是|支付类型该参数值填写支付类型对应数字即可 0:银行卡 1:支付宝 2:微信
|batchNo|批次号|否|由第三方自己控制哪些订单为同一个批次号,开票的时候可根据批次号开票|
#### 接口响应参数data字段解密后的参数说明:
|参数名称| 参数含义| 数据类型| 是否必有| 参数备注|
|-|-|-|-|-|
|billId| 结算平台订单号| int|是||
|thirdOrderNo| 商户提交时的订单号|String| 是||
|transNo|交易号|String| 是||
|checkStatus| 检测状态 |String|是|-1:检测失败 1:检测成功|
|reason| 失败原因|String| 是||
## 1.3 确认结算接口
开发环境:https://pay-dev.lx-rhino.com
生产环境:https://api.lx-rhino.com
#### 接口地址:
/open/api/v1/bill/sureGrant
#### 请求方式:POST
#### 请求参数说明:
|参数名称|参数含义|是否必填|参数备注|
|-|-|-|-|
|billId|订单ID|是|该值由提交订单接口返回|
|mainstayId|主体ID|是|该参数由[1.1查询商户可开票列表,以及所拥有的主体接口](https://easydoc.xyz/doc/34671874/hj1P5V2K/qGSYP0EC)可获的|
|invoiceCode|发票编号|是|该参数由[1.1查询商户可开票列表,以及所拥有的主体接口](https://easydoc.xyz/doc/34671874/hj1P5V2K/qGSYP0EC)可获的|
>d mainstayId 由签约合同的时候决定使用什么主体,签约成功新增账户后主体ID通过接口公司可开票类型,主体查询接口可获得
#### 接口响应参数data字段解密后的参数说明:
|参数名称| 参数含义|数据类型| 是否必有| 参数备注|
|-|-|-|-|-|
|thirdOrderNo| 第三方订单号|String| 是|生成订单接口的thirdOrderId字段的值|
|transNo|交易单号|String|是|支付平台交易单号|
|status| 结算结果状态|String| 是|详情请参考[发放结果状态码](https://easydoc.xyz/doc/34671874/hj1P5V2K/FHeIkGcB)|
|returnMsg| 返回信息|String|是| ||
## 1.4 结算订单结果查询接口
开发环境:https://pay-dev.lx-rhino.com
生产环境:https://api.lx-rhino.com
#### 接口地址:
/open/api/v1/bill/queryResult
#### 请求方式:POST
#### 请求参数说明:
|参数名称|参数含义|是否必填|参数备注|
|-|-|-|-|
|无参数名称|需要查询的商户订单号|是|例如:[商户订单号1,商户订单号2]|
>d 该接口参数无需参数名称只需将商户订单号拼接处json数组即可
示例:String data = [\"orderNo1\",\"orderNo2\"... ,\"orderNo10\"];
一次性最多查询10条记录
#### 接口响应参数data字段解密后的参数说明:
|参数名称| 参数含义|数据类型| 是否必有| 参数备注|
|-|-|-|-|-|
|thirdOrderNo| 商户订单号|String |是||
|status| 结果状态|int| 是|详情请参考[系统错误码](https://easydoc.xyz/doc/34671874/hj1P5V2K/FHeIkGcB)|
|reason| 失败原因|String|是| |支付失败才会有该值|
>d该发放结果data解密后为List 集合json字符串。
结果示例
[{"thirdOrderNo":"orderNo1","status":"xx","reason":"xxxx"},
{"thirdOrderNo":"orderNo2","status":"xx","reason":"xxxx"}]
## 1.5 结算发放成功异步回调
>d 该接口需要第三方自行编写提供接口到发放平台回调成功必须返回success不然会重复回调
#### 请求方式:POST
解密结果示例如下:
```json
{"itemStatus":"2","amount":"12.01","thirdOrderNo":"xxxxx","paymentTime":"2019-07-05 23:41:45","reason":""}";
```
|参数名称| 参数含义| 是否必有| 参数备注|
|-|-|-|-|
|itemStatus| 订单状态| 是|0等待发放 1正在发放 2发放成功 -1发放失败 -2转账退款 -3发放终止 -4 格式检查失败|
|amount| 结算发放的金额| 是|实际结算发放的金额|
|thirdOrderNo| 结算发放订单号| 是||
|paymentTime| 结算发放时间| 是||
|reason| 失败原因| 是||
#### 接口示例:
>d 该接口需要第三方自行编写提供接口到发放平台 接口编写示例如下。
#### 请求方式:POST
```java
@PostMapping("signCallBack")
@ResponseBody
public String signCallBack(HttpServletRequest request, @RequestBody String data){
String publicKey = "该公钥由发放平台提供发放到贵司邮箱";
//解密
String decode = RSAHelper.decryptByPublicKey(data, publicKey);
/*贵公司处理业务逻辑*/
return "success";
}
```
解密工具类在 [JAVA_DEMO](https://gitee.com/xinfudblog/lxapi_java_demo) 的 RSAHelper 类中
>d 贵司写完后提供到接口url给发放平台即可。回调成功需返回success,不然回重复回调,至多重试5次
postman中模拟接口是否正常接收数据如下操作
