| | |
| | | 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.MerchantBasicDataNotifyDto; |
| | | import com.ruoyi.shop.domain.dto.MgtShopHFTXAuthDto; |
| | | import com.ruoyi.shop.domain.pojo.shop.ShopAuthenticationHftx; |
| | | import com.ruoyi.shop.domain.vo.MerchantBasicdataSettlementVo; |
| | |
| | | import org.apache.http.impl.client.CloseableHttpClient; |
| | | import org.apache.http.impl.client.HttpClients; |
| | | import org.apache.http.util.EntityUtils; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | 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; |
| | |
| | | import java.security.Signature; |
| | | import java.security.spec.PKCS8EncodedKeySpec; |
| | | import java.security.spec.X509EncodedKeySpec; |
| | | import java.text.NumberFormat; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | |
| | |
| | | * @Date 2023/10/12 0:02 |
| | | */ |
| | | public class HuiFuTianXiaUtil { |
| | | private static Logger logger = LoggerFactory.getLogger(HuiFuTianXiaUtil.class); |
| | | //私钥(Base64编码) |
| | | 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 publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAral1nmqS1vswaeFp3dAfUY4a/ql07382AMH4NOwewtf9iuiZa608hDVzGYIXYAr+mxj1WwJpSCp9Sn+zSJs4+9iGodMa9qfUQ4oi32zGKR1ND7OZwpXYZudqQrUfC8/0j1DjOWBlKWyqwIh2JLXOiJLrU+dbDJxCqyHv+rO55egjD5yVLEJLkB/n1peIsfbqozKu7rpkx4bUAP1PvMmP913np2gYKsTrjGo7B/NqzkQ98mtL/VMOIbha0qN+MpEWImT/mOlgxvmr7YnTr3e7Iu/gSm8HR/5kLqmO4WmHALnoq7vDnOWpyM7c+awIxRTwoT8mwCuxPTLBUZ5UEmpIYwIDAQAB"; |
| | | //商户号 |
| | | private static String huifu_id = "6666000141279152"; |
| | | //控制台地址https://dashboard.huifu.com/customers/login,用户名为hh_hrt,最新密码为xw123456 |
| | | |
| | | //私钥(Base64编码) |
| | | private static String channel_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=="; |
| | | //公钥(Base64编码) |
| | | private static String channel_publicKeyBase64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgexZafuBbkQb1uBS8eRaEfx249VFiW4LfSQIDuYghUfTIcV7u/N4bz/PEkxVsjZAngIfRCMFXCcZvNCprfOyh+DcKNXo36hfJFJCtNm8lW8t/X6kyZcqng2Co6qnNOBqZy+74uIg+Kyhr48iSBcXpAnDkkxVlZfO/X2z5/fpY7Fa646Ms2zzLzyRz7nNnc5Fj/fAvsuUBQyHY8kvDa1TqSXMFRa3MZJgpiums04uiyXiP8B/TLCR5pxfWYpamNcdNF20zMROBH04F4Jr+nb0WnOla6kKMFAqiKx6VSSHXrdcOer5s9yKcTkSDj81Np2Pc4mazCIBpCdWy0EWyytkVwIDAQAB"; |
| | | //汇付公钥 |
| | | private static String channel_publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgmGZVY0i5r17BnHiLeL7TbqojpuOmR947JIUB5zYcc/TTYijkCsjtshmvxWslZBdkV6K8/1CmHRAY92+4GZnem6MVO34xn1wTCq65+wMC1oypjJy9T6N0WXoGaf+Wn0nxPdJLvnwpOo6epEES3kQKx+i/Qar7oDwlXMQ6b2QwR/id9cYudN0RmdRLzkmrwEOkjv+WcWCQdoAXv4JWJwU+iwJffoJrWn5pGeVFWFrH1fRJ0IB4YdaL9aWMn2YM5pu+/mcOKQogmNYzsHkZDapX3AF+es0TN+v/qOCgU3OVTVa7ltDAiLuPtMeu/72pQiM0nxunRVnAJDo2BQ5mu6z4wIDAQAB"; |
| | | //渠道号 |
| | | private static String channel_id = "6666000140729384"; |
| | | //控制台地址https://dashboard.huifu.com/partners/login,用户名为hongrt,最新密码为xw123456 |
| | | |
| | | //产品号 |
| | | private static String product_id = "KAZX"; |
| | | //微信小程序appid |
| | | private static String sub_appid = "wxb7f0ea286fc4e535"; |
| | | //本地文件存储位置 |
| | | private static String path = "D:\\file"; |
| | | //控制台地址https://dashboard.huifu.com/customers/login,用户名为hongruitang,最新密码为xw123456 |
| | | private static String path = "/home/hongruitang/shop/flies"; |
| | | //接口文档https://paas.huifu.com/partners/api/#/ |
| | | |
| | | |
| | |
| | | * @param sub_openid 微信小程序用户openid |
| | | * @param notify_url 异步通知回调地址 |
| | | */ |
| | | public static R weixinPayment(String req_seq_id, String goods_desc, Double trans_amt, String sub_openid, String notify_url){ |
| | | public static R<JSONObject> 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(); |
| | | //最大两位小数 |
| | | numberInstance.setMaximumFractionDigits(2); |
| | | String url = "https://api.huifu.com/v2/trade/payment/jspay"; |
| | | JSONObject data = new JSONObject(); |
| | | data.put("req_date", sdf.format(new Date())); |
| | |
| | | data.put("huifu_id", huifu_id); |
| | | data.put("goods_desc", goods_desc); |
| | | data.put("trade_type", "T_MINIAPP"); |
| | | data.put("trans_amt", numberInstance.format(trans_amt)); |
| | | data.put("trans_amt", String.format("%.2f", trans_amt)); |
| | | |
| | | JSONObject wx_data = new JSONObject(); |
| | | wx_data.put("sub_appid", sub_appid); |
| | |
| | | body.put("product_id", product_id); |
| | | body.put("sign", sign(data.toJSONString())); |
| | | body.put("data", data); |
| | | System.out.print(JSON.toJSONString(body)); |
| | | logger.info(JSON.toJSONString(body)); |
| | | HttpRequest post = HttpUtil.createPost(url); |
| | | Map<String, String> headers = new HashMap<>(); |
| | | headers.put("Content-type","application/json; charset=utf-8"); |
| | |
| | | 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"); |
| | |
| | | String success1 = "00000000"; |
| | | String success2 = "00000100"; |
| | | if(success1.equals(resp_code) || success2.equals(resp_code)){ |
| | | |
| | | JSONObject pay_info = resultData.getJSONObject("pay_info"); |
| | | return R.ok(pay_info); |
| | | } |
| | | return R.fail(resp_desc); |
| | | } |
| | |
| | | */ |
| | | 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("ord_amt", String.format("%.2f", 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); |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * RSA私钥签名:签名方式SHA256WithRSA |
| | | * @param data 待签名字符串 |
| | | * @return 签名byte[] |
| | | * @throws Exception |
| | | */ |
| | | public static String channel_sign(String data) { |
| | | //先对该json对象数据按照参数字典顺序(参数名ASCII码从小到大排序,参数名区分大小写)排序生成字符串,再进行加签和验签。 |
| | | data = JSON.toJSONString(JSONObject.parseObject(data, TreeMap.class)); |
| | | // Base64 --> Key |
| | | try { |
| | | byte[] bytes = Base64.getDecoder().decode(channel_privateKeyBase64); |
| | | PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); |
| | | KeyFactory keyFactory; |
| | | keyFactory = KeyFactory.getInstance("RSA"); |
| | | PrivateKey privateKey = keyFactory.generatePrivate(keySpec); |
| | | // Sign |
| | | Signature signature = Signature.getInstance("SHA256WithRSA"); |
| | | signature.initSign(privateKey); |
| | | signature.update(data.getBytes("UTF-8")); |
| | | return Base64.getEncoder().encodeToString(signature.sign()); |
| | | } catch (Exception e) { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 使用汇付RSA公钥验签 |
| | |
| | | e.printStackTrace(); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 使用汇付RSA公钥验签 |
| | | * @param data 待签名字符串 |
| | | * @return 验签结果 |
| | | * @throws Exception |
| | | */ |
| | | public static boolean channel_verify(String data, String sign) { |
| | | //先对该json对象数据按照参数字典顺序(参数名ASCII码从小到大排序,参数名区分大小写)排序生成字符串,再进行加签和验签。 |
| | | data = JSON.toJSONString(JSONObject.parseObject(data, TreeMap.class)); |
| | | // Base64 --> Key |
| | | try { |
| | | byte[] bytes = Base64.getDecoder().decode(channel_publicKeyBase64); |
| | | X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); |
| | | KeyFactory keyFactory; |
| | | keyFactory = KeyFactory.getInstance("RSA"); |
| | | PublicKey publicKey = keyFactory.generatePublic(keySpec); |
| | | // verify |
| | | Signature signature = Signature.getInstance("SHA256WithRSA"); |
| | | signature.initVerify(publicKey); |
| | | signature.update(data.getBytes("UTF-8")); |
| | | return signature.verify(Base64.getDecoder().decode(sign)); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | // 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("head_huifu_id", huifu_id); |
| | | R<String> r = supplementaryPicture(dto.getRegAcctPic(), IdUtils.simpleUUID(), "F08"); |
| | | if(r.getCode() == 200){ |
| | | data.put("reg_acct_pic", 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()); |
| | | if(!"0".equals(dto.getCardType())){ |
| | | 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){ |
| | |
| | | }else{ |
| | | return R.fail(r.getMsg()); |
| | | } |
| | | if(!dto.getLegalName().equals(dto.getCardName())){ |
| | | if(!"0".equals(dto.getCardType()) && !dto.getLegalName().equals(dto.getCardName())){ |
| | | r = supplementaryPicture(dto.getAuthEnturstPic(), IdUtils.simpleUUID(), "F15"); |
| | | if(r.getCode() == 200){ |
| | | data.put("auth_enturst_pic", r.getData()); |
| | |
| | | headers.put("Accept", "application/json"); |
| | | post.addHeaders(headers); |
| | | post.body(body.toJSONString()); |
| | | System.out.println(JSON.toJSONString(body)); |
| | | logger.info(JSON.toJSONString(body)); |
| | | HttpResponse execute = post.execute(); |
| | | String result = execute.body(); |
| | | execute.close(); |
| | |
| | | |
| | | /** |
| | | * 企业进件通知回调处理 |
| | | * @param jsonObject |
| | | * @return |
| | | */ |
| | | public static R<MerchantBasicdataVo> merchantBasicDataNotify(JSONObject jsonObject){ |
| | | public static R<MerchantBasicdataVo> merchantBasicDataNotify(MerchantBasicDataNotifyDto dto){ |
| | | String ok = "200"; |
| | | String success = "10000"; |
| | | String resp_code = jsonObject.getString("resp_code"); |
| | | String resp_code = dto.getResp_code(); |
| | | if(ok.equals(resp_code) || success.equals(resp_code)){ |
| | | JSONObject data = jsonObject.getJSONObject("data"); |
| | | JSONObject data = JSON.parseObject(dto.getData()); |
| | | String sub_resp_code = data.getString("sub_resp_code"); |
| | | String sub_resp_desc = data.getString("sub_resp_desc"); |
| | | //处理成功 |
| | |
| | | } |
| | | return R.fail(sub_resp_desc); |
| | | } |
| | | return R.fail(jsonObject.getString("resp_desc")); |
| | | return R.fail(dto.getResp_desc()); |
| | | } |
| | | |
| | | |
| | |
| | | body.put("product_id", product_id); |
| | | body.put("sign", sign(data.toJSONString())); |
| | | body.put("data", data); |
| | | System.out.println(JSON.toJSONString(body)); |
| | | logger.info(JSON.toJSONString(body)); |
| | | HttpRequest post = HttpUtil.createPost(url); |
| | | Map<String, String> headers = new HashMap<>(); |
| | | headers.put("Content-type","application/json; charset=utf-8"); |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 修改商户信息 |
| | | * @param dto |
| | | * @param shopAuthenticationHftx |
| | | * @param async_return_url |
| | | * @return |
| | | */ |
| | | public static R<MerchantBasicdataVo> merchantBasicdataModify(MgtShopHFTXAuthDto dto, ShopAuthenticationHftx shopAuthenticationHftx, String async_return_url){ |
| | | String url = "https://api.huifu.com/v2/merchant/basicdata/modify"; |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); |
| | | JSONObject data = new JSONObject(); |
| | | data.put("req_seq_id", shopAuthenticationHftx.getReqSeqId()); |
| | | data.put("req_date", sdf.format(new Date())); |
| | | data.put("upper_huifu_id", channel_id); |
| | | data.put("huifu_id", shopAuthenticationHftx.getHuifuId()); |
| | | 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.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.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.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.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.getCardType())){ |
| | | card_info.put("branch_code", dto.getBranchCode()); |
| | | } |
| | | 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("switch_state", "1"); |
| | | cash_config.put("cash_type", "T1"); |
| | | cash_config.put("fix_amt", "0.00"); |
| | | jsonArray.add(cash_config); |
| | | data.put("cash_config", jsonArray.toJSONString()); |
| | | |
| | | //结算规则配置 |
| | | JSONObject settle_config = new JSONObject(); |
| | | settle_config.put("settle_status", "1"); |
| | | 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()); |
| | | |
| | | //协议 |
| | | JSONObject agreement_info = new JSONObject(); |
| | | agreement_info.put("agreement_type", "1"); |
| | | agreement_info.put("agree_begin_date", dto.getAgreeBeginDate()); |
| | | agreement_info.put("agree_end_date", dto.getAgreeEndDate()); |
| | | data.put("agreement_info", agreement_info.toJSONString()); |
| | | |
| | | //扩展资料包 |
| | | JSONArray extended_material_list = new JSONArray(); |
| | | |
| | | data.put("async_return_url", async_return_url); |
| | | // data.put("mer_icp", dto.getMerIcp()); |
| | | data.put("mer_icp", ""); |
| | | data.put("open_licence_no", dto.getOpenLicenceNo()); |
| | | data.put("head_huifu_id", huifu_id); |
| | | 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()); |
| | | } |
| | | if(!"0".equals(dto.getCardType())){ |
| | | 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()); |
| | | } |
| | | r = supplementaryPicture(dto.getSettleAgreePic(), IdUtils.simpleUUID(), "F116"); |
| | | if(r.getCode() == 200){ |
| | | JSONObject extended_material = new JSONObject(); |
| | | extended_material.put("file_id", r.getData()); |
| | | extended_material.put("file_type", "F480"); |
| | | extended_material_list.add(extended_material); |
| | | shopAuthenticationHftx.setSettleAgreePicNo(r.getData()); |
| | | }else{ |
| | | return R.fail(r.getMsg()); |
| | | } |
| | | if(!"0".equals(dto.getCardType()) && !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("extended_material_list", extended_material_list.toJSONString()); |
| | | 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); |
| | | 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()); |
| | | logger.info(JSON.toJSONString(body)); |
| | | HttpResponse execute = post.execute(); |
| | | String result = execute.body(); |
| | | execute.close(); |
| | | if(!StringUtils.hasLength(result)){ |
| | | return R.fail("请求异常"); |
| | | } |
| | | JSONObject jsonObject = JSON.parseObject(result); |
| | | JSONObject resultData = jsonObject.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(resp_code) || success2.equals(resp_code) || success3.equals(resp_code)){ |
| | | vo.setStatus(success1.equals(resp_code) ? 1 : success3.equals(resp_code) ? 2 : 3); |
| | | 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); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 查询商户信息 |
| | | * @param huifuId |
| | | * @return |
| | | */ |
| | | public static R<MerchantBasicdataVo> queryMerchantBasicdata(String req_seq_id, String huifuId){ |
| | | String url = "https://api.huifu.com/v2/merchant/basicdata/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", huifuId); |
| | | |
| | | JSONObject body = new JSONObject(); |
| | | body.put("sys_id", channel_id); |
| | | body.put("product_id", product_id); |
| | | body.put("sign", channel_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()); |
| | | logger.info(JSON.toJSONString(body)); |
| | | HttpResponse execute = post.execute(); |
| | | String result = execute.body(); |
| | | execute.close(); |
| | | if(!StringUtils.hasLength(result)){ |
| | | return R.fail("请求异常"); |
| | | } |
| | | JSONObject jsonObject = JSON.parseObject(result); |
| | | JSONObject resultData = jsonObject.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(resp_code) || success2.equals(resp_code) || success3.equals(resp_code)){ |
| | | JSONArray qry_cash_card_info_list = resultData.getJSONArray("qry_cash_card_info_list"); |
| | | JSONObject jsonObject1 = qry_cash_card_info_list.getJSONObject(0); |
| | | vo.setTokenNo(jsonObject1.getString("token_no")); |
| | | return R.ok(vo); |
| | | } |
| | | return R.fail(resp_desc); |
| | | } |
| | | |
| | | |
| | | |
| | |
| | | if (statusCode == org.apache.http.HttpStatus.SC_OK) { |
| | | HttpEntity resEntity = response.getEntity(); |
| | | result = EntityUtils.toString(resEntity); |
| | | System.out.print(result); |
| | | logger.info(result); |
| | | } |
| | | if(!StringUtils.hasLength(result)){ |
| | | return R.fail("请求异常"); |
| | |
| | | /** |
| | | * 查询结算记录 |
| | | * @param req_seq_id 流水号 |
| | | * @param huifu_id 商户号 |
| | | * @param huifuId 商户号 |
| | | * @param begin_date 开始日期 |
| | | * @param end_date 结束日期 |
| | | * @param page_num 分页页码,不传则默认为第1页 |
| | | * @param page_size 分页条数 |
| | | * @return |
| | | */ |
| | | 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){ |
| | | public static R<List<MerchantBasicdataSettlementVo>> getMerchantBasicdataSettlement(String req_seq_id, String huifuId, 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("huifu_id", huifuId); |
| | | data.put("begin_date", begin_date); |
| | | data.put("end_date", end_date); |
| | | data.put("page_num", page_num); |
| | |
| | | data.put("sort_order", "DESC"); |
| | | |
| | | JSONObject body = new JSONObject(); |
| | | body.put("sys_id", huifu_id); |
| | | body.put("sys_id", channel_id); |
| | | body.put("product_id", product_id); |
| | | body.put("sign", sign(data.toJSONString())); |
| | | body.put("sign", channel_sign(data.toJSONString())); |
| | | body.put("data", data); |
| | | HttpRequest post = HttpUtil.createPost(url); |
| | | Map<String, String> headers = new HashMap<>(); |
| | |
| | | } |
| | | return R.fail(resp_desc); |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | R<List<MerchantBasicdataSettlementVo>> merchantBasicdataSettlement = HuiFuTianXiaUtil.getMerchantBasicdataSettlement(IdUtils.simpleUUID(), "6666000141606205", "20231110", "20231116", "1", "10"); |
| | | System.err.println(JSON.toJSONString(merchantBasicdataSettlement)); |
| | | } |
| | | } |