第三章 模块接口(2) - 充值管理

>d 接口调用细节流程: ◆ 参数RSA加密[接口签名,加解密说明](https://easydoc.top/doc/92150138/ZSNp8hjw/FVjvrnys) ◆ 将加密结果以及公共参数拼接成新的字符串通过MD5加密生成签名 ◆ 将公共参数以及签名通过header传输,参数加密结果通过body传输,发起http请求 ◆ 返回结果解密[接口签名,加解密说明](https://easydoc.top/doc/92150138/ZSNp8hjw/FVjvrnys) ## 接口响应参数都为如下固定json格式 |参数名称|参数含义|数据类型|是否必有|参数备注| |-|-|-|-|-| |resopnseType| 返回类型|int|是|无需关注此值| |errorCode|错误码 |String|是|详情参考[系统错误码](https://easydoc.top/doc/92150138/ZSNp8hjw/BoPRc3hR)| |errorMessage| 错误信息|String|是|详情参考[系统错误码](https://easydoc.top/doc/92150138/ZSNp8hjw/BoPRc3hR)| |status|状态码|int|是|详情参考[系统错误码](https://easydoc.top/doc/92150138/ZSNp8hjw/BoPRc3hR)| |success|是否成功|boolean|是|true:成功 false:失败| |data|返回结果数据|String|否|只有当success为true才会有该值,该值为RSA加密值,需解密使用,解密规则请看[接口签名,加解密说明](https://easydoc.top/doc/92150138/ZSNp8hjw/FVjvrnys)| ## 充值管理接口时序图 ![充值管理.jpg](https://cos.easydoc.net/87516830/files/knef0jli.jpg) ## <a id="1.1.充值接口">1.1充值接口</a> 开发环境:https://pay-dev.lx-rhino.com 生产环境:https://api.lx-rhino.com #### 接口地址: /open/api/v1/yns/balance/recharge #### 请求方式:POST #### 请求参数说明: |参数名称|参数含义|数据类型|是否必填|参数备注| |-|-|-|-|-| |mainstayId|主体ID|Integer|是|| |amount|充值金额|BigDecimal|是|| |bankVoucherFile|充值银行回执单|String|是|该参数为通过[1.3 上传文件接口](https://easydoc.top/doc/92150138/ZSNp8hjw/bo20JmTw)将文件上传后返回的值,最长640字符| |remarks|备注|String|否|最长640字符| |thirdRechargeNo|第三方充值单号|String|是|最长32字符| #### 接口响应参数data字段解密后的参数说明: |参数名称| 参数含义|数据类型| 是否必有| 参数备注| |-|-|-|-|-| |thirdRechargeNo| 第三方充值单号| String|是|| |entryAmount| 打款金额|BigDecimal|是|| |rechargeAmount| 实际充值到账金额(扣除合同税费)|BigDecimal|是| || |contractTaxRate| 合同税率|BigDecimal|是| || |contractTaxAmount| 合同税费|BigDecimal|是| || ## <a id="1.2.余额查询">1.2 余额查询</a> 开发环境:https://pay-dev.lx-rhino.com 生产环境:https://api.lx-rhino.com #### 接口地址: /open/api/v1/yns/balance/query #### 请求方式:POST #### 请求参数说明: |参数名称|参数含义|数据类型|是否必填|参数备注| |-|-|-|-|-| |mainstayId|主体ID|Integer|否|默认查询所有主体| |payType|支付类型|Integer|否|默认查询所有支付类型| #### 接口响应参数data字段解密后的参数说明: |参数名称| 参数含义|数据类型| 是否必有| 参数备注| |-|-|-|-|-| |mainstayId|主体ID| Integer|是|| |mainstayName|主体名|String|是|| |totalBalance|主体总余额|BigDecimal|是| || |companyBalanceItems|主体支付类型列表|Array|是| || |balance|支付类型余额|BigDecimal|是| || |name|支付类型名称|String|是| || |payType|支付类型编码|Integer|是| || 解密结果示例如下: ```json [ { "companyBalanceItems": [ { "balance": 1115.39, "name": "银行卡账户", "payType": 0 }, { "balance": 615.39, "name": "支付宝账户", "payType": 1 }, { "balance": 0.00, "name": "微信账户", "payType": 2 } ], "mainstayId": 1, "mainstayName": "安吉", "totalBalance": 1730.78 } ] ``` ## <a id="4.1.上传文件接口">1.3 上传文件接口</a> >d 该接口将需要上传的文件上传至发放平台服务器,获取到对应的地址用于其他接口作为入参 开发环境:https://pay-dev.lx-rhino.com 生产环境:https://api.lx-rhino.com #### 接口地址: /open/api/v1/common/uploadFile #### 请求方式:POST #### 请求参数说明: |参数名称|参数含义|是否必填|参数备注| |-|-|-|-| |file|文件|是|| #### 响应参数说明: |参数名称| 参数含义| 是否必有| 参数备注| |-|-|-|-| |url|文件地址|是|| java接口代码示例: ```json public String upload(MultipartFile file) { String url = baseUrl +"/open/api/v1/invoices/uploadFile"; final byte[] bytes ; try { bytes = file.getBytes(); String appKey = ""; String version = "1.0"; String secretkey = ""; String timestamp = String.valueOf(System.currentTimeMillis()); //注意此处签名无 body拼接 String localString = "&Timestamp=" + timestamp + "&AppKey=" + appKey + "&Version=" + version + "&SecretKey" + secretkey; String sigin = Md5Util.getMd5(localString); MultipartBody body = new MultipartBody.Builder() .setType(MediaType.parse("multipart/form-data")) .addFormDataPart("file", file.getOriginalFilename(), okhttp3.RequestBody.create(MediaType.parse("image/" + "打款凭证"), bytes)) .build(); Request request = new Request.Builder() .post(body) .addHeader("AppKey", appKey) .addHeader("Timestamp", timestamp) .addHeader("Version", "1.0") .addHeader("Sign", sigin) .url(url) .build(); Call call = HttpUtil.getOkHttpClient().newCall(request); try { Response response = call.execute(); String res = response.body().string(); log.info("res====" + res); return res; } catch (IOException e) { log.error("HttpUtil.post网络请求失败:{}", e.getMessage()); return "网络请求失败"; } } catch (IOException e) { log.warn("fail to read file", file.getOriginalFilename(), e); } return null; } ``` postman 直接请求示例: ![1.png](https://cos.easydoc.net/44383407/files/k99qibti.png)![2.jpg](https://cos.easydoc.net/44383407/files/k99qibu9.jpg) ## 1.4 充值成功异步回调 #### 请求方式:POST >d 该接口需要第三方自行编写提供接口到发放平台回调成功必须返回success不然会重复回调 >d 该接口需要第三方自行编写提供接口到发放平台 接口编写示例如下。 ```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中模拟接口是否正常接收数据如下操作 ![微信截图_20191111122018.png](https://cos.easydoc.net/44383407/files/k2tx5nl4.png) 解密结果示例如下: ```json {"auditStatus":"2","rechargeAmount":"12.01","thirdRechargeNo":"xxxxx","entryTime":"2019-07-05 23:41:45","entryAmount":"12.01","contractTaxAmount":"12.01","contractTaxRate":"12.01"}"; ``` |参数名称| 参数含义| 数据类型|是否必有| 参数备注| |-|-|-|-|-| |auditStatus| 充值审核状态|int| 是|| |rechargeAmount| 充值金额|BigDecimal| 是|| |thirdRechargeNo| 第三方充值单号|String| 是|| |entryTime| 充值时间 |String| 是|| |entryAmount| 入账金额|BigDecimal| 是|| |contractTaxAmount| 合同税费|BigDecimal| 是|| |contractTaxRate| 合同税率|BigDecimal| 是||