From 7fd3525256b0e4a0dbb6f08405368990619adf36 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 20 十月 2023 14:08:26 +0800
Subject: [PATCH] 对接第三方分账接口

---
 ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/HuiFuTianXiaUtil.java |  731 ++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 450 insertions(+), 281 deletions(-)

diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/HuiFuTianXiaUtil.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/HuiFuTianXiaUtil.java
index be131e4..f226c79 100644
--- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/HuiFuTianXiaUtil.java
+++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/HuiFuTianXiaUtil.java
@@ -5,8 +5,13 @@
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.uuid.IdUtils;
 import com.ruoyi.shop.domain.dto.MgtShopHFTXAuthDto;
+import com.ruoyi.shop.domain.pojo.shop.ShopAuthenticationHftx;
+import com.ruoyi.shop.domain.vo.MerchantBasicdataSettlementVo;
 import com.ruoyi.shop.domain.vo.MerchantBasicdataVo;
+import com.ruoyi.shop.domain.vo.PaymentDelaytransHFTXVo;
+import com.ruoyi.shop.domain.vo.WeixinPaymentRefundVo;
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpPost;
@@ -18,6 +23,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.security.KeyFactory;
 import java.security.PrivateKey;
@@ -36,20 +42,23 @@
  */
 public class HuiFuTianXiaUtil {
     //私钥(Base64编码)
-    private static String privateKeyBase64 = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCB7Flp+4FuRBvW4FLx5FoR/Hbj1UWJbgt9JAgO5iCFR9MhxXu783hvP88STFWyNkCeAh9EIwVcJxm80Kmt87KH4Nwo1ejfqF8kUkK02byVby39fqTJlyqeDYKjqqc04GpnL7vi4iD4rKGvjyJIFxekCcOSTFWVl879fbPn9+ljsVrrjoyzbPMvPJHPuc2dzkWP98C+y5QFDIdjyS8NrVOpJcwVFrcxkmCmK6azTi6LJeI/wH9MsJHmnF9ZilqY1x00XbTMxE4EfTgXgmv6dvRac6VrqQowUCqIrHpVJIdet1w56vmz3IpxORIOPzU2nY9ziZrMIgGkJ1bLQRbLK2RXAgMBAAECggEAKA4i/u7AV6t93cBpMhRRxIvOZ61/87/OoPUz2swOKKkdKaNF44tLjRjiEWUhYoEhaNWEqDAX3fJcF/9I4M1qNEQZ/Cj+072IH52Q3UrnvjZ5ulaKHXCSfgnyRd0+EapCg6+OwIMw4Rnv+z0ot4sPCc7M0dTg6e7UrQhNJ+4hsU8yZAMzmQyUu7pE6tvbE+u5QdRZRMQIYPgzwpy5Yta0gtRSmMQ9jneUYwEJ5eu8ZhAXRzEWqAA9GgOLgAwC2Ma1xkVyiBS/7pfd0fwbxapzMZMQMbCsv+UrYGYkXDp/1XwrpNWavfHpSCc9fkK2auEqYJtYlhELoa87+WrBOHhkkQKBgQDMi73gDw47XH0T6zuJn2ieDDc7IU1DV9RXXNJNxgcB0yBM8HaI8lv27eThphlEU13KWKTHAylm/q7v4dp88aC+iA3GhIbmE1sWxiSJvwGR2xqmWvIHTadJtQFdXJN+/GmG1fJuCRwkZSyGdUXUdmx3PBATEqUwuSQQDQkMvxYjrwKBgQCimxdXNEZrZKHCbHWTHx0nUu0lF7skgi8x+xLbDT096WvqpeNxOZXVZVhU7yHn2ePF9iFipg8uHviUIJyB2Rzr1M2busY3yoRutXlugZJ9ZVUlxpIpNI94ntcOZUctgfd1quhlgqEwcF1PJ5lkogrKHvLoV30fvgkYpA763ZNr2QKBgDgDkKS6GsCgzFPXGD/Q2pplZ/6WWQ03ERw3fBP2Rdb3FSJcu2k3TX3qmcI9dS/j0IxoB//D2uOsnQVuCSIsHUPwCC2z/ykkZc5vxnO+TdS+dqbVwu/DESu7GLuTbYTZ5KAbGL+PWRiSaEYN+Wh8YampVhGTCo+0M679ktvdvFdbAoGACtCz+bnhYS09URgzrchpAP+UBF6StPfvuaxQcb9srlyDMAU+nn5NB/eIq4WIRMqKStV3HP+cjN3EfN26ayyMrublkhEXNAjFTDPH0uDNZIfD5RJTEGiNjmFKPovf8xfs5Kesc2v/2p/upOAmZLoea5kpYOjIyr6yDjCDSo5ISukCgYBtOo2AgFXyzW1ti8MCsz77BtCJ9MgVoPF4y4Ah8l/6Dwe+cevdlWuOYckIAJqJ9g2FYwp9AAevK7k17xsgBgrdqlI77p3wQb7p/znJnNU6qz78FwUzd8t5WvqFh+3mTxjG7Iyj6brLzEUt8McdmGlwbFJqKgUxBKS4mY7T399L5Q==";
+    private static String privateKeyBase64 = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCs658vv/6VdoSGyxr7gVNxlsFGKC2RE4I3S3C78f7t29t6oSm7tdRUr+B/I1VtV1Ps2SQMqG+gUpLiVbHEj+U8PjrvSht6cBNpqhnUjBASEhO0zeCJXNj3zqEDj7CnzDbUzuZWZDyLEaSLRaVb/DSW34D0GDsGWpIMLui/lnubXCYMNsUJBgRmV/tSv7vApVok3aKDoYkZMDhfnKrbxTtWkDfwNLDCInB300YbGeN7hhECRestktymHw0I78x3g+pdzOKOSofqdHyBCemVgOBt2h+oulVU65jc5ok0vwhx7sk2+i3Dw/S/hx3fpnOAToLhpFSTCqArG5wOhiOTX5RRAgMBAAECggEAT+uu7VDdh5L5eZtR40BIos08kwJq3QyZOJlDh3o3ixP8gtcOBNXrRyDqr5hTGXAtN+C8SqVmwkCn5rgYq3KeTpOshYBI5vP55PJbceMyYke8l+o3hwVEunPj81NsIIHALedaij9VxCjpVf1gif0tCTZP0YGJdkxSCBN+O15/zrOred2xkbAGXCNM2j+uIOZ5LTQ064jUAm9KWO4JvVnlNCQPiJCfe652i4RE9adgTlT7d9XffQ/oZDZcDkD1OVUO4ErsSgvjsjPW9Qk8zAVm/C+ycs27GUbVf6yh3zMoL4JDshzoMYAVDqP3VkpYGiW71PzcOZqktcjbtCom4/gpqQKBgQDgHrsQVzMwr18gRAWl8PsgHyMvhyivzk7uPvm6nK9mvEGg7wnrCMKHkpEOCi4mHWnW6H9ptrkeAQbHN7H8Qd6JZm/H0VN8N8fg4IFarlrLWXET6s7or9btCf4aq8DGrU9C+7fcngSfuqlrSxy9e+9InmzUFGKVLBtYIJbG1r00qwKBgQDFhHhhc4WC1MrWLSGhpaNp+swPstfzUBeX2MtZOIv6yXTYPvJ77AAZoLnW482eUZucltCAUucEtTsop25dKdhbdhbVJ/YRRnaklBL2rai4HX+fjoV29tepJhrOrq3Ey+vqvDEsqrBz2C6YyJ6d9aaPPwCFsnDRO+g7tK9S4ZfC8wKBgGlhKbXqOnCW1RSXx0waPgoBegrb816OlABj7go3qCWXOQiRvMkdilIysS+3y7EyPVTGZzpupyYbd3Nulaq10gwq9T4wB6Atnjb3ePsJZjmdKZUi3/z6yQUVoLwrq+3/CXjGYNJEHop4Ozbuz2ms/3rWuvcRSrU3UvgiAqMlzzsXAoGAJY7xDSbYZm5sO5nNYV2L22UzVHDfm4bJVbiFwmt8Qq34J/6gQWw5AKaNcA1VVhuSiY4sC5q4Dy8fFrXvyItidtHXuaSlp9dMTDNT/9A52vjRAdgqDNsXWzTBuDeDF37nV3V9rE6wyvZ6tdbAQq0phOeoA8RQq5jGqkPLauk24H0CgYEAn92Ru9UuloMmTrJbpeeLmMkwCzKff4SpYSY3WzidjdlfHpyNqBUMYb5Ym3OplrSONT9o2H5mEQipjatiu0teILBT7j+f9ZJYQ3vUurAXbmKtthHuEV4lueylNUgmkv+dm295n2x79w1mk/0emJ/Qr9tz43dpSV/kRCxc+lX+OFk=";
     //公钥(Base64编码)
-    private static String publicKeyBase64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgexZafuBbkQb1uBS8eRaEfx249VFiW4LfSQIDuYghUfTIcV7u/N4bz/PEkxVsjZAngIfRCMFXCcZvNCprfOyh+DcKNXo36hfJFJCtNm8lW8t/X6kyZcqng2Co6qnNOBqZy+74uIg+Kyhr48iSBcXpAnDkkxVlZfO/X2z5/fpY7Fa646Ms2zzLzyRz7nNnc5Fj/fAvsuUBQyHY8kvDa1TqSXMFRa3MZJgpiums04uiyXiP8B/TLCR5pxfWYpamNcdNF20zMROBH04F4Jr+nb0WnOla6kKMFAqiKx6VSSHXrdcOer5s9yKcTkSDj81Np2Pc4mazCIBpCdWy0EWyytkVwIDAQAB";
+    private static String publicKeyBase64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArOufL7/+lXaEhssa+4FTcZbBRigtkROCN0twu/H+7dvbeqEpu7XUVK/gfyNVbVdT7NkkDKhvoFKS4lWxxI/lPD4670obenATaaoZ1IwQEhITtM3giVzY986hA4+wp8w21M7mVmQ8ixGki0WlW/w0lt+A9Bg7BlqSDC7ov5Z7m1wmDDbFCQYEZlf7Ur+7wKVaJN2ig6GJGTA4X5yq28U7VpA38DSwwiJwd9NGGxnje4YRAkXrLZLcph8NCO/Md4PqXczijkqH6nR8gQnplYDgbdofqLpVVOuY3OaJNL8Ice7JNvotw8P0v4cd36ZzgE6C4aRUkwqgKxucDoYjk1+UUQIDAQAB";
     //汇付公钥
-    private static String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgmGZVY0i5r17BnHiLeL7TbqojpuOmR947JIUB5zYcc/TTYijkCsjtshmvxWslZBdkV6K8/1CmHRAY92+4GZnem6MVO34xn1wTCq65+wMC1oypjJy9T6N0WXoGaf+Wn0nxPdJLvnwpOo6epEES3kQKx+i/Qar7oDwlXMQ6b2QwR/id9cYudN0RmdRLzkmrwEOkjv+WcWCQdoAXv4JWJwU+iwJffoJrWn5pGeVFWFrH1fRJ0IB4YdaL9aWMn2YM5pu+/mcOKQogmNYzsHkZDapX3AF+es0TN+v/qOCgU3OVTVa7ltDAiLuPtMeu/72pQiM0nxunRVnAJDo2BQ5mu6z4wIDAQAB";
+    private static String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAral1nmqS1vswaeFp3dAfUY4a/ql07382AMH4NOwewtf9iuiZa608hDVzGYIXYAr+mxj1WwJpSCp9Sn+zSJs4+9iGodMa9qfUQ4oi32zGKR1ND7OZwpXYZudqQrUfC8/0j1DjOWBlKWyqwIh2JLXOiJLrU+dbDJxCqyHv+rO55egjD5yVLEJLkB/n1peIsfbqozKu7rpkx4bUAP1PvMmP913np2gYKsTrjGo7B/NqzkQ98mtL/VMOIbha0qN+MpEWImT/mOlgxvmr7YnTr3e7Iu/gSm8HR/5kLqmO4WmHALnoq7vDnOWpyM7c+awIxRTwoT8mwCuxPTLBUZ5UEmpIYwIDAQAB";
     //商户号
-    private static String huifu_id = "6666000140729384";
+    private static String huifu_id = "6666000141279152";
+    //渠道号
+    private static String channel_id = "6666000140729384";
     //产品号
     private static String product_id = "KAZX";
     //微信小程序appid
-    private static String sub_appid = "";
+    private static String sub_appid = "wxb7f0ea286fc4e535";
     //本地文件存储位置
-    private static String path = "";
-    //控制台地址https://dashboard.huifu.com/partners/login,用户名为hongrt,最新密码为xw123456
+    private static String path = "D:\\file";
+    //控制台地址https://dashboard.huifu.com/customers/login,用户名为hongruitang,最新密码为xw123456
+    //接口文档https://paas.huifu.com/partners/api/#/
 
 
 
@@ -60,9 +69,8 @@
      * @param trans_amt     支付金额
      * @param sub_openid    微信小程序用户openid
      * @param notify_url    异步通知回调地址
-     * @param acct_split_bunch  分账对象[{"div_amt":"0.10","huifu_id":"6666000123120001"}]
      */
-    public static R weixinPayment(String req_seq_id, String goods_desc, Double trans_amt, String sub_openid, String notify_url, JSONArray acct_split_bunch){
+    public static R weixinPayment(String req_seq_id, String goods_desc, Double trans_amt, String sub_openid, String notify_url){
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
         NumberFormat numberInstance = NumberFormat.getInstance();
         //最大两位小数
@@ -81,7 +89,69 @@
         wx_data.put("sub_openid", sub_openid);
         data.put("wx_data", wx_data.toJSONString());
         data.put("notify_url", notify_url);
-        data.put("acct_split_bunch", acct_split_bunch.toJSONString());
+        data.put("delay_acct_flag", "Y");
+
+        JSONObject body = new JSONObject();
+        body.put("sys_id", huifu_id);
+        body.put("product_id", product_id);
+        body.put("sign", sign(data.toJSONString()));
+        body.put("data", data);
+        System.out.print(JSON.toJSONString(body));
+        HttpRequest post = HttpUtil.createPost(url);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-type","application/json; charset=utf-8");
+        headers.put("Accept", "application/json");
+        post.addHeaders(headers);
+        post.body(body.toJSONString());
+        HttpResponse execute = post.execute();
+        String result1 = execute.body();
+        execute.close();
+        if(StringUtils.hasLength(result1)){
+            JSONObject result = JSONObject.parseObject(result1);
+            String result_data = result.getString("data");
+            String result_sign = result.getString("sign");
+            boolean verify = verify(result_data, result_sign);
+            if(!verify){
+                return R.fail("结果验签失败");
+            }
+            JSONObject resultData = result.getJSONObject("data");
+            String resp_code = resultData.getString("resp_code");
+            String resp_desc = resultData.getString("resp_desc");
+            //交易受理成功;注:交易状态以trans_stat为准;
+            String success1 = "00000000";
+            String success2 = "00000100";
+            if(success1.equals(resp_code) || success2.equals(resp_code)){
+
+            }
+            return R.fail(resp_desc);
+        }
+        return R.fail("请求异常");
+    }
+
+
+    /**
+     * 微信小程序支付退款
+     * @param req_seq_id            请求流水号
+     * @param ord_amt               退款金额
+     * @param org_req_date          原交易请求日期yyyyMMdd
+     * @param org_party_order_id    原交易微信支付宝的商户单号
+     * @param notify_url            异步通知地址
+     * @return
+     */
+    public static R<String> weixinPaymentRefund(String req_seq_id, Double ord_amt, String org_req_date, String org_party_order_id, String notify_url){
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        NumberFormat numberInstance = NumberFormat.getInstance();
+        //最大两位小数
+        numberInstance.setMaximumFractionDigits(2);
+        String url = "https://api.huifu.com/v2/trade/payment/scanpay/refund";
+        JSONObject data = new JSONObject();
+        data.put("req_date", sdf.format(new Date()));
+        data.put("req_seq_id", req_seq_id);
+        data.put("huifu_id", huifu_id);
+        data.put("ord_amt", ord_amt);
+        data.put("org_req_date", org_req_date);
+        data.put("org_party_order_id", org_party_order_id);
+        data.put("notify_url", notify_url);
 
         JSONObject body = new JSONObject();
         body.put("sys_id", huifu_id);
@@ -106,78 +176,46 @@
                 return R.fail("结果验签失败");
             }
             JSONObject resultData = result.getJSONObject("data");
-            /**
-             * 00000000	交易受理成功;注:交易状态以trans_stat为准;
-             * 00000100	下单成功
-             * 10000000	产品号不能为空
-             * 10000000	交易类型不能为空
-             * 10000000	%s不能为空(%s代指报错参数名)
-             * 10000000	%s长度固定%d位(%s代指报错参数名、%d代指字段长度)
-             * 10000000	%s最大长度为%d位(%s代指报错参数名、%d代指字段长度)
-             * 10000000	%s的传入枚举[%s]不存在(%s代指报错参数名)
-             * 10000000	%s不符合%s格式(%s代指报错参数名)。如:交易金额不符合金额格式
-             * 10000000	订单已超时
-             * 20000000	重复交易
-             * 21000000	手续费金额、手续费收取方式、手续费扣款标识、手续费子客户号、手续费账户号,必须同时为空或同时必填
-             * 22000000	产品号不存在
-             * 22000000	产品号状态异常
-             * 22000002	商户信息不存在
-             * 22000002	商户状态异常
-             * 22000003	延迟账户不存在
-             * 22000003	商户账户信息不存在
-             * 22000004	暂未开通分账权限
-             * 22000004	暂未开通%s权限(%s代指报错参数名)
-             * 22000004	暂未开通延迟入账权限
-             * 22000005	手续费承担方必须参与分账
-             * 22000005	分账列表必须包含主交易账户
-             * 22000005	其他商户分账比例过高
-             * 22000005	商户入驻信息配置有误(多通道)
-             * 22000005	商户分期贴息未激活
-             * 22000005	分期交易不能重复激活
-             * 22000005	手续费配置有误
-             * 22000005	商户贴息信息未配置
-             * 22000005	花呗分期费率配置有误
-             * 22000005	分账配置有误
-             * 22000005	分账配置未包含手续费承担方
-             * 22000005	商户入驻配置信息有误
-             * 22000005	商户支付宝/微信入驻信息配置有误
-             * 22000005	商户银联入驻信息配置有误
-             * 22000005	商户贴息分期费率未配置渠道号
-             * 22000005	商户贴息分期费率未配置费率类型
-             * 22000005	商户贴息分期费率配置有误
-             * 22000005	手续费费率未配置
-             * 22000005	手续费计算错误
-             * 22000005	商户贴息信息配置有误
-             * 22000005	商户未报名活动或活动已过期
-             * 22000005	数字货币手续费费率未配置
-             * 22000005	数字货币手续费配置有误
-             * 22000005	商户未配置默认入驻信息(多通道)
-             * 23000003	交易金额不足以支付内扣手续费
-             * 23000003	优惠金额大于交易金额
-             * 23000004	交易类型不支持
-             * 23000004	当前交易类型不支持商户贴息
-             * 90000000	业务执行失败;如:账户可用余额不足
-             * 90000000	该功能已关闭,请联系客服
-             * 90000000	交易失败,单日金额超限,请联系额服提额
-             * 90000000	交易存在风险
-             * 91111119	通道异常,请稍后重试
-             * 98888888	系统错误
-             */
             String resp_code = resultData.getString("resp_code");
             String resp_desc = resultData.getString("resp_desc");
-            //交易状态 P: 处理中、S: 成功、F: 失败
-            String trans_stat = resultData.getString("trans_stat");
             //交易受理成功;注:交易状态以trans_stat为准;
             String success1 = "00000000";
-            //下单成功
-            String success2 = "00000100";
-            if(success1.equals(resp_code) || success2.equals(resp_code)){
-
+            if(success1.equals(resp_code)){
+                String req_seq_id1 = resultData.getString("req_seq_id");
+                return R.ok(req_seq_id1);
             }
             return R.fail(resp_desc);
         }
         return R.fail("请求异常");
     }
+
+
+    /**
+     * 微信支付退款回调通知
+     * @param jsonObject
+     * @return
+     */
+    public static R<WeixinPaymentRefundVo> weixinPaymentRefundNotify(JSONObject jsonObject){
+        String sign = jsonObject.getString("sign");
+        JSONObject data = jsonObject.getJSONObject("data");
+        String resp_code = data.getString("resp_code");
+        String resp_desc = data.getString("resp_desc");
+        if("00000000".equals(resp_code)){
+            WeixinPaymentRefundVo vo = new WeixinPaymentRefundVo();
+            vo.setReqSeqId(data.getString("req_seq_id"));
+            vo.setReqDate(data.getString("req_date"));
+            vo.setTransDate(data.getString("trans_date"));
+            vo.setTransTime(data.getString("trans_time"));
+            vo.setTransStat(data.getString("trans_stat"));
+            vo.setOrdAmt(data.getString("ord_amt"));
+            vo.setActualRefAmt(data.getString("actual_ref_amt"));
+            vo.setTotalRefAmt(data.getString("total_ref_amt"));
+            vo.setRefCut(data.getString("ref_cut"));
+            return R.ok(vo);
+        }
+        return R.fail(resp_desc);
+    }
+
 
 
 
@@ -239,111 +277,190 @@
 
 
     /**
-     * 商户进价
+     * 商户进件
      * @param dto
-     * @param req_seq_id            流水号
      * @param async_return_url      异步通知回调地址
      * @return
      */
-    public static R<MerchantBasicdataVo> merchantBasicdataEnt(MgtShopHFTXAuthDto dto, String req_seq_id, String async_return_url){
+    public static R<MerchantBasicdataVo> merchantBasicdataEnt(MgtShopHFTXAuthDto dto, ShopAuthenticationHftx shopAuthenticationHftx, String async_return_url){
         String url = "https://api.huifu.com/v2/merchant/basicdata/ent";
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
         JSONObject data = new JSONObject();
-        data.put("req_seq_id", req_seq_id);
+        data.put("req_seq_id", shopAuthenticationHftx.getReqSeqId());
         data.put("req_date", sdf.format(new Date()));
-        data.put("upper_huifu_id", huifu_id);
-        data.put("reg_name", dto.getReg_name());
-        data.put("short_name", dto.getShort_name());
-        data.put("ent_type", dto.getEnt_type());
-        data.put("license_code", dto.getLicense_code());
-        data.put("license_validity_type", dto.getLicense_validity_type());
-        data.put("license_begin_date", dto.getLicense_begin_date());
-        if("0".equals(dto.getLicense_validity_type())){
-            data.put("license_end_date", dto.getLicense_end_date());
+        data.put("upper_huifu_id", channel_id);
+        data.put("reg_name", dto.getRegName());
+        data.put("short_name", dto.getShortName());
+        data.put("ent_type", dto.getEntType());
+        data.put("license_code", dto.getLicenseCode());
+        data.put("license_validity_type", dto.getLicenseValidityType());
+        data.put("license_begin_date", dto.getLicenseBeginDate());
+        if("0".equals(dto.getLicenseValidityType())){
+            data.put("license_end_date", dto.getLicenseEndDate());
         }
-        data.put("reg_prov_id", dto.getReg_prov_id());
-        data.put("reg_area_id", dto.getReg_area_id());
-        data.put("reg_district_id", dto.getReg_district_id());
-        data.put("reg_detail", dto.getReg_detail());
-        data.put("legal_name", dto.getLegal_name());
-        data.put("legal_cert_type", dto.getLegal_cert_type());
-        data.put("legal_cert_no", dto.getLegal_cert_no());
-        data.put("legal_cert_validity_type", dto.getLegal_cert_validity_type());
-        data.put("legal_cert_begin_date", dto.getLegal_cert_begin_date());
-        if("0".equals(dto.getLegal_cert_validity_type())){
-            data.put("legal_cert_end_date", dto.getLegal_cert_end_date());
+        data.put("reg_prov_id", dto.getRegProvId());
+        data.put("reg_area_id", dto.getRegAreaId());
+        data.put("reg_district_id", dto.getRegDistrictId());
+        data.put("reg_detail", dto.getRegDetail());
+        data.put("legal_name", dto.getLegalName());
+        data.put("legal_cert_type", dto.getLegalCertType());
+        data.put("legal_cert_no", dto.getLegalCertNo());
+        data.put("legal_cert_validity_type", dto.getLegalCertValidityType());
+        data.put("legal_cert_begin_date", dto.getLegalCertBeginDate());
+        if("0".equals(dto.getLegalCertValidityType())){
+            data.put("legal_cert_end_date", dto.getLegalCertEndDate());
         }
-        data.put("prov_id", dto.getProv_id());
-        data.put("area_id", dto.getArea_id());
-        data.put("district_id", dto.getDistrict_id());
-        data.put("detail_addr", dto.getDetail_addr());
-        data.put("contact_name", dto.getContact_name());
-        data.put("contact_mobile_no", dto.getContact_mobile_no());
-        data.put("contact_email", dto.getContact_email());
-        data.put("service_phone", dto.getService_phone());
+        data.put("prov_id", dto.getProvId());
+        data.put("area_id", dto.getAreaId());
+        data.put("district_id", dto.getDistrictId());
+        data.put("detail_addr", dto.getDetailAddr());
+        data.put("contact_name", dto.getContactName());
+        data.put("contact_mobile_no", dto.getContactMobileNo());
+        data.put("contact_email", dto.getContactEmail());
+        data.put("service_phone", dto.getServicePhone());
         data.put("busi_type", "1");
-        data.put("receipt_name", dto.getReceipt_name());
+        data.put("receipt_name", dto.getReceiptName());
         data.put("mcc", "7297");
 
         //结算卡信息配置
+        dto.setCertType("00");
+        dto.setCertValidityType("1");
+        if(StringUtils.hasLength(dto.getCertEndDate())){
+            dto.setCertValidityType("0");
+        }
         JSONObject card_info = new JSONObject();
-        card_info.put("card_type", dto.getCard_type());
-        card_info.put("card_name", dto.getCard_name());
-        card_info.put("card_no", dto.getCard_no());
-        if(!"0".equals(dto.getCard_type())){
-            card_info.put("prov_id", dto.getJs_prov_id());
-            card_info.put("area_id", dto.getJs_area_id());
-            card_info.put("cert_type", dto.getCert_type());
+        card_info.put("card_type", dto.getCardType());
+        card_info.put("card_name", dto.getCardName());
+        card_info.put("card_no", dto.getCardNo());
+        if(!"0".equals(dto.getCardType())){
+            card_info.put("prov_id", dto.getJsProvId());
+            card_info.put("area_id", dto.getJsAreaId());
+            card_info.put("cert_type", dto.getCertType());
         }
-        if("0".equals(dto.getCard_type())){
-            card_info.put("branch_code", dto.getBranch_code());
+        if("0".equals(dto.getCardType())){
+            card_info.put("branch_code", dto.getBranchCode());
         }
-        card_info.put("cert_no", dto.getCert_no());
-        card_info.put("cert_validity_type", dto.getCert_validity_type());
-        if("0".equals(dto.getCert_validity_type())){
-            card_info.put("cert_end_date", dto.getCert_end_date());
+        card_info.put("cert_no", dto.getCertNo());
+        card_info.put("cert_validity_type", dto.getCertValidityType());
+        if("0".equals(dto.getCertValidityType())){
+            card_info.put("cert_end_date", dto.getCertEndDate());
         }
         card_info.put("mp", dto.getMp());
         data.put("card_info", card_info.toJSONString());
 
         //取现信息配置
+        JSONArray jsonArray = new JSONArray();
         JSONObject cash_config = new JSONObject();
         cash_config.put("cash_type", "T1");
         cash_config.put("fix_amt", "0.00");
-        data.put("cash_config", cash_config.toJSONString());
+        jsonArray.add(cash_config);
+        data.put("cash_config", jsonArray.toJSONString());
 
         //结算规则配置
         JSONObject settle_config = new JSONObject();
-        cash_config.put("settle_cycle", "T1");
-        cash_config.put("settle_pattern", "P0");
-        cash_config.put("settle_batch_no", "0");
-        cash_config.put("constant_amt", "0.00");
+        settle_config.put("settle_cycle", "T1");
+        settle_config.put("settle_pattern", "P0");
+        settle_config.put("settle_batch_no", "0");
+        settle_config.put("constant_amt", "0.00");
         data.put("settle_config", settle_config.toJSONString());
 
         data.put("async_return_url", async_return_url);
-        data.put("mer_icp", dto.getMer_icp());
-        data.put("open_licence_no", dto.getOpen_licence_no());
+//        data.put("mer_icp", dto.getMerIcp());
+        data.put("mer_icp", "");
+        data.put("open_licence_no", dto.getOpenLicenceNo());
         data.put("head_huifu_id", huifu_id);
-        data.put("reg_acct_pic", dto.getReg_acct_pic());
-        data.put("settle_card_front_pic", dto.getSettle_card_front_pic());
-        data.put("settle_cert_back_pic", dto.getSettle_cert_back_pic());
-        data.put("settle_cert_front_pic", dto.getSettle_cert_front_pic());
-        data.put("tax_reg_pic", dto.getTax_reg_pic());
-        data.put("legal_cert_back_pic", dto.getLegal_cert_back_pic());
-        data.put("legal_cert_front_pic", dto.getLegal_cert_front_pic());
-        data.put("license_pic", dto.getLicense_pic());
-        data.put("auth_enturst_pic", dto.getAuth_enturst_pic());
-        data.put("reg_capital", dto.getReg_capital());
-        data.put("business_scope", dto.getBusiness_scope());
-        data.put("found_date", dto.getFound_date());
-        data.put("scene_type", "ALL");
-        data.put("store_header_pic", dto.getStore_header_pic());
-        data.put("store_indoor_pic", dto.getStore_indoor_pic());
-        data.put("store_cashier_desk_pic", dto.getStore_cashier_desk_pic());
-        data.put("online_company_pic", dto.getOnline_company_pic());
-        data.put("online_company_area_pic", dto.getOnline_company_area_pic());
-        data.put("legal_mobile_no", dto.getLegal_mobile_no());
-        data.put("legal_addr", dto.getLegal_addr());
+        R<String> r = supplementaryPicture(dto.getRegAcctPic(), IdUtils.simpleUUID(), "F08");
+        if(r.getCode() == 200){
+            data.put("reg_acct_pic", r.getData());
+            shopAuthenticationHftx.setRegAcctPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        r = supplementaryPicture(dto.getSettleCardFrontPic(), IdUtils.simpleUUID(), "F13");
+        if(r.getCode() == 200){
+            data.put("settle_card_front_pic", r.getData());
+            shopAuthenticationHftx.setSettleCardFrontPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        r = supplementaryPicture(dto.getSettleCertBackPic(), IdUtils.simpleUUID(), "F56");
+        if(r.getCode() == 200){
+            data.put("settle_cert_back_pic", r.getData());
+            shopAuthenticationHftx.setSettleCertBackPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        r = supplementaryPicture(dto.getSettleCertFrontPic(), IdUtils.simpleUUID(), "F55");
+        if(r.getCode() == 200){
+            data.put("settle_cert_front_pic", r.getData());
+            shopAuthenticationHftx.setSettleCertFrontPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        r = supplementaryPicture(dto.getTaxRegPic(), IdUtils.simpleUUID(), "F58");
+        if(r.getCode() == 200){
+            data.put("tax_reg_pic", r.getData());
+            shopAuthenticationHftx.setTaxRegPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        r = supplementaryPicture(dto.getLegalCertBackPic(), IdUtils.simpleUUID(), "F03");
+        if(r.getCode() == 200){
+            data.put("legal_cert_back_pic", r.getData());
+            shopAuthenticationHftx.setLegalCertBackPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        r = supplementaryPicture(dto.getLegalCertFrontPic(), IdUtils.simpleUUID(), "F02");
+        if(r.getCode() == 200){
+            data.put("legal_cert_front_pic", r.getData());
+            shopAuthenticationHftx.setLegalCertFrontPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        r = supplementaryPicture(dto.getLicensePic(), IdUtils.simpleUUID(), "F07");
+        if(r.getCode() == 200){
+            data.put("license_pic", r.getData());
+            shopAuthenticationHftx.setLicensePicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        if(!dto.getLegalName().equals(dto.getCardName())){
+            r = supplementaryPicture(dto.getAuthEnturstPic(), IdUtils.simpleUUID(), "F15");
+            if(r.getCode() == 200){
+                data.put("auth_enturst_pic", r.getData());
+                shopAuthenticationHftx.setAuthEnturstPicNo(r.getData());
+            }else{
+                return R.fail(r.getMsg());
+            }
+        }
+        data.put("reg_capital", dto.getRegCapital());
+        data.put("business_scope", dto.getBusinessScope());
+        data.put("found_date", dto.getFoundDate());
+        data.put("scene_type", "OFFLINE");
+        r = supplementaryPicture(dto.getStoreHeaderPic(), IdUtils.simpleUUID(), "F22");
+        if(r.getCode() == 200){
+            data.put("store_header_pic", r.getData());
+            shopAuthenticationHftx.setStoreHeaderPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        r = supplementaryPicture(dto.getStoreIndoorPic(), IdUtils.simpleUUID(), "F24");
+        if(r.getCode() == 200){
+            data.put("store_indoor_pic", r.getData());
+            shopAuthenticationHftx.setStoreIndoorPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        r = supplementaryPicture(dto.getStoreCashierDeskPic(), IdUtils.simpleUUID(), "F105");
+        if(r.getCode() == 200){
+            data.put("store_cashier_desk_pic", r.getData());
+            shopAuthenticationHftx.setStoreCashierDeskPicNo(r.getData());
+        }else{
+            return R.fail(r.getMsg());
+        }
+        data.put("legal_mobile_no", dto.getLegalMobileNo());
+        data.put("legal_addr", dto.getLegalAddr());
 
         JSONObject body = new JSONObject();
         body.put("sys_id", huifu_id);
@@ -356,13 +473,15 @@
         headers.put("Accept", "application/json");
         post.addHeaders(headers);
         post.body(body.toJSONString());
+        System.out.println(JSON.toJSONString(body));
         HttpResponse execute = post.execute();
         String result = execute.body();
         execute.close();
         if(!StringUtils.hasLength(result)){
             return R.fail("请求异常");
         }
-        JSONObject resultData = JSON.parseObject(result);
+        JSONObject jsonObject = JSON.parseObject(result);
+        JSONObject resultData = jsonObject.getJSONObject("data");
         String resp_code = resultData.getString("resp_code");
         String resp_desc = resultData.getString("resp_desc");
         //处理成功
@@ -374,9 +493,9 @@
         MerchantBasicdataVo vo = new MerchantBasicdataVo();
         if(success1.equals(resp_code) || success2.equals(resp_code) || success3.equals(resp_code)){
             vo.setStatus(success1.equals(resp_code) ? 1 : success3.equals(resp_code) ? 2 : 3);
-            vo.setHuifu_id(resultData.getString("huifu_id"));
-            vo.setApply_no(resultData.getString("apply_no"));
-            vo.setToken_no(resultData.getString("token_no"));
+            vo.setHuifuId(resultData.getString("huifu_id"));
+            vo.setApplyNo(resultData.getString("apply_no"));
+            vo.setTokenNo(resultData.getString("token_no"));
             return R.ok(vo);
         }
         return R.fail(resp_desc);
@@ -388,7 +507,7 @@
      * @param jsonObject
      * @return
      */
-    public static R<MerchantBasicdataVo> merchantBasicdataEntNotify(JSONObject jsonObject){
+    public static R<MerchantBasicdataVo> merchantBasicDataNotify(JSONObject jsonObject){
         String ok = "200";
         String success = "10000";
         String resp_code = jsonObject.getString("resp_code");
@@ -405,11 +524,12 @@
             MerchantBasicdataVo vo = new MerchantBasicdataVo();
             if(success1.equals(sub_resp_code) || success2.equals(sub_resp_code) || success3.equals(sub_resp_code)){
                 vo.setStatus(success1.equals(sub_resp_code) ? 1 : success3.equals(sub_resp_code) ? 2 : 3);
-                vo.setAudit_status(data.getString("audit_status"));
-                vo.setAudit_desc(data.getString("audit_desc"));
-                vo.setHuifu_id(data.getString("huifu_id"));
-                vo.setApply_no(data.getString("apply_no"));
-                vo.setToken_no(data.getString("token_no"));
+                vo.setAuditStatus(data.getString("audit_status"));
+                vo.setAuditDesc(data.getString("audit_desc"));
+                vo.setHuifuId(data.getString("huifu_id"));
+                vo.setApplyNo(data.getString("apply_no"));
+                vo.setTokenNo(data.getString("token_no"));
+                vo.setReqSeqId(data.getString("req_seq_id"));
                 return R.ok(vo);
             }
             return R.fail(sub_resp_desc);
@@ -422,76 +542,129 @@
     /**
      * 个人商户进件
      * @param dto
-     * @param req_seq_id            流水号
      * @param async_return_url      异步通知回调地址
      * @return
      */
-    public static R<MerchantBasicdataVo> merchantBasicdataIndv(MgtShopHFTXAuthDto dto, String req_seq_id, String async_return_url){
+    public static R<MerchantBasicdataVo> merchantBasicdataIndv(MgtShopHFTXAuthDto dto, ShopAuthenticationHftx shopAuthenticationHftx, String async_return_url){
         String url = "https://api.huifu.com/v2/merchant/basicdata/indv";
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
         JSONObject data = new JSONObject();
-        data.put("req_seq_id", req_seq_id);
+        data.put("req_seq_id", shopAuthenticationHftx.getReqSeqId());
         data.put("req_date", sdf.format(new Date()));
-        data.put("upper_huifu_id", huifu_id);
-        data.put("reg_name", dto.getReg_name());
-        data.put("prov_id", dto.getProv_id());
-        data.put("area_id", dto.getArea_id());
-        data.put("district_id", dto.getDistrict_id());
-        data.put("detail_addr", dto.getDetail_addr());
-        data.put("contact_name", dto.getContact_name());
-        data.put("contact_mobile_no", dto.getContact_mobile_no());
-        data.put("contact_email", dto.getContact_email());
+        data.put("upper_huifu_id", channel_id);
+        data.put("reg_name", dto.getRegName());
+        data.put("prov_id", dto.getProvId());
+        data.put("area_id", dto.getAreaId());
+        data.put("district_id", dto.getDistrictId());
+        data.put("detail_addr", dto.getDetailAddr());
+        data.put("contact_name", dto.getContactName());
+        data.put("contact_mobile_no", dto.getContactMobileNo());
+        data.put("contact_email", dto.getContactEmail());
 
         //结算卡信息配置
+        dto.setCertType("00");
+        dto.setCertValidityType("1");
+        if(StringUtils.hasLength(dto.getCertEndDate())){
+            dto.setCertValidityType("0");
+        }
         JSONObject card_info = new JSONObject();
-        card_info.put("card_name", dto.getCard_name());
-        card_info.put("card_no", dto.getCard_no());
-        card_info.put("prov_id", dto.getJs_prov_id());
-        card_info.put("area_id", dto.getJs_area_id());
-        card_info.put("cert_type", dto.getCert_type());
-        card_info.put("cert_no", dto.getCert_no());
-        card_info.put("cert_validity_type", dto.getCert_validity_type());
-        card_info.put("cert_begin_date", dto.getCert_begin_date());
-        card_info.put("cert_end_date", dto.getCert_end_date());
+        card_info.put("card_name", dto.getCardName());
+        card_info.put("card_no", dto.getCardNo());
+        card_info.put("prov_id", dto.getJsProvId());
+        card_info.put("area_id", dto.getJsAreaId());
+        card_info.put("cert_type", dto.getCertType());
+        card_info.put("cert_no", dto.getCertNo());
+        card_info.put("cert_validity_type", dto.getCertValidityType());
+        card_info.put("cert_begin_date", dto.getCertBeginDate());
+        card_info.put("cert_end_date", dto.getCertEndDate());
         card_info.put("mp", dto.getMp());
         data.put("card_info", card_info.toJSONString());
 
         //取现信息配置
+        JSONArray jsonArray = new JSONArray();
         JSONObject cash_config = new JSONObject();
         cash_config.put("cash_type", "T1");
         cash_config.put("fix_amt", "0.00");
-        data.put("cash_config", cash_config.toJSONString());
+        jsonArray.add(cash_config);
+        data.put("cash_config", jsonArray.toJSONString());
 
         //结算规则配置
         JSONObject settle_config = new JSONObject();
-        cash_config.put("settle_cycle", "T1");
-        cash_config.put("settle_pattern", "P0");
-        cash_config.put("settle_batch_no", "0");
-        cash_config.put("constant_amt", "0.00");
+        settle_config.put("settle_cycle", "T1");
+        settle_config.put("settle_pattern", "P0");
+        settle_config.put("settle_batch_no", "0");
+        settle_config.put("constant_amt", "0.00");
         data.put("settle_config", settle_config.toJSONString());
 
         data.put("async_return_url", async_return_url);
-        data.put("mer_icp", dto.getMer_icp());
-        data.put("scene_type", "ALL");
-        data.put("legal_cert_no", dto.getLegal_cert_no());
-        data.put("legal_cert_validity_type", dto.getLegal_cert_validity_type());
-        data.put("legal_cert_begin_date", dto.getLegal_cert_begin_date());
-        data.put("legal_cert_end_date", dto.getLegal_cert_end_date());
-        data.put("legal_addr", dto.getLegal_addr());
-        data.put("legal_cert_back_pic", dto.getLegal_cert_back_pic());
-        data.put("legal_cert_front_pic", dto.getLegal_cert_front_pic());
+        data.put("mer_icp", dto.getMerIcp());
+        data.put("scene_type", "OFFLINE");
+        data.put("legal_cert_no", dto.getLegalCertNo());
+        data.put("legal_cert_validity_type", dto.getLegalCertValidityType());
+        data.put("legal_cert_begin_date", dto.getLegalCertBeginDate());
+        data.put("legal_cert_end_date", dto.getLegalCertEndDate());
+        data.put("legal_addr", dto.getLegalAddr());
+
+        R<String> r = supplementaryPicture(dto.getLegalCertBackPic(), IdUtils.simpleUUID(), "F03");
+        if(r.getCode() == 200){
+            data.put("legal_cert_back_pic", r.getData());
+            shopAuthenticationHftx.setLegalCertBackPicNo(r.getData());
+        }else{
+            return R.fail("【legalCertBackPic】" + r.getMsg());
+        }
+        r = supplementaryPicture(dto.getLegalCertFrontPic(), IdUtils.simpleUUID(), "F02");
+        if(r.getCode() == 200){
+            data.put("legal_cert_front_pic", r.getData());
+            shopAuthenticationHftx.setLegalCertFrontPicNo(r.getData());
+        }else{
+            return R.fail("【legalCertFrontPic】" + r.getMsg());
+        }
         data.put("mcc", "7297");
-        data.put("store_header_pic", dto.getStore_header_pic());
-        data.put("store_indoor_pic", dto.getStore_indoor_pic());
-        data.put("store_cashier_desk_pic", dto.getStore_cashier_desk_pic());
-        data.put("settle_card_front_pic", dto.getSettle_card_front_pic());
-        data.put("auth_enturst_pic", dto.getAuth_enturst_pic());
+        r = supplementaryPicture(dto.getStoreHeaderPic(), IdUtils.simpleUUID(), "F22");
+        if(r.getCode() == 200){
+            data.put("store_header_pic", r.getData());
+            shopAuthenticationHftx.setStoreHeaderPicNo(r.getData());
+        }else{
+            return R.fail("【storeHeaderPic】" + r.getMsg());
+        }
+        r = supplementaryPicture(dto.getStoreIndoorPic(), IdUtils.simpleUUID(), "F24");
+        if(r.getCode() == 200){
+            data.put("store_indoor_pic", r.getData());
+            shopAuthenticationHftx.setStoreIndoorPicNo(r.getData());
+        }else{
+            return R.fail("【storeIndoorPic】" + r.getMsg());
+        }
+        r = supplementaryPicture(dto.getStoreCashierDeskPic(), IdUtils.simpleUUID(), "F105");
+        if(r.getCode() == 200){
+            data.put("store_cashier_desk_pic", r.getData());
+            shopAuthenticationHftx.setStoreCashierDeskPicNo(r.getData());
+        }else{
+            return R.fail("【storeCashierDeskPic】" + r.getMsg());
+        }
+        r = supplementaryPicture(dto.getSettleCardFrontPic(), IdUtils.simpleUUID(), "F13");
+        if(r.getCode() == 200){
+            data.put("settle_card_front_pic", r.getData());
+            shopAuthenticationHftx.setSettleCardFrontPicNo(r.getData());
+        }else{
+            return R.fail("【settleCardFrontPic】" + r.getMsg());
+        }
+        //法人和结算卡户名不是同一个人需要授权委托书
+        if(!dto.getLegalName().equals(dto.getCardName())){
+            r = supplementaryPicture(dto.getAuthEnturstPic(), IdUtils.simpleUUID(), "F15");
+            if(r.getCode() == 200){
+                data.put("auth_enturst_pic", r.getData());
+                shopAuthenticationHftx.setAuthEnturstPicNo(r.getData());
+            }else{
+                return R.fail("【authEnturstPic】" + r.getMsg());
+            }
+        }
 
         JSONObject body = new JSONObject();
         body.put("sys_id", huifu_id);
         body.put("product_id", product_id);
         body.put("sign", sign(data.toJSONString()));
         body.put("data", data);
+        System.out.println(JSON.toJSONString(body));
         HttpRequest post = HttpUtil.createPost(url);
         Map<String, String> headers = new HashMap<>();
         headers.put("Content-type","application/json; charset=utf-8");
@@ -504,7 +677,8 @@
         if(!StringUtils.hasLength(result)){
             return R.fail("请求异常");
         }
-        JSONObject resultData = JSON.parseObject(result);
+        JSONObject jsonObject = JSON.parseObject(result);
+        JSONObject resultData = jsonObject.getJSONObject("data");
         String resp_code = resultData.getString("resp_code");
         String resp_desc = resultData.getString("resp_desc");
         //处理成功
@@ -516,9 +690,9 @@
         MerchantBasicdataVo vo = new MerchantBasicdataVo();
         if(success1.equals(resp_code) || success2.equals(resp_code) || success3.equals(resp_code)){
             vo.setStatus(success1.equals(resp_code) ? 1 : success3.equals(resp_code) ? 2 : 3);
-            vo.setHuifu_id(resultData.getString("huifu_id"));
-            vo.setApply_no(resultData.getString("apply_no"));
-            vo.setToken_no(resultData.getString("token_no"));
+            vo.setHuifuId(resultData.getString("huifu_id"));
+            vo.setApplyNo(resultData.getString("apply_no"));
+            vo.setTokenNo(resultData.getString("token_no"));
             return R.ok(vo);
         }
         return R.fail(resp_desc);
@@ -526,39 +700,6 @@
 
 
 
-    /**
-     * 个人商户进件通知回调处理
-     * @param jsonObject
-     * @return
-     */
-    public static R<MerchantBasicdataVo> merchantBasicdataIndvNotify(JSONObject jsonObject){
-        String ok = "200";
-        String success = "10000";
-        String resp_code = jsonObject.getString("resp_code");
-        if(ok.equals(resp_code) || success.equals(resp_code)){
-            JSONObject data = jsonObject.getJSONObject("data");
-            String sub_resp_code = data.getString("sub_resp_code");
-            String sub_resp_desc = data.getString("sub_resp_desc");
-            //处理成功
-            String success1 = "00000000";
-            //交易正在处理中
-            String success2 = "00000100";
-            //审核中
-            String success3 = "90000000";
-            MerchantBasicdataVo vo = new MerchantBasicdataVo();
-            if(success1.equals(sub_resp_code) || success2.equals(sub_resp_code) || success3.equals(sub_resp_code)){
-                vo.setStatus(success1.equals(sub_resp_code) ? 1 : success3.equals(sub_resp_code) ? 2 : 3);
-                vo.setAudit_status(data.getString("audit_status"));
-                vo.setAudit_desc(data.getString("audit_desc"));
-                vo.setHuifu_id(data.getString("huifu_id"));
-                vo.setApply_no(data.getString("apply_no"));
-                vo.setToken_no(data.getString("token_no"));
-                return R.ok(vo);
-            }
-            return R.fail(sub_resp_desc);
-        }
-        return R.fail(jsonObject.getString("resp_desc"));
-    }
 
 
     /**
@@ -593,7 +734,6 @@
             mEntityBuilder.addTextBody("product_id", product_id, contentType);
             mEntityBuilder.addTextBody("data", data, contentType);
             mEntityBuilder.addBinaryBody("file", file);
-
             httpPost.setEntity(mEntityBuilder.build());
             response = httpclient1.execute(httpPost);
             int statusCode = response.getStatusLine().getStatusCode();
@@ -623,40 +763,24 @@
 
 
     /**
-     * 商户分账配置
-     * @param req_seq_id            流水号
-     * @param huifuId               商户号
-     * @param apply_ratio           最大分账比例
-     * @param async_return_url      回调通知
+     * 确认交易
+     * @param req_seq_id        流水号
+     * @param org_req_seq_id    原交易请求流水号
+     * @param acctInfos        分账明细
      * @return
      */
-    public static R<String> merchantSplitConfig(String req_seq_id, String huifuId, Double apply_ratio, String async_return_url){
-        NumberFormat numberInstance = NumberFormat.getInstance();
-        //最大两位小数
-        numberInstance.setMaximumFractionDigits(2);
-        String url = "https://api.huifu.com/v2/merchant/split/config";
+    public static R<PaymentDelaytransHFTXVo> paymentDelaytrans(String req_seq_id, String org_req_seq_id, JSONArray acctInfos){
+        String url = "https://api.huifu.com/v2/trade/payment/delaytrans/confirm";
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
         JSONObject data = new JSONObject();
         data.put("req_seq_id", req_seq_id);
         data.put("req_date", sdf.format(new Date()));
-        data.put("huifu_id", huifuId);
-        data.put("rule_origin", "01");
-        data.put("div_flag", "Y");
-        data.put("apply_ratio", numberInstance.format(apply_ratio));
-        data.put("start_type", "0");
-        data.put("async_return_url", async_return_url);
-        data.put("scene", "");
+        data.put("huifu_id", huifu_id);
+        data.put("org_req_seq_id", org_req_seq_id);
 
-        JSONObject file_list = new JSONObject();
-        file_list.put("file_id", "");
-        data.put("file_list", file_list.toJSONString());
-
-        JSONObject split_ext_info = new JSONObject();
-        split_ext_info.put("busi_instruction", "");
-        split_ext_info.put("capital_instruction", "");
-        split_ext_info.put("function_instruction", "");
-        data.put("split_ext_info", split_ext_info.toJSONString());
-        data.put("online_busi_type", "");
+        JSONObject acct_infos = new JSONObject();
+        acct_infos.put("acct_infos", acctInfos);
+        data.put("acct_split_bunch", acct_infos.toJSONString());
 
         JSONObject body = new JSONObject();
         body.put("sys_id", huifu_id);
@@ -685,36 +809,81 @@
         //审核中
         String success3 = "90000000";
         if(success1.equals(resp_code) || success2.equals(resp_code) || success3.equals(resp_code)){
-            return R.ok(resultData.getString("apply_no"));
+            PaymentDelaytransHFTXVo vo = new PaymentDelaytransHFTXVo();
+            vo.setTransStat(resultData.getString("trans_stat"));
+            vo.setReqSeqId(resultData.getString("req_seq_id"));
+            vo.setHfSeqId(resultData.getString("hf_seq_id"));
+            vo.setOrgReqSeqId(resultData.getString("org_req_seq_id"));
+            return R.ok(vo);
         }
         return R.fail(resp_desc);
     }
 
 
     /**
-     * 商户分账配置回调处理
-     * @param jsonObject
+     * 查询结算记录
+     * @param req_seq_id    流水号
+     * @param huifu_id      商户号
+     * @param begin_date    开始日期
+     * @param end_date      结束日期
+     * @param page_num      分页页码,不传则默认为第1页
+     * @param page_size     分页条数
      * @return
      */
-    public static R<MerchantBasicdataVo> merchantSplitConfigNotify(JSONObject jsonObject){
-        String sub_resp_code = jsonObject.getString("sub_resp_code");
-        String sub_resp_desc = jsonObject.getString("sub_resp_desc");
+    public static R<List<MerchantBasicdataSettlementVo>> getMerchantBasicdataSettlement(String req_seq_id, String huifu_id, String begin_date, String end_date, String page_num, String page_size){
+        String url = "https://api.huifu.com/v2/merchant/basicdata/settlement/query";
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        JSONObject data = new JSONObject();
+        data.put("req_seq_id", req_seq_id);
+        data.put("req_date", sdf.format(new Date()));
+        data.put("huifu_id", huifu_id);
+        data.put("begin_date", begin_date);
+        data.put("end_date", end_date);
+        data.put("page_num", page_num);
+        data.put("page_size", page_size);
+        data.put("sort_order", "DESC");
+
+        JSONObject body = new JSONObject();
+        body.put("sys_id", huifu_id);
+        body.put("product_id", product_id);
+        body.put("sign", sign(data.toJSONString()));
+        body.put("data", data);
+        HttpRequest post = HttpUtil.createPost(url);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-type","application/json; charset=utf-8");
+        headers.put("Accept", "application/json");
+        post.addHeaders(headers);
+        post.body(body.toJSONString());
+        HttpResponse execute = post.execute();
+        String result = execute.body();
+        execute.close();
+        if(!StringUtils.hasLength(result)){
+            return R.fail("请求异常");
+        }
+        JSONObject resultData = JSON.parseObject(result).getJSONObject("data");
+        String resp_code = resultData.getString("resp_code");
+        String resp_desc = resultData.getString("resp_desc");
         //处理成功
         String success1 = "00000000";
-        //交易正在处理中
-        String success2 = "00000100";
-        //审核中
-        String success3 = "90000000";
-        MerchantBasicdataVo vo = new MerchantBasicdataVo();
-        if(success1.equals(sub_resp_code) || success2.equals(sub_resp_code) || success3.equals(sub_resp_code)){
-            vo.setStatus(success1.equals(sub_resp_code) ? 1 : success3.equals(sub_resp_code) ? 2 : 3);
-            vo.setAudit_status(jsonObject.getString("audit_status"));
-            vo.setAudit_desc(jsonObject.getString("audit_desc"));
-            vo.setHuifu_id(jsonObject.getString("huifu_id"));
-            vo.setApply_no(jsonObject.getString("apply_no"));
-            return R.ok(vo);
+        if(success1.equals(resp_code)){
+            JSONArray trans_log_result_list = resultData.getJSONArray("trans_log_result_list");
+            List<MerchantBasicdataSettlementVo> list = new ArrayList<>();
+            if(null ==  trans_log_result_list){
+                return R.ok(list);
+            }
+            for (int i = 0; i < trans_log_result_list.size(); i++) {
+                JSONObject jsonObject = trans_log_result_list.getJSONObject(i);
+                MerchantBasicdataSettlementVo vo = new MerchantBasicdataSettlementVo();
+                vo.setTransId(jsonObject.getString("trans_id"));
+                vo.setTransDate(jsonObject.getString("trans_date"));
+                vo.setCardNo(jsonObject.getString("card_no"));
+                vo.setTransAmt(jsonObject.getString("trans_amt"));
+                vo.setFeeAmt(jsonObject.getString("fee_amt"));
+                vo.setTransStat(jsonObject.getString("trans_stat"));
+                list.add(vo);
+            }
+            return R.ok(list);
         }
-        return R.fail(sub_resp_desc);
+        return R.fail(resp_desc);
     }
-
 }

--
Gitblit v1.7.1