package com.ruoyi.shop.util;
|
|
import cn.hutool.http.*;
|
import com.alibaba.fastjson.JSON;
|
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.MerchantBasicDataNotifyDto;
|
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;
|
import org.apache.http.entity.mime.MultipartEntityBuilder;
|
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.nio.charset.Charset;
|
import java.security.KeyFactory;
|
import java.security.PrivateKey;
|
import java.security.PublicKey;
|
import java.security.Signature;
|
import java.security.spec.PKCS8EncodedKeySpec;
|
import java.security.spec.X509EncodedKeySpec;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
/**
|
* 汇付天下工具类
|
* @author zhibing.pu
|
* @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 publicKeyBase64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArOufL7/+lXaEhssa+4FTcZbBRigtkROCN0twu/H+7dvbeqEpu7XUVK/gfyNVbVdT7NkkDKhvoFKS4lWxxI/lPD4670obenATaaoZ1IwQEhITtM3giVzY986hA4+wp8w21M7mVmQ8ixGki0WlW/w0lt+A9Bg7BlqSDC7ov5Z7m1wmDDbFCQYEZlf7Ur+7wKVaJN2ig6GJGTA4X5yq28U7VpA38DSwwiJwd9NGGxnje4YRAkXrLZLcph8NCO/Md4PqXczijkqH6nR8gQnplYDgbdofqLpVVOuY3OaJNL8Ice7JNvotw8P0v4cd36ZzgE6C4aRUkwqgKxucDoYjk1+UUQIDAQAB";
|
//汇付公钥
|
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 = "/home/hongruitang/shop/flies";
|
//接口文档https://paas.huifu.com/partners/api/#/
|
|
|
|
/**
|
* 微信小程序支付
|
* @param req_seq_id 支付流水号
|
* @param goods_desc 商品描述
|
* @param trans_amt 支付金额
|
* @param sub_openid 微信小程序用户openid
|
* @param 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");
|
String url = "https://api.huifu.com/v2/trade/payment/jspay";
|
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("goods_desc", goods_desc);
|
data.put("trade_type", "T_MINIAPP");
|
data.put("trans_amt", String.format("%.2f", trans_amt));
|
|
JSONObject wx_data = new JSONObject();
|
wx_data.put("sub_appid", sub_appid);
|
wx_data.put("sub_openid", sub_openid);
|
data.put("wx_data", wx_data.toJSONString());
|
data.put("notify_url", notify_url);
|
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);
|
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");
|
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);
|
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)){
|
JSONObject pay_info = resultData.getJSONObject("pay_info");
|
return R.ok(pay_info);
|
}
|
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");
|
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", 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);
|
|
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 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";
|
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);
|
}
|
|
|
|
|
/**
|
* RSA私钥签名:签名方式SHA256WithRSA
|
* @param data 待签名字符串
|
* @return 签名byte[]
|
* @throws Exception
|
*/
|
public static String sign(String data) {
|
//先对该json对象数据按照参数字典顺序(参数名ASCII码从小到大排序,参数名区分大小写)排序生成字符串,再进行加签和验签。
|
data = JSON.toJSONString(JSONObject.parseObject(data, TreeMap.class));
|
// Base64 --> Key
|
try {
|
byte[] bytes = Base64.getDecoder().decode(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私钥签名:签名方式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公钥验签
|
* @param data 待签名字符串
|
* @return 验签结果
|
* @throws Exception
|
*/
|
public static boolean verify(String data, String sign) {
|
//先对该json对象数据按照参数字典顺序(参数名ASCII码从小到大排序,参数名区分大小写)排序生成字符串,再进行加签和验签。
|
data = JSON.toJSONString(JSONObject.parseObject(data, TreeMap.class));
|
// Base64 --> Key
|
try {
|
byte[] bytes = Base64.getDecoder().decode(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;
|
}
|
}
|
|
|
/**
|
* 使用汇付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;
|
}
|
}
|
|
|
/**
|
* 商户进件
|
* @param dto
|
* @param async_return_url 异步通知回调地址
|
* @return
|
*/
|
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", shopAuthenticationHftx.getReqSeqId());
|
data.put("req_date", sdf.format(new 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.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("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_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.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());
|
}
|
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("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);
|
}
|
|
|
/**
|
* 企业进件通知回调处理
|
* @return
|
*/
|
public static R<MerchantBasicdataVo> merchantBasicDataNotify(MerchantBasicDataNotifyDto dto){
|
String ok = "200";
|
String success = "10000";
|
String resp_code = dto.getResp_code();
|
if(ok.equals(resp_code) || success.equals(resp_code)){
|
JSONObject data = JSON.parseObject(dto.getData());
|
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.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);
|
}
|
return R.fail(dto.getResp_desc());
|
}
|
|
|
|
/**
|
* 个人商户进件
|
* @param dto
|
* @param async_return_url 异步通知回调地址
|
* @return
|
*/
|
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", shopAuthenticationHftx.getReqSeqId());
|
data.put("req_date", sdf.format(new Date()));
|
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.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");
|
jsonArray.add(cash_config);
|
data.put("cash_config", jsonArray.toJSONString());
|
|
//结算规则配置
|
JSONObject settle_config = new JSONObject();
|
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.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");
|
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);
|
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");
|
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 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 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);
|
}
|
|
|
|
/**
|
* 上传文件
|
* @param file_url 文件网络地址
|
* @param req_seq_id 流水号
|
* @param file_type 文件类型
|
* @return
|
*/
|
public static R<String> supplementaryPicture(String file_url, String req_seq_id, String file_type){
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
String url = "https://api.huifu.com/v2/supplementary/picture";
|
// 请求参数
|
Map<String, Object> params = new HashMap<String, Object>();
|
// 请求流水号,需保证当天商户下唯一,推荐采用日期时间+几位流水号的形式
|
params.put("req_seq_id", req_seq_id);
|
params.put("req_date", sdf.format(new Date()));
|
params.put("file_type", file_type);
|
params.put("huifu_id", huifu_id);
|
String data = JSON.toJSONString(params);
|
File file = HttpUtil.downloadFileFromUrl(file_url, path);
|
|
CloseableHttpClient httpclient1 = HttpClients.createDefault();
|
CloseableHttpResponse response = null;
|
String result = null;
|
|
try {
|
HttpPost httpPost = new HttpPost(url);
|
org.apache.http.entity.ContentType contentType = org.apache.http.entity.ContentType.create("text/plain", Charset.forName("UTF-8"));
|
MultipartEntityBuilder mEntityBuilder = MultipartEntityBuilder.create();
|
mEntityBuilder.addTextBody("sys_id", huifu_id, contentType);
|
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();
|
if (statusCode == org.apache.http.HttpStatus.SC_OK) {
|
HttpEntity resEntity = response.getEntity();
|
result = EntityUtils.toString(resEntity);
|
logger.info(result);
|
}
|
if(!StringUtils.hasLength(result)){
|
return R.fail("请求异常");
|
}
|
JSONObject results = JSON.parseObject(result);
|
JSONObject resultData = results.getJSONObject("data");
|
String resp_code = resultData.getString("resp_code");
|
String resp_desc = resultData.getString("resp_desc");
|
//成功
|
String success1 = "00000000";
|
if(success1.equals(resp_code)){
|
return R.ok(resultData.getString("file_id"));
|
}
|
return R.fail(resp_desc);
|
} catch (IOException e) {
|
e.printStackTrace();
|
return R.fail("请求异常");
|
}
|
}
|
|
|
/**
|
* 确认交易
|
* @param req_seq_id 流水号
|
* @param org_req_seq_id 原交易请求流水号
|
* @param acctInfos 分账明细
|
* @return
|
*/
|
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", huifu_id);
|
data.put("org_req_seq_id", org_req_seq_id);
|
|
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);
|
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";
|
if(success1.equals(resp_code) || success2.equals(resp_code) || success3.equals(resp_code)){
|
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 req_seq_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 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", huifuId);
|
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", 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());
|
System.err.println("分账报文:\n" + 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";
|
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(resp_desc);
|
}
|
|
public static void main(String[] args) {
|
R<List<MerchantBasicdataSettlementVo>> merchantBasicdataSettlement = HuiFuTianXiaUtil.getMerchantBasicdataSettlement(IdUtils.simpleUUID(), "6666000143736815", "20231123", "20231130", "1", "10");
|
System.err.println(JSON.toJSONString(merchantBasicdataSettlement));
|
}
|
}
|