新增拉卡拉模块

This commit is contained in:
韩鹏辉 2023-08-04 15:54:55 +08:00
parent f96b4e1bfe
commit 222c206aca
23 changed files with 3129 additions and 418 deletions

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.chaozhanggui.system</groupId>
<artifactId>ysk-system</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>lkl-service-api</artifactId>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.chaozhanggui.system</groupId>
<artifactId>common-api</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.14</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.14</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,252 @@
package com.chaozhanggui.system.lkl.config;
import com.alipay.api.internal.util.file.IOUtils;
import com.chaozhanggui.common.system.config.MsgException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.*;
import java.security.*;
import java.security.cert.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
@Configuration
@ConfigurationProperties(prefix = "lkl")
@Data
@Slf4j
public class LakalaConfig {
/**
* API schema ,固定 LKLAPI-SHA256withRSA
*/
public final static String SCHEMA = "LKLAPI-SHA256withRSA";
private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final SecureRandom RANDOM = new SecureRandom();
private String privateKey;
private String appletsAppid;
private String appid;
private String mchSerialNo;
private String merchantNo;
private String vposId;
private String termNo;
private String apiUrl;
private String privateKeyPath;
private String certificatePath;
private String returncatePath;
private String callBackUrl;
private String pubKey;
public String request(String body,String mothod) {
String encode = encode("client_id:client_secret".getBytes());
System.out.println("base64:" + encode);
try {
String authorization = getAuthorization(body, this.getAppid(), this.getMchSerialNo(), this.getPrivateKeyPath());
HttpResponse lakalaResponse = post(this.apiUrl + mothod, body, authorization, "utf-8");
if (lakalaResponse.getStatusLine().getStatusCode() != 200) {
log.error("请求失败,statusCode:{},message:{}", lakalaResponse.getStatusLine(), IOUtils.toString(lakalaResponse.getEntity().getContent(), "utf-8"));
MsgException.throwException(IOUtils.toString(lakalaResponse.getEntity().getContent(), "utf-8"));
}
String appid = getHeadValue(lakalaResponse, "Lklapi-Appid");
String lklapiSerial = getHeadValue(lakalaResponse, "Lklapi-Serial");
String timestamp = getHeadValue(lakalaResponse, "Lklapi-Timestamp");
String nonce = getHeadValue(lakalaResponse, "Lklapi-Nonce");
String signature = getHeadValue(lakalaResponse, "Lklapi-Signature");
String responseStr = IOUtils.toString(lakalaResponse.getEntity().getContent(), "utf-8");
log.info("返回的信息为 responseStr:{}", responseStr);
String source = appid + "\n" + lklapiSerial + "\n" + timestamp + "\n" + nonce + "\n" + responseStr + "\n";
log.info("请求的数据为:{}", source);
X509Certificate lklCertificate = loadCertificate(new FileInputStream(new File(this.getCertificatePath())));
boolean verify = verify(lklCertificate, source.getBytes("utf-8"), signature);
if (verify) {
log.info("验签通过");
return responseStr;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private static String encode(byte[] content) {
return new sun.misc.BASE64Encoder().encode(content);
}
private static String getHeadValue(HttpResponse response, String key) {
return (response.containsHeader(key)) ? response.getFirstHeader(key).getValue() : "";
}
private static X509Certificate loadCertificate(InputStream inputStream) {
try {
CertificateFactory cf = CertificateFactory.getInstance("X509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(inputStream);
cert.checkValidity();
return cert;
} catch (CertificateExpiredException e) {
throw new RuntimeException("证书已过期", e);
} catch (CertificateNotYetValidException e) {
throw new RuntimeException("证书尚未生效", e);
} catch (CertificateException e) {
throw new RuntimeException("无效的证书", e);
}
}
private static boolean verify(X509Certificate certificate, byte[] message, String signature) {
try {
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initVerify(certificate);
sign.update(message);
byte[] signatureB = Base64.decodeBase64(signature);
return sign.verify(signatureB);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("当前Java环境不支持SHA256withRSA", e);
} catch (SignatureException e) {
throw new RuntimeException("签名验证过程发生了错误", e);
} catch (InvalidKeyException e) {
throw new RuntimeException("无效的证书", e);
}
}
private static HttpResponse post(String url, String message, String authorization, String ENCODING) throws Exception {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] xcs, String str) {
}
@Override
public void checkServerTrusted(X509Certificate[] xcs, String str) {
}
};
HttpClient http = new DefaultHttpClient();
ClientConnectionManager ccm = http.getConnectionManager();
ctx.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx);
ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
SchemeRegistry registry = ccm.getSchemeRegistry();
registry.register(new Scheme("https", ssf, 443));
HttpPost post = new HttpPost(url);
StringEntity myEntity = new StringEntity(message, ENCODING);
post.setEntity(myEntity);
post.setHeader("Authorization", SCHEMA + " " + authorization);
post.setHeader("Accept", "application/json");
post.setHeader("Content-Type", "application/json");
return http.execute(post);
}
private static final String getAuthorization(String body, String appid, String mchSerialNo, String merchantPrivateKeyPath) throws IOException {
String nonceStr = generateNonceStr();
long timestamp = generateTimestamp();
String message = appid + "\n" + mchSerialNo + "\n" + timestamp + "\n" + nonceStr + "\n" + body + "\n";
System.out.println("getToken message : " + message);
PrivateKey merchantPrivateKey = loadPrivateKey(new FileInputStream(new File(merchantPrivateKeyPath)));
String signature = sign(message.getBytes("utf-8"), merchantPrivateKey);
String authorization = "appid=\"" + appid + "\"," + "serial_no=\"" + mchSerialNo + "\"," + "timestamp=\""
+ timestamp + "\"," + "nonce_str=\"" + nonceStr + "\"," + "signature=\"" + signature + "\"";
System.out.println("authorization message :" + authorization);
return authorization;
}
private static long generateTimestamp() {
return System.currentTimeMillis() / 1000;
}
private static String generateNonceStr() {
char[] nonceChars = new char[32];
for (int index = 0; index < nonceChars.length; ++index) {
nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
}
return new String(nonceChars);
}
private static PrivateKey loadPrivateKey(InputStream inputStream) {
try {
ByteArrayOutputStream array = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
array.write(buffer, 0, length);
}
String privateKey = array.toString("utf-8").replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "").replaceAll("\\s+", "");
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey)));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("当前Java环境不支持RSA", e);
} catch (InvalidKeySpecException e) {
throw new RuntimeException("无效的密钥格式");
} catch (IOException e) {
throw new RuntimeException("无效的密钥");
}
}
private static String sign(byte[] message, PrivateKey privateKey) {
try {
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(privateKey);
sign.update(message);
return new String(Base64.encodeBase64(sign.sign()));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("当前Java环境不支持SHA256withRSA", e);
} catch (SignatureException e) {
throw new RuntimeException("签名计算失败", e);
} catch (InvalidKeyException e) {
throw new RuntimeException("无效的私钥", e);
}
}
}

View File

@ -0,0 +1,32 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class AccountVO implements Serializable {
private Integer id;
private String userid;
private String idcardid;
private String bankcardid;
private String certificateurl;
private String settletype;
private Date createtime;
private Date updatetime;
private String channeltype;
private Integer valid;
private String bak;
}

View File

@ -0,0 +1,9 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
@Data
public class AttchmentsVo {
private String id;
private String type;
}

View File

@ -0,0 +1,18 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
@Data
public class BankBranchLklVO implements Serializable {
private String id;
private String createTime;
private String optimistic;
private String updateTime;
private String areaCode;
private String bankNo;
private String branchBankName;
private String branchBankNo;
private String clearNo;
}

View File

@ -0,0 +1,44 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class BankCardVO implements Serializable {
private Integer id;
private String userid;
private String bankholder;
private String bankcardno;
private String bankname;
private String branchname;
private String accounttype;
private String contactline;
private String branchprovince;
private String branchcity;
private String brancharea;
private String bankaddressno;
private String phone;
private String imgurl;
private String licenseurl;
private Date createtime;
private Date updatetime;
}

View File

@ -0,0 +1,17 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
@Data
public class BankRegionLklVO implements Serializable {
private String id;
private String createTime;
private String optimistic;
private String updateTime;
private String code;
private String name;
private String parentCode;
}

View File

@ -0,0 +1,250 @@
package com.chaozhanggui.system.lkl.model;
import java.math.BigDecimal;
public class Constant {
public static String INDUSTRY_TYPE = "industry";
public static String VIDEO_TYPE = "video";
public static String REQUST_RETIRN_JUMP = "";
public static String session_user = "session_user";
public static String MESSAGE_TYPE_BACK = "back";//回执
public static String MESSAGE_TYPE_MESSAGE = "message";//消息
public static String MESSAGE_TYPE_PING = "ping";//心跳
public static String MESSAGE_TYPE_BIND = "bind";//绑定
public static String MESSAGE_TYPE_RECEIVE = "receive";//暂存消息 收取
public static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";//微信创建二维码 永久 int
public static String RESULT_CODE_SUCCESS = "SUCCESS";//返回结果成功
public static String RESULT_CODE_FAIL = "FAIL";//返回结果失败
public static String RESULT_CODE_NONE = "NONE";//收到回执 什么不用做
public static String RESULT_CODE_OK = "OK";//服务端已接受
public static String FILE_SAVE_PATH = "/home/trade/talkfile/save";//服务端已接受
public static long MESSAGE_PING_CLOCK = 30;//心跳时钟 单位是秒
//支付状态
public static String PAY_RESULT_CODE_SUCCESS = "1";
public static String PAY_RESULT_CODE_FAIL = "2";
public static String PAY_RESULT_CODE_NONE = "0";
//支付方式
public static final String PAY_TYPE_WECHAT = "wechatPay";
public static final String PAY_TYPE_NAME_WECHAT = "微信";
public static final String PAY_TYPE_ALIPAY = "aliPay";
public static final String PAY_TYPE_NAME_ALIPAY = "支付宝";
public static final String PAY_TYPE_YSFPAY = "bank";
public static final String PAY_TYPE_NAME_YSFPAY = "云闪付";
//订单号前缀
public final static String PREFIX_ORDER = "11";
//日期格式
public final static String WECHATDATEFORMAT = "yyyyMMddHHmmss";
public final static String WEIXIN_PAY_UNIFIED_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
public final static String TENCENT_GET_ADDRESS_URL = "https://apis.map.qq.com/ws/geocoder/v1";
public static String sync_type_dml = "dml";//同步类型
public static String sync_type_ddl = "ddl";//同步类型
public static String sync_definition_action_insert = "insert";
public static String sync_definition_action_update = "update";
public static String sync_definition_action_delete = "delete";
public static String sync_definition_action_alter = "alter";
public static String sync_definition_action_create = "create";
public static String sync_definition_action_save = "save";
public static String sync_definition_entity_MerchantProductCategory = "MerchantProductCategory";
public static String sync_definition_entity_MerchantProductCombo = "MerchantProductCombo";
public static String sync_definition_entity_MerchantProduct = "MerchantProduct";
public static String sync_definition_entity_MerchantRole = "MerchantRole";
public static String sync_definition_entity_MerchantRoleMenu = "MerchantRoleMenu";
public static String sync_definition_entity_MerchantRoleUser = "MerchantRoleUser";
public static String sync_definition_entity_MerchantBaseInfo = "MerchantBaseInfo";
public static String sync_definition_entity_MerchantArea = "MerchantArea";
public static String sync_definition_entity_MerchantAreaClass = "MerchantAreaClass";
/**
* 百度短信模板
*/
//注册成功
public static String baidu_template_regist_success = "smsTpl:6c248ad7-921b-417a-869b-e43a78795700";
//带评阅
public static String baidu_template_waitfor_read = "smsTpl:e8e3651a-d7b7-4870-a70a-eeefd18f90eb";
//参赛成
public static String baidu_template_join_batter = "smsTpl:c7bcd897-6bee-4822-8823-be0e506ff334";
//中榜
public static String baidu_template_on_list = "smsTpl:466d88ca-317e-4af1-875d-d1ebe2258304";
//评阅成功
public static String baidu_template_read_success = "smsTpl:591e7f62-8a13-49b8-88b9-7dc9f9f6cf8f";
/**
* 微信公众号模板
*/
/**
* 注册成功
*/
public static String wechat_template_regist_success = " UNeuf5QpriPfLVCJvXLhneBq3NVNQi2KKXIhCIjkz8Y";
/**
* 待评阅
*/
public static String wechat_template_waitfor_read = "ncbyBjSDhvF3NQ-25OStNS7lohq_ZI_QLBjpS2Bj7NA";
/**
* 活动报名成功
*/
public static String wechat_template_join_batter = "OKX7nmg0YPAicELVQn3DXMtHWowVS1jc0ZdAjmuYVqs";
/**
* 中榜
*/
public static String wechat_template_on_list = "9TWvGm19CuV1Wk4fuGu-SUfkuKsR9Yi77OXm234w8Tw";
/**
* 评阅成功
*/
public static String wechat_template_read_success = "D6eGbZ8GO36KCXCAe6CwNjG7RRHZxcDDxkOCbeYcIRk";
/**
* 登录成功提醒
*/
public static String wechat_template_login_success = "iZugTWBgboOdqttfmHvgv_NR_QTFjp88GREmu5JUC7c";
/**
* 充值成功
*/
public static String wechat_template_pay_success = "3TzSZHbyRMxG3e5x5KxTCMD_BTP8hJHTGllOnSaCpf0";
/**
* 消费成功
*/
public static String wechat_consume_success = "JFIaSWscb_KKCHN_3cCO4ctlDrbsRs0MywjScpYk0bA";
/**
* 图形验证码key
* @date: 2021/12/20 10:24
*/
public static final String LOGIN_VALIDATE_CODE = "login_validate_code";
/**
* 用户最高等级等级LV10
* @date: 2022/1/22 15:16
*/
public static final String USER_MAX_LEVEL_CODE = "LV10";
/**
* 最小结算底价
* @date: 2022/3/9 18:08
*/
public static final BigDecimal MIX_SETTLE_RATE = BigDecimal.valueOf(21);
/**
* 缴费通
* @date: 2022/3/9 18:08
*/
public static final BigDecimal JFT_MIX_SETTLE_RATE = BigDecimal.valueOf(28);
/**
* 默认收款商户号
*/
public static final String DEFUALT_CASHIER_MERCHANT = "M800202207078584958";
/**
* 默认收款商户属性key
*/
public static final String SYSTEM_MERCHANT_KEY = "cashier_merchant";
/**
* 默认通道
*/
public static final Integer DEFAULT_CHANNEL = 1;
/**
* 支付宝H5支付前缀
*/
public static final String ALIPAY_H5_PAY_URL_PRIFIX = "alipays://platformapi/startapp?appId=2021003175619219&url=";
/**
* 收款通道类型
*/
public static final String PAYMENT_CHANNEL_TYPE = "payment_channel_type";
/**
* 原生通道
*/
public static final Integer PRIMORDIAL_CHANNEL = 5;
/**
* 小程序默认支付路径
*/
public static final String DEFAULT_APPLET_PATH = "/pages/pay/index";
/**
* 小程序默认支付参数名
*/
public static final String DEFAULT_APPLET_PARAM_NAME_PREFIX = "orderId=";
/**
* 积分商城用户同步URL
*/
public static final String JF_SHOP_USER_SYNC_URL = "http://jf.shouyinbei.com/addons/shopro/syb_merchant/sysnmerchant";
/**
* 会员活动(充值活动)
*/
public static final String MEMBER_RECHARGE_ACTIVITY = "http://192.168.1.116/javaApi/java-api/get-vip-sdata";
/**
* 会员活动(消费活动)
*/
public static final String MEMBER_CONSUME_ACTIVITY = "http://192.168.1.116/javaApi/java-api/get-vip-xfdata";
/**
* 会员活动激活送
*/
public static final String MEMBER_ACTIVATION_ACTIVITY = "http://192.168.1.116/javaApi/java-api/get-vip-jhdata";
/**
* 生活圈会员卡默认过期时间 5单位分钟
*/
public static final Integer DEFAULT_LIFE_MEMBER_CARD_REFRESH_TIME = 5;
/**
* 缴费通成本费率
*/
public static final BigDecimal DEFAULT_JFT_COST_RATE = BigDecimal.valueOf(30);
/**
* 缴费通固定提现费率
*/
public static final BigDecimal DEFAULT_JFT_CASH_RATE = BigDecimal.valueOf(0.001);
/**
* 缴费通固定提现费
*/
public static final BigDecimal DEFAULT_JFT_CASH_FEE = BigDecimal.valueOf(0.01);
/**
* 银盛交易回传字段key
*/
public static final String YS_PAY_ECHO_KEY_NAME = "extra_common_param";
/**
* 随行付回传字段key
*/
public static final String SXF_PAY_ECHO_KEY_NAME = "extend";
/**
* 瑞银信交易回传字段
*/
public static final String RYX_PAY_ECHO_KEY_NAME = "extend1";
/**
* 默认秘钥设置
*/
public static final String DEFAULT_MD5_KEY = "4c8d277b0f274604af68e590cc0b3e6b";
}

View File

@ -0,0 +1,10 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
@Data
public class FeesSetVo {
private String feeCode;
private Double feeValue;
private Double topFee;
}

View File

@ -0,0 +1,38 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class IdCardVO implements Serializable {
private Integer id;
private Integer userid;
private String usertype;
private String certtype;
private String certno;
private String certname;
private String certstarttime;
private String certendtime;
private String certaddress;
private Date createtime;
private Date updatetime;
private String imgpositive;
private String imgnegative;
private String virtypeflag;
}

View File

@ -0,0 +1,22 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class MccReflectVO implements Serializable {
private Integer id;
private String standardMccCode;
private String mccCode;
private Integer channelId;
private Date createTime;
private Date updateTime;
}

View File

@ -0,0 +1,26 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class MerchantBackLklVO implements Serializable {
private Integer id;
private String merchantCode;
private String merchantId;
private String channel;
private String userNo;
private String customerNo;
private String externalCustomerNo;
private String termNos;
private String agencyNo;
private String activeNo;
private String contractId;
private String coreTermIds;
private Date createTime;
private Date updateTime;
}

View File

@ -0,0 +1,108 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class MerchantBaseInfoVO implements Serializable {
private Integer id;
private String bindingcode;
private Integer userid;
private String aliaccount;
private String merchantcode;
private String merchantname;
private String merchanttype;
private String productdesc;
private String alimcc;
private String mcc;
private String mccname;
private String alias;
private String contactmobile;
private String contactname;
private String addressno;
private String province;
private String city;
private String district;
private String address;
private String email;
private String principalmobile;
private String principalcerttype;
private String principalcertno;
private String principalperson;
private String bussauthname;
private String bussauthnum;
private String bussauthaddress;
private String bussauthstarttime;
private String bussauthendtime;
private String certorgcode;
private Date createdt;
private Date updatedt;
private String creator;
private String buslictype;
private String isvoice;
private String allowbanklarge;
private String wxcertstatus;
private String ispushwxmessage;
private String isunionpay;
private String md5key;
private String limitpay;
private String subappid;
private String appid;
private Date firsttradetime;
private Date lasttradetime;
private Byte splitflag;
private Byte validflag;
}

View File

@ -0,0 +1,90 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class MerchantChannelStatusVO implements Serializable {
//审核中
public static final String AUDIT_STATUS_EXAMINING = "1";
//三方审核中
public static final String AUDIT_THIRD_STATUS_WAITING = "-100";
/**
* 审核通过
*/
public static final String AUDIT_STATUS_SUCCESS = "3";
public static final String AUDIT_STATUS_DATA_EDIT = "6";
/**
* 秒审通过
*/
public static final String AUDIT_STATUS_FIRST_TRIAL_SUCCESS = "4";
private Integer id;
private Integer channel;
private String merchantcode;
private String merchantid;
private String settlementtype;
private String status;
private String thirdstatus;
private String remark;
private Date createtime;
private Date updatetime;
private String applicationid;
private String callbackstatus;
private Integer valid;
private String authorizationstatus;
private String mercname;
private String virchannelflag;
private String virstatusflag;
private String srcmerchantno;
private String interfaceversion;
private String aliauthorizationstatus;
private String wxcerturl;
private String alicerturl;
private Date auditsuccesstime;
private String extra;
public static boolean isAudited(MerchantChannelStatusVO mcs) {
if (mcs == null) {
return false;
}
return MerchantChannelStatusVO.AUDIT_STATUS_SUCCESS.equals(mcs.getStatus()) ||
MerchantChannelStatusVO.AUDIT_STATUS_DATA_EDIT.equals(mcs.getStatus()) ||
MerchantChannelStatusVO.AUDIT_STATUS_FIRST_TRIAL_SUCCESS.equals(mcs.getStatus());
}
}

View File

@ -0,0 +1,25 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class MerchantImageVO implements Serializable {
private Integer id;
private String merchantcode;
private String phototype;
private String photourl;
private String picurl;
private Date createdt;
private Date updatedt;
private String aisleswitch;
}

View File

@ -0,0 +1,122 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class MerchantOrderVO implements Serializable {
private Integer id;
private String ordernumber;
private String userimg;
private String nickname;
private String ordertype;
private String merchantcode;
private String merchantname;
private String paytypecode;
private String paytypename;
private String thirdtransno;
private String storeid;
private String storename;
private Double consumefee;
private String transno;
private String membercode;
private Date createdt;
private Date transdt;
private String staffcode;
private String staffname;
private String status;
private Double enterfee;
private String aisleswitch;
private String remark;
private Date updatetime;
private BigDecimal rate;
private BigDecimal marketamt;
private String mercorderno;
private String mercnotifyurl;
private String mercuserid;
private String mercnotifystatus;
private String mercremark;
private String isrecharge;
private String snno;
private Integer cashplaceid;
private Boolean settlementtype;
private Double fanssharemoney;
private Double profitsharemoney;
private String drtype;
private BigDecimal channelrate;
private BigDecimal channelfee;
private BigDecimal mercfee;
private String ip;
private String ipaddress;
private String mercreturnurl;
private String channeltype;
private Date createdate;
private Date updatedate;
private String preauthstatus;
private BigDecimal refundamt;
private String refundNo;
private BigDecimal cashfee;
private String thirdsendno;
private String paydata;
private String scanType;
private String authCode;
}

View File

@ -0,0 +1,16 @@
package com.chaozhanggui.system.lkl.model;
import lombok.Data;
import java.io.Serializable;
@Data
public class RegionLklVO implements Serializable {
private String id;
private String createTime;
private String optimistic;
private String updateTime;
private String code;
private String name;
private String parentCode;
}

View File

@ -0,0 +1,392 @@
package com.chaozhanggui.system.lkl.service;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.template.TemplateException;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.chaozhanggui.common.system.config.MsgException;
import com.chaozhanggui.common.system.util.DateUtils;
import com.chaozhanggui.system.lkl.model.*;
import com.chaozhanggui.system.lkl.util.HtmlUtil;
import lombok.SneakyThrows;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
@Service
public class MerchantLklService {
private static final Logger log= LoggerFactory.getLogger(MerchantLklService.class);
public static final String userNo = "22265868";
private static final String client_id = "chaozhanggui";
private static final String client_secret = "Y54Gqy6aLpxld3dp";
private static final String grant_type = "client_credentials";
//商户进件地址
private static final String tuoKeMerchat = "https://htkactvi.lakala.com/registration/merchant";
//进件接口
public JSONObject merchantAduit(MerchantBaseInfoVO merchantBaseInfo, MerchantChannelStatusVO merchantChannelStatusVO
, ConcurrentMap<String, RegionLklVO> regionLklVOConcurrentMap, AccountVO accountVO, BankCardVO bankCardVO,IdCardVO idCardVO
,ConcurrentMap<String,MerchantImageVO> imageVOConcurrentMap,MccReflectVO mccReflectVO,BankBranchLklVO bankBranchLklVO,
BankRegionLklVO parentCode,BankRegionLklVO bankParentCode
) throws Exception {
MsgException.checkNull(merchantBaseInfo,"商户基本信息不存在");
MsgException.checkNull(merchantChannelStatusVO,"商户未提交审核");
if (merchantChannelStatusVO.getStatus().equals(MerchantChannelStatusVO.AUDIT_STATUS_EXAMINING) && !merchantChannelStatusVO.getStatus().equals(MerchantChannelStatusVO.AUDIT_THIRD_STATUS_WAITING)) {
MsgException.throwException("进件审核中,请等待审核结果");
}
if (merchantChannelStatusVO.isAudited(merchantChannelStatusVO)) {
MsgException.throwException("商户已进件成功,请勿重复进件");
}
MsgException.checkNull(regionLklVOConcurrentMap,"商户地址信息不存在");
MsgException.checkNull(regionLklVOConcurrentMap.get("provinceCode"),"商户省份信息不存在");
MsgException.checkNull(regionLklVOConcurrentMap.get("cityCode"),"商户城市信息不存在");
MsgException.checkNull(regionLklVOConcurrentMap.get("countyCode"),"商户区县细信息不存在");
MsgException.checkNull(accountVO,"商户结算信息未提交");
MsgException.checkNull(bankCardVO,"商户结算卡信息未提交");
MsgException.checkNull(idCardVO,"商户基本信息不完整");
MsgException.checkNull(imageVOConcurrentMap,"商户基本信息不完整");
MsgException.checkNull(imageVOConcurrentMap.get("BUSINESS_LICENCE"),"商户基本信息不完整");
MsgException.checkNull(bankBranchLklVO,"结算卡对应的分行支行信息不存在");
JSONObject object1 = new JSONObject();
JSONObject object2 = new JSONObject();
object1.put("userNo", userNo); //合作机构信息 由拓客SAAS提供
object1.put("email", "chaozhanggui2023@163.com"); //商户邮箱
object1.put("busiCode", "KLYX");//业务类型 BPOS:传统POS, ZPOS:电签,ZPOS4G4G电签,SUPER_POS:智能pos,B_WIZARD:蓝精灵,PAPER_CODE:码牌,WECHAT_PAY:专业化扫码,KLYX:云音箱,QRCODE:收款王,MONEY_BOX:收钱宝盒根据业务开放取值
object1.put("merRegName", merchantBaseInfo.getAlias()); //商户注册名称 不能少于七个中文
object1.put("merType", (merchantBaseInfo.getMerchanttype().equals(1) || merchantBaseInfo.getMerchanttype().equals("2")) ? "TP_PERSONAL" : "TP_MERCHANT"); //商户注册类型 TP_MERCHANT:企业 TP_PERSONAL:微个
object1.put("merName", merchantBaseInfo.getAlias()); //商户名称(经营名称) 不能少于七个中文
object1.put("merAddr", merchantBaseInfo.getAddress()); //去掉省市区后的详细地址
object1.put("provinceCode", regionLklVOConcurrentMap.get("provinceCode").getCode()); //省代码 通过地区信息获取地区查询接口获取 对应 code字段
object1.put("cityCode", regionLklVOConcurrentMap.get("cityCode").getCode()); // 市代码 通过地区信息获取地区查询接口获取 对应 code字段
object1.put("countyCode", regionLklVOConcurrentMap.get("countyCode").getCode()); // 区县代码 通过地区信息获取地区查询接口获取 对应 code字段
Set<Object> attchmentsVoSet = new HashSet<>();
//企业进件必传资料
if(merchantBaseInfo.getMerchanttype().equals("3")){
conventIdCardTime(object1,attchmentsVoSet,merchantBaseInfo,idCardVO,bankCardVO,imageVOConcurrentMap.get("BUSINESS_LICENCE").getPicurl(),bankCardVO.getLicenseurl(),mccReflectVO);
}
object1.put("latitude", "108.94647"); //经度 进件所在地址经度
object1.put("longtude", "34.34727"); //纬度 进件所在地址纬度
object1.put("source", "APP"); //进件来源 APP: app H5: h5
object1.put("businessContent", merchantBaseInfo.getMccname()); //商户经营内容
object1.put("larName", idCardVO.getCertname()); //姓名
object1.put("larIdType", "01"); //证件类型 01 身份证 暂时只支持身份证
object1.put("larIdCard", idCardVO.getCertno()); //证件号码
object1.put("larIdCardStart", DateUtils.convertString(idCardVO.getCertstarttime())); //证件开始 格式yyyy-MM-dd
object1.put("larIdCardEnd", DateUtils.convertString(idCardVO.getCertendtime())); //证件过期时间 格式yyyy-MM-dd
object1.put("contactMobile", merchantBaseInfo.getContactmobile()); //商户联系⼿机号码
object1.put("contactName", merchantBaseInfo.getContactname()); //商户联系姓名
object1.put("openningBankCode", bankBranchLklVO.getBranchBankNo()); //结算账户开户 通过银行列表查询接口获取 对应 branchBankNo字段
object1.put("openningBankName", bankBranchLklVO.getBranchBankName()); //结算账户开户名称 通过银行列表查询接口获取 对应 branchBankName字段
object1.put("clearingBankCode", bankBranchLklVO.getClearNo()); //结算账户清算 通过银行列表查询接口获取 对应 clearNo字段
object1.put("settleProvinceCode", parentCode.getCode()); //结算信息省份名称 通过地区信息获取银行地区查询接口获取 对应 code字段
object1.put("settleProvinceName", parentCode.getName()); //结算信息省份代码 通过地区信息获取银行地区查询接口获取 对应 name字段
object1.put("settleCityCode", bankParentCode.getCode()); //结算信息城市名称 通过地区信息获取银行地区查询接口获取 对应 code字段
object1.put("settleCityName", bankParentCode.getName()); //结算信息城市代码 通过地区信息获取银行地区查询接口获取 对应 name字段
if("02".equals(accountVO.getSettletype())){
AttchmentsVo opening_permit = new AttchmentsVo(); //图片set
opening_permit.setId(laKaLaFileUpload(accountVO.getCertificateurl(), "LETTER_OF_AUTHORIZATION"));//对私非法人授权函
opening_permit.setType("LETTER_OF_AUTHORIZATION");//对私非法人授权函
attchmentsVoSet.add(opening_permit);
}
object1.put("accountNo", bankCardVO.getBankcardno()); //结算人银行卡号
object1.put("accountName", bankCardVO.getBankholder()); //结算人账户名称
object1.put("accountType", bankCardVO.getAccounttype().equals("01") ? "58" : "57"); //结算账户类型 57 对公 58 对私
object1.put("accountIdCard", idCardVO.getCertno()); //结算证件号码
if (bankCardVO.getAccounttype().equals("2")) {
//对公收银台照片
AttchmentsVo checkstand_img = new AttchmentsVo();
checkstand_img.setId(laKaLaFileUpload(idCardVO.getImgnegative(), "CHECKSTAND_IMG")); //收银台照片
checkstand_img.setType("CHECKSTAND_IMG");//收银台照片
attchmentsVoSet.add(checkstand_img);
//门头照片
MerchantImageVO image =imageVOConcurrentMap.get("SHOP_OUTSIDE_IMG");
MsgException.checkNull(image, "门头照片不存在");
AttchmentsVo shop_outside_img = new AttchmentsVo();
shop_outside_img.setId(laKaLaFileUpload(image.getPicurl(), "SHOP_OUTSIDE_IMG"));//门头照片
shop_outside_img.setType("SHOP_OUTSIDE_IMG");
attchmentsVoSet.add(shop_outside_img);
//商铺内部照片
image =imageVOConcurrentMap.get("SHOP_INSIDE_IMG");
MsgException.checkNull(image, "商铺内部照片不存在");
AttchmentsVo shop_inside_img = new AttchmentsVo();
shop_inside_img.setId(laKaLaFileUpload(image.getPicurl(), "SHOP_INSIDE_IMG"));//商铺内部照片
shop_inside_img.setType("SHOP_INSIDE_IMG");
attchmentsVoSet.add(shop_inside_img);
}
JSONArray array = new JSONArray();
Set<FeesSetVo> feesSet = new HashSet<>();
FeesSetVo w = new FeesSetVo();
w.setFeeCode("WECHAT");
w.setFeeValue(0.38d);
array.add(w);
FeesSetVo a = new FeesSetVo();
a.setFeeCode("ALIPAY");
a.setFeeValue(0.38d);
array.add(a);
FeesSetVo u = new FeesSetVo();
u.setFeeCode("SCAN_PAY_SECOND");
u.setFeeValue(0.38d);
array.add(u);
feesSet.add(w);
feesSet.add(a);
feesSet.add(u);
object2.put("termNum", "1"); //终端数量 1-5 5个终端
object2.put("fees", feesSet); //费率集合
object2.put("mcc","12007");
// object2.put("mcc", ObjectUtils.isEmpty(mccReflect) ? "7399" : mccReflect.getMccCode()); //商户MCC编号 通过 商户类别查询查询小类接口获取 对应 code字段
object2.put("activityId", "37"); //归属活动信息 由拓客SAAS分配
object1.put("bizContent", object2); //业务扩展信息 业务扩展信息
AttchmentsVo frontLegalPerson = new AttchmentsVo(); //图片set
frontLegalPerson.setId(laKaLaFileUpload(idCardVO.getImgpositive(), "ID_CARD_FRONT"));//法人身份证图片地址
frontLegalPerson.setType("ID_CARD_FRONT");//身份证正
attchmentsVoSet.add(frontLegalPerson);
AttchmentsVo reverseLegalPerson = new AttchmentsVo();
reverseLegalPerson.setId(laKaLaFileUpload(idCardVO.getImgnegative(), "ID_CARD_BEHIND")); //法人身份证图片地址
reverseLegalPerson.setType("ID_CARD_BEHIND");//身份证反
attchmentsVoSet.add(reverseLegalPerson);
object1.put("attchments", attchmentsVoSet); //附件信息集合 附件信息
object1.put("settleType", "D1"); //结算类型 D0秒到 D1次日结算
log.info("请求地址:{},请求参数:{},",tuoKeMerchat,object1);
Map map = getToken();
String result = cn.hutool.http.HttpRequest.post(tuoKeMerchat)
.header("Authorization", "bearer " + map.get("access_token")).header("content-type", "application/json")
.body(object1.toString()).execute().body();
log.info("拉卡拉返回的进件结果信息:{}",result);
if(ObjectUtil.isEmpty(result)){
return null;
}
return JSONObject.parseObject(result);
}
private void conventIdCardTime(JSONObject jsonObject,Set<Object> attchmentsVoSet,MerchantBaseInfoVO merchantBaseInfo,IdCardVO idCardVO,BankCardVO bankCardVO,String businessLicence,String openingPermit,MccReflectVO mccReflect) throws Exception{
StringBuffer startSb = new StringBuffer();
StringBuffer endSb = new StringBuffer();
if (merchantBaseInfo.getBussauthstarttime().contains("")) {
startSb.append(merchantBaseInfo.getBussauthstarttime().substring(0, 4));
startSb.append("-");
startSb.append(merchantBaseInfo.getBussauthstarttime().substring(5, 7));
startSb.append("-");
startSb.append(merchantBaseInfo.getBussauthstarttime().substring(8, 10));
} else {
startSb.append(merchantBaseInfo.getBussauthstarttime());
}
if (ObjectUtil.isEmpty(merchantBaseInfo.getBussauthendtime()) || "长期".equals(merchantBaseInfo.getBuslictype())) {
endSb.append("2099-12-31");
} else {
if (merchantBaseInfo.getBussauthendtime().contains("")) {
endSb.append(merchantBaseInfo.getBussauthendtime().substring(0, 4));
endSb.append("-");
endSb.append(merchantBaseInfo.getBussauthendtime().substring(5, 7));
endSb.append("-");
endSb.append(merchantBaseInfo.getBussauthendtime().substring(8, 10));
} else {
endSb.append(merchantBaseInfo.getBussauthendtime());
}
}
jsonObject.put("licenseDtStart", startSb); //营业执照开始时间微商户可不传 其他必传格式yyyy-MM-dd
jsonObject.put("licenseDtEnd", endSb); //微商户可不传 其他必传格式yyyy-MM-dd
AttchmentsVo business_licence = new AttchmentsVo(); //图片set
business_licence.setId(laKaLaFileUpload(businessLicence, "BUSINESS_LICENCE"));//营业执照
business_licence.setType("BUSINESS_LICENCE");//营业执照
attchmentsVoSet.add(business_licence);
//开户许可证
AttchmentsVo opening_permit = new AttchmentsVo(); //图片set
opening_permit.setId(laKaLaFileUpload(openingPermit, "OPENING_PERMIT"));//开户许可证
opening_permit.setType("OPENING_PERMIT");//开户许可证
attchmentsVoSet.add(opening_permit);
Map<String, Object> data = new HashMap<>();
data.put("customerName", merchantBaseInfo.getMerchantname());
data.put("licenseNo", merchantBaseInfo.getBussauthnum());
data.put("legalName", idCardVO.getCertname());
data.put("licenseName", merchantBaseInfo.getMerchantname());
data.put("identityNo", idCardVO.getCertno());
data.put("address", merchantBaseInfo.getProvince().concat(merchantBaseInfo.getCity()).concat(merchantBaseInfo.getDistrict()));
data.put("receiveDetail", merchantBaseInfo.getProvince().concat(merchantBaseInfo.getCity()).concat(merchantBaseInfo.getDistrict()).concat(merchantBaseInfo.getAddress()));
data.put("identityNoExpire", endSb);
data.put("accountName", bankCardVO.getBankholder());
data.put("accountIdCard", idCardVO.getCertno());
data.put("accountNo", bankCardVO.getBankcardno());
data.put("accountIdDtEnd", idCardVO.getCertendtime().equals("长期") ? "2099-12-31" : DateUtils.convertString(idCardVO.getCertendtime()));
data.put("bankName", bankCardVO.getBankname());
data.put("mail", "chaozhanggui2023@163.com");
data.put("contactManName", bankCardVO.getPhone());
data.put("channelType", ObjectUtils.isEmpty(mccReflect) ? "7399" : mccReflect.getMccCode());
data.put("phone", bankCardVO.getPhone());
data.put("agencyName", merchantBaseInfo.getMerchantname());
//协议
AttchmentsVo agree_ment = new AttchmentsVo(); //图片set
agree_ment.setId(laKaLaFileUpload(HtmlUtil.createAgreementPicture(HtmlUtil.writeHtml(data)),"AGREE_MENT"));//协议
agree_ment.setType("AGREE_MENT");//协议
attchmentsVoSet.add(agree_ment);
}
@SneakyThrows
public static String laKaLaFileUpload(String url1, String type) {
String url = "https://htkactvi.lakala.com/registration/file/upload";
Map<String, Object> params = new HashMap<>();
URI uri = null;
try {
uri = new URI(url1);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
RestTemplate restTemplate1 = new RestTemplate();
ResponseEntity<byte[]> exchange = restTemplate1.exchange(uri, HttpMethod.GET, null, byte[].class);
MultipartFile file1 = new MockMultipartFile("file", exchange.getBody());
File file = convert(file1);
params.put("file", file);
params.put("imgType", type);
params.put("sourcechnl", "0");
params.put("isOcr", "false");
Map token = getToken();
String result = HttpRequest.post(url)
.header("Authorization", "bearer " + token.get("access_token"))
.form(params).execute().body();
Map parse = (Map) JSONArray.parse(result);
log.info("拉卡拉图片上传返回信息:{}", result);
return parse.get("url").toString();
}
@SneakyThrows
public static String laKaLaFileUpload(File file, String type) {
String url = "https://htkactvi.lakala.com/registration/file/upload";
Map<String, Object> params = new HashMap<>();
params.put("file", file);
params.put("imgType", type);
params.put("sourcechnl", "0");
params.put("isOcr", "false");
Map token = getToken();
String result = HttpRequest.post(url)
.header("Authorization", "bearer " + token.get("access_token"))
.form(params).execute().body();
Map parse = (Map) JSONArray.parse(result);
log.info("拉卡拉图片上传返回信息:{}", result);
return parse.get("url").toString();
}
public static File convert(MultipartFile multipartFile) throws IOException {
InputStream inputStream = multipartFile.getInputStream();
File file = File.createTempFile(ObjectUtil.isEmpty(multipartFile.getOriginalFilename()) ? System.currentTimeMillis() + "" : multipartFile.getOriginalFilename(), ".png");
FileOutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
file.deleteOnExit();
return file;
}
public static Map getToken() {
RestTemplate client = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
// 表单提交
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.set("Authorization", "Basic " + getBase64());
// 封装参数
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("grant_type", grant_type);
params.add("client_id", client_id);
params.add("client_secret", client_secret);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
// 执行HTTP请求
ResponseEntity<String> response = client.exchange("https://tkapi.lakala.com/auth/oauth/token", HttpMethod.POST, requestEntity, String.class);
Map map = (Map) JSONArray.parse(response.getBody());
return map;
}
public static String getBase64() {
String encodeBase64String = org.apache.commons.codec.binary.Base64.encodeBase64String((client_id + ":" + client_secret).getBytes());
return encodeBase64String;
}
}

View File

@ -0,0 +1,430 @@
package com.chaozhanggui.system.lkl.service;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.chaozhanggui.common.system.config.MsgException;
import com.chaozhanggui.common.system.util.DateUtils;
import com.chaozhanggui.system.lkl.config.LakalaConfig;
import com.chaozhanggui.system.lkl.model.*;
import com.chaozhanggui.system.lkl.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
@Service
@Slf4j
public class OrderPayService {
@Autowired
LakalaConfig lakalaConfig;
private static long changeY2F(double price) {
DecimalFormat df = new DecimalFormat("#.00");
price = Double.valueOf(df.format(price));
long money = (long)(price * 100);
return money;
}
/**
* 被扫
* @param orderVO
* @param statusVO
* @param baseInfoVO
* @param merchantBackLklVO
* @return
*/
public JSONObject tradePay(MerchantOrderVO orderVO, MerchantChannelStatusVO statusVO, MerchantBaseInfoVO baseInfoVO, MerchantBackLklVO merchantBackLklVO){
MsgException.checkNull(orderVO, "订单信息为空");
MsgException.checkNull(statusVO, "进件信息为空");
MsgException.checkNull(baseInfoVO, "商户基本信息为空");
MsgException.checkNull(merchantBackLklVO, "拉卡拉渠道信息为空");
String account_type = "WECHAT";
if (ObjectUtil.isNotEmpty(orderVO.getScanType()) && "01".equals(orderVO.getScanType())) {
account_type = "wechatPay".equals(orderVO.getPaytypecode()) ? "WECHAT" : "aliPay".equals(orderVO.getPaytypecode()) ? "ALIPAY" : "UQRCODEPAY";
} else {
account_type = "wechatPay".equals(orderVO.getPaytypecode()) ? "WECHAT" : "aliPay".equals(orderVO.getPaytypecode()) ? "ALIPAY" : "UQRCODEPAY";
}
String transType = account_type.equals("WECHAT") ? "71" : account_type.equals("ALIPAY") ? "41" : "51";
String req_time = DateUtils.getSdfTimes();
Long order_amt = changeY2F(orderVO.getConsumefee());
String body = null;
if (account_type.equals("WECHAT")) {
body="{\n" +
"\t\"out_org_code\": \""+lakalaConfig.getAppid()+"\",\n" +
"\t\"req_data\": {\n" +
"\t\t\"acc_busi_fields\": {\n" +
"\t\t\t\"user_id\": \""+orderVO.getMercuserid()+"\",\n" +
"\t\t\t\"sub_appid\": \""+lakalaConfig.getAppletsAppid()+"\"\n" +
"\t\t},\n" +
"\t\t\"account_type\": \""+account_type+"\",\n" +
"\t\t\"location_info\": {\n" +
"\t\t\t\"request_ip\": \""+orderVO.getIp()+"\"\n" +
"\t\t},\n" +
"\t\t\"merchant_no\": \""+merchantBackLklVO.getExternalCustomerNo()+"\",\n" +
"\t\t\"notify_url\": \""+lakalaConfig.getCallBackUrl()+"\",\n" +
"\t\t\"out_trade_no\": \""+orderVO.getOrdernumber()+"\",\n" +
"\t\t\"term_no\": \""+merchantBackLklVO.getTermNos()+"\",\n" +
"\t\t\"total_amount\": \""+order_amt+"\",\n" +
"\t\t\"trans_type\": \""+transType+"\"\n" +
"\t},\n" +
"\t\"req_time\": \""+req_time+"\",\n" +
"\t\"version\": \"3.0\"\n" +
"}";
}
if (account_type.equals("ALIPAY")) {
body = "{\n" +
"\t\"out_org_code\": \"" + lakalaConfig.getAppid() + "\",\n" +
"\t\"req_data\": {\n" +
"\t\t\"account_type\": \"" + account_type + "\",\n" +
"\t\t\"location_info\": {\n" +
"\t\t\t\"request_ip\": \"" + orderVO.getIp() + "\"\n" +
"\t\t},\n" +
"\t\t\"merchant_no\": \"" + merchantBackLklVO.getExternalCustomerNo() + "\",\n" +
"\t\t\"notify_url\": \"" + lakalaConfig.getCallBackUrl() + "\",\n" +
"\t\t\"out_trade_no\": \"" + orderVO.getOrdernumber() + "\",\n" +
"\t\t\"term_no\": \"" + merchantBackLklVO.getTermNos() + "\",\n" +
"\t\t\"total_amount\": \"" + order_amt + "\",\n" +
"\t\t\"trans_type\": \"" + transType + "\"\n" +
"\t},\n" +
"\t\"req_time\": \"" + req_time + "\",\n" +
"\t\"version\": \"3.0\"\n" +
"}";
}
String response = lakalaConfig.request(body, "api/v3/labs/trans/preorder");
JSONObject resp = new JSONObject();
if (ObjectUtil.isNotEmpty(response)) {
JSONObject payData = new JSONObject();
JSONObject object = JSONObject.parseObject(response);
if (object.containsKey("code") && "BBS00000".equals(object.getString("code"))) {
if (!(ObjectUtil.isNotEmpty(orderVO.getScanType()) && "01".equals(orderVO.getScanType()))) {
JSONObject acc_resp_fields = object.getJSONObject("resp_data").getJSONObject("acc_resp_fields");
if (Constant.PAY_TYPE_ALIPAY.equals(orderVO.getPaytypecode())) {
payData.put("source", acc_resp_fields.getString("code"));
} else if (Constant.PAY_TYPE_WECHAT.equals(orderVO.getPaytypecode())) {
payData.put("payAppId", acc_resp_fields.getString("app_id"));
payData.put("payTimeStamp", acc_resp_fields.getString("time_stamp"));
payData.put("paynonceStr", acc_resp_fields.getString("nonce_str"));
payData.put("payPackage", acc_resp_fields.getString("package"));
payData.put("paySignType", acc_resp_fields.getString("sign_type"));
payData.put("paySign", acc_resp_fields.getString("pay_sign"));
} else {
payData.put("redirectUrl", acc_resp_fields.containsKey("redirect_url") ? acc_resp_fields.getString("redirect_url") : null);
}
} else {
payData.put("payUrl", object.get("code"));
payData.put("orderNumber", orderVO.getOrdernumber());
payData.put("mercOrderNo", orderVO.getMercorderno());
}
resp.put("code", 200);
payData.put("channel", statusVO.getChannel());
payData.put("transNo",(object.getJSONObject("resp_data").containsKey("log_no") && ObjectUtil.isNotEmpty(object.getJSONObject("resp_data").getString("log_no"))) ? object.getString("log_no") : "");
resp.put("payData", payData);
return resp;
} else if (object.containsKey("code") && "BBS16270".equals(object.getString("code"))) {
resp.put("code", 400);
resp.put("msg", object.getString("msg"));
return resp;
}
}
resp.put("code", 400);
resp.put("msg", "失败");
return resp;
}
/**
* 主扫
* @param orderVO
* @param baseInfoVO
* @param merchantBackLklVO
* @return
*/
public JSONObject tradePay(MerchantOrderVO orderVO, MerchantBaseInfoVO baseInfoVO, MerchantBackLklVO merchantBackLklVO){
MsgException.checkNull(orderVO, "订单信息为空");
MsgException.checkNull(baseInfoVO, "商户基本信息为空");
MsgException.checkNull(merchantBackLklVO, "拉卡拉渠道信息为空");
JSONObject obj = new JSONObject(6);
String req_time = DateUtils.getSdfTimes();
Long order_amt = changeY2F(orderVO.getConsumefee());
String body = "{\n" +
"\t\"req_data\": {\n" +
"\t\t\"merchant_no\": \"" + merchantBackLklVO.getExternalCustomerNo() + "\",\n" +
"\t\t\"term_no\": \"" + merchantBackLklVO.getTermNos() + "\",\n" +
"\t\t\"out_trade_no\": \"" + orderVO.getOrdernumber() + "\",\n" +
"\t\t\"total_amount\": \"" + order_amt + "\",\n" +
"\t\t\"subject\": \"" + baseInfoVO.getMccname() + "\",\n" +
"\t\t\"acc_busi_fields\": {},\n" +
"\t\t\"notify_url\": \"" + lakalaConfig.getCallBackUrl() + "\",\n" +
"\t\t\"location_info\": {\n" +
"\t\t\t\"request_ip\": \"" + orderVO.getIp() + "\"\n" +
"\t\t},\n" +
"\t\t\"auth_code\": \"" + orderVO.getAuthCode() + "\"\n" +
"\t},\n" +
"\t\"out_org_code\": \"" + lakalaConfig.getAppid() + "\",\n" +
"\t\"version\": \"3.0\",\n" +
"\t\"req_time\": " + req_time + "\n" +
"}";
String response = lakalaConfig.request(body, "api/v3/labs/trans/micropay");
if (ObjectUtil.isNotEmpty(response)) {
JSONObject object = JSON.parseObject(response);
if (object.containsKey("code") && "BBS10000".equals(object.get("code"))) {
obj.put("code", 202);
obj.put("msg", "用户支付中");
obj.put("channelOrderNo", object.getJSONObject("resp_data").get("trade_no"));
obj.put("transNo", object.getJSONObject("resp_data").get("log_no"));
obj.put("payStatus", "7");
return obj;
} else if (object.containsKey("code") && "BBS00000".equals(object.get("code"))) {
obj.put("code", 200);
obj.put("msg", "成功");
obj.put("channelOrderNo", object.getJSONObject("resp_data").get("trade_no"));
obj.put("transNo", object.getJSONObject("resp_data").get("log_no"));
obj.put("payStatus", "1");
obj.put("payTime", DateUtils.convertDate(object.getJSONObject("resp_data").getString("trade_time")));
return obj;
} else {
obj.put("code", 400);
obj.put("msg", object.get("msg"));
return obj;
}
}
obj.put("code", 400);
obj.put("msg", "失败");
return obj;
}
/**
* 退款
* @param orderVO
* @param merchantBackLklVO
* @return
*/
public Map<String, Object> refundPay(MerchantOrderVO orderVO,MerchantBackLklVO merchantBackLklVO){
MsgException.checkNull(orderVO, "订单信息为空");
MsgException.checkNull(merchantBackLklVO, "拉卡拉渠道信息为空");
String req_time = DateUtils.getSdfTimes();
Long order_amt = changeY2F(orderVO.getConsumefee());
String refundNo = "LKLR" + StringUtil.getBillno();
String body="{\n" +
" \"req_time\":\""+req_time+"\",\n" +
" \"version\":\"3.0\",\n" +
" \"out_org_code\":\""+lakalaConfig.getAppid()+"\",\n" +
" \"req_data\":{\n" +
" \"merchant_no\":\""+merchantBackLklVO.getExternalCustomerNo()+"\",\n" +
" \"term_no\":\""+merchantBackLklVO.getTermNos()+"\",\n" +
" \"out_trade_no\":\""+refundNo+"\",\n" +
" \"refund_amount\":\""+order_amt+"\",\n" +
" \"refund_reason\":\"退款\",\n" +
" \"origin_out_trade_no\":\""+orderVO.getOrdernumber()+"\",\n" +
" \"location_info\":{\n" +
" \"request_ip\":\""+orderVO.getIp()+"\",\n" +
" \"location\":\"+37.123456789,-121.123456789\"\n" +
" }\n" +
" }\n" +
"}\n" +
"\n";
Map<String, Object> result = new HashMap<>(4);
result.put("refundNo", refundNo);
result.put("status", "3");
result.put("code", 400);
String response = lakalaConfig.request(body, "api/v3/labs/relation/refund");
if(ObjectUtil.isNotEmpty(response)){
JSONObject object=JSONObject.parseObject(response);
if(object.containsKey("code")&&"BBS00000".equals(object.getString("code"))){
result.put("msg", "退款成功!");
result.put("data", object.getJSONObject("resp_data"));
result.put("status", "1");
result.put("code", 200);
return result;
}else {
result.put("msg", object.getString("msg"));
return result;
}
}
result.put("msg", "退款失败!");
return result;
}
/**
* 订单查询
* @param orderVO
* @param merchantBackLklVO
* @return
*/
public JSONObject tradeQuery(MerchantOrderVO orderVO, MerchantBackLklVO merchantBackLklVO) {
MsgException.checkNull(orderVO, "订单信息为空");
MsgException.checkNull(merchantBackLklVO, "拉卡拉渠道信息为空");
String req_time = DateUtils.getSdfTimes();
String body = "{\n" +
"\"req_time\":\"" + req_time + "\",\n" +
"\"version\":\"3.0\",\n" +
"\"out_org_code\":\"" + lakalaConfig.getAppid() + "\",\n" +
"\"req_data\":{\n" +
"\"merchant_no\":\"" + merchantBackLklVO.getExternalCustomerNo() + "\",\n" +
"\"term_no\":\"" + merchantBackLklVO.getTermNos() + "\",\n" +
"\"out_trade_no\":\"" + orderVO.getOrdernumber() + "\"\n" +
"}\n" +
"}\n";
JSONObject result = new JSONObject();
String response = lakalaConfig.request(body, "api/v3/labs/query/tradequery");
if (ObjectUtil.isNotEmpty(response)) {
JSONObject object = JSONObject.parseObject(response);
if (object.containsKey("code") && "BBS00000".equals(object.getString("code"))) {
result.put("channelOrderNo", object.get("trade_no"));
result.put("payTime", DateUtils.parse(object.getString("trade_time"), "yyyyMMddHHmmss"));
result.put("transNo", object.get("log_no"));
result.put("code", 200);
result.put("payStatus", "1");
result.put("msg", "查询成功!");
result.put("buyerId", object.get("user_id1"));
return result;
} else {
result.put("code", 400);
result.put("msg", object.getString("msg"));
return result;
}
}
log.error("==============>【拉卡拉】交易订单查询失败<==================");
result.put("code", 400);
result.put("msg", "订单查询异常");
return result;
}
public JSONObject refundQuery(MerchantOrderVO orderVO,MerchantBackLklVO merchantBackLklVO) {
MsgException.checkNull(orderVO, "订单信息为空");
MsgException.checkNull(merchantBackLklVO, "拉卡拉渠道信息为空");
String req_time = DateUtils.getSdfTimes();
String body="{\n" +
" \"req_time\":\""+req_time+"\",\n" +
" \"version\":\"3.0\",\n" +
" \"out_org_code\":\""+lakalaConfig.getAppid()+"\",\n" +
" \"req_data\":{\n" +
" \"merchant_no\":\""+merchantBackLklVO.getExternalCustomerNo()+"\",\n" +
" \"term_no\":\""+merchantBackLklVO.getTermNos()+"\",\n" +
" \"out_refund_order_no\":\""+orderVO.getRefundNo()+"\"\n" +
" }\n" +
"}\n" +
"\n";
JSONObject result = new JSONObject();
String response = lakalaConfig.request(body, "api/v3/labs/query/idmrefundquery");
if (ObjectUtil.isNotEmpty(response)) {
JSONObject object = JSONObject.parseObject(response);
if (object.containsKey("code") && "BBS00000".equals(object.getString("code"))) {
result.put("refundTime", object.getString("trade_time"));
result.put("code", 200);
result.put("status", "1");
result.put("msg", "查询成功!");
return result;
} else {
result.put("code", 400);
result.put("msg", object.getString("msg"));
return result;
}
}
log.error("==============>【拉卡拉】交易订单查询失败<==================");
result.put("code", 400);
result.put("msg", "退款订单查询异常");
return result;
}
/**
* 微信获取用户标识
* @param userAuthCode
* @param paymentApp
* @param merchantBackLklVO
* @return
* @throws Exception
*/
public Map<String, Object> getUnionInfo(String userAuthCode, String paymentApp,MerchantBackLklVO merchantBackLklVO) throws Exception {
Map<String, Object> result = new HashMap<>();
String req_time = DateUtils.getSdfTimes();
MsgException.checkNull(merchantBackLklVO, "拉卡拉渠道信息为空");
String body = "{\n" +
"\"ver\":\"1.0.0\",\n" +
"\"timestamp\":\"" + System.currentTimeMillis() + "\",\n" +
"\"reqId\":\"" + req_time + "\",\n" +
"\"reqData\":{\n" +
"\"mercId\":\"" + merchantBackLklVO.getExternalCustomerNo() + "\",\n" +
"\"termNo\":\"" + merchantBackLklVO.getTermNos() + "\",\n" +
"\"authCode\":\"" + userAuthCode + "\",\n" +
"\"tradeCode\":\"030304\"\n" +
"}\n" +
"}\n";
String response = lakalaConfig.request(body, "api/v2/saas/query/wx_openid_query");
if (ObjectUtil.isNotEmpty(response)) {
JSONObject object = JSONObject.parseObject(response);
if (object.containsKey("retCode") && "BBS00000".equals(object.getString("retCode"))) {
JSONObject reqData = new JSONObject(2);
reqData.put("data", object.getJSONObject("respData").getString("openId"));
reqData.put("userAuthCode", userAuthCode);
reqData.put("appUpIdentifier", paymentApp);
result.put("data", reqData);
result.put("code", "1");
result.put("msg", "获取成功");
}
}
result.put("code","0");
result.put("msg", "获取失败");
return result;
}
}

View File

@ -0,0 +1,129 @@
package com.chaozhanggui.system.lkl.util;
import cn.hutool.core.io.FileUtil;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Component
@Slf4j
public class HtmlUtil {
@Autowired
FreeMarkerConfigurer freeMarkerConfigurer;
static Template template =null;
public void initHtml(){
try {
template = freeMarkerConfigurer.getConfiguration().getTemplate("indexHTKWECHAT_PAY.html");
System.out.println(template.getName());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//html 替换占位符
public static File writeHtml(Map<String, Object> data) throws IOException, TemplateException {
String fileName = UUID.randomUUID().toString();
File htmlFile = new File(FileUtil.getTmpDir(), fileName + ".html");
FileWriter sw = new FileWriter(htmlFile);
log.info("生成协议html, 地址:{}, 参数:{} ", htmlFile.getAbsolutePath(), data);
template.process(data, sw);
return htmlFile;
}
//html 转png 示例代码
public static File createAgreementPicture(File htmlFile) throws IOException {
File outputFile = new File(FileUtil.getTmpDir(), htmlFile.getName() + ".jpg");
log.info("生成图片开始, HTML地址 {}, 图片地址:{}", htmlFile.getAbsolutePath(), outputFile.getAbsolutePath());
String commandProcess = "wkhtmltoimage --width 400 --quality 94 " + htmlFile.getPath() + " " + outputFile.getPath();
log.info("协议执行procommand:{}", commandProcess);
long startTime = System.currentTimeMillis(); //获取开始时间
Process process = Runtime.getRuntime().exec(commandProcess);
try {
int exitVal = process.waitFor();
log.info("协议html转换png结果:{}", exitVal);
} catch (InterruptedException e) {
e.printStackTrace();
log.info("协议html转换png错误:{}", e.getMessage());
throw new IOException(e);
}
long endTime = System.currentTimeMillis(); //获取结束时间
log.info("程序运行时间: " + (endTime - startTime) + "ms");
log.info("生成图片结束,地址: {}", outputFile.getPath());
Thumbnails.of(outputFile).scale(1).outputQuality(0.9).toFile(outputFile);
return outputFile;
}
// 合并两张图片示例代码
public BufferedImage mergeImage(BufferedImage img1, BufferedImage img2, boolean isHorizontal) throws IOException {
int w1 = img1.getWidth();
int h1 = img1.getHeight();
int w2 = img2.getWidth();
int h2 = img2.getHeight();
// 从图片中读取RGB
int[] ImageArrayOne = new int[w1 * h1];
ImageArrayOne = img1.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
int[] ImageArrayTwo = new int[w2 * h2];
ImageArrayTwo = img2.getRGB(0, 0, w2, h2, ImageArrayTwo, 0, w2);
// 生成新图片
BufferedImage DestImage = null;
if (isHorizontal) { // 水平方向合并
// DestImage = new BufferedImage(w1+w2, h1, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = null;
if (h1 >= h2) {
DestImage = new BufferedImage(w1 + w2, h1, BufferedImage.TYPE_INT_RGB);
g2d = DestImage.createGraphics();
g2d.setPaint(Color.WHITE);
g2d.fillRect(0, 0, w1 + w2, h1);
g2d.dispose();
} else {
DestImage = new BufferedImage(w2, h1, BufferedImage.TYPE_INT_RGB);// TYPE_INT_RGB
g2d = DestImage.createGraphics();
g2d.setPaint(Color.WHITE);
g2d.fillRect(0, 0, w2 + w1, h1);
g2d.dispose();
}
DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
DestImage.setRGB(w1, 0, w2, h2, ImageArrayTwo, 0, w2);
} else { // 垂直方向合并
Graphics2D g2d = null;
if (w1 >= w2) {
DestImage = new BufferedImage(w1, h1 + h2, BufferedImage.TYPE_INT_RGB);// TYPE_INT_RGB
g2d = DestImage.createGraphics();
g2d.setPaint(Color.WHITE);
g2d.fillRect(0, 0, w1 + w2, h1 + h2);
g2d.dispose();
} else {
DestImage = new BufferedImage(w2, h1 + h2, BufferedImage.TYPE_INT_RGB);// TYPE_INT_RGB
g2d = DestImage.createGraphics();
g2d.setPaint(Color.WHITE);
g2d.fillRect(0, 0, w2 + w1, h1 + h2);
g2d.dispose();
}
DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
DestImage.setRGB(0, h1, w2, h2, ImageArrayTwo, 0, w2); // 设置下半部分的RGB
}
return DestImage;
}
}

View File

@ -0,0 +1,407 @@
package com.chaozhanggui.system.lkl.util;
import cn.hutool.crypto.digest.MD5;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringUtil extends StringUtils {
/**
* 根据身份证号获取性别
*
* @param certNo 身份证号
* @return 0 1
*/
public static String getSexFromCertNo(String certNo) {
String in17 = String.valueOf(certNo.charAt(16));
int intIn17 = Integer.parseInt(in17);
return (intIn17 % 2) >= 1 ? "0" : "1";
}
public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String random6() {
Random random = new Random();
String result = "";
for (int i = 0; i < 6; i++) {
result += random.nextInt(10);
}
return result;
}
public static String random6V2() {
return new MD5().digestHex(UUID.randomUUID().toString()).substring(0, 6);
}
public static String random(int length) {
Random random = new Random();
String result = "";
for (int i = 0; i < length; i++) {
result += random.nextInt(10);
}
return result;
}
//生产随机8位userCode
public static String genRandomNum() {
int maxNum = 36;
int i;
int count = 0;
char[] str = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
StringBuffer pwd = new StringBuffer("");
Random r = new Random();
while (count < 8) {
i = Math.abs(r.nextInt(maxNum));
if (i >= 0 && i < str.length) {
pwd.append(str[i]);
count++;
}
}
return pwd.toString();
}
//生成指定长度的随机数
public static String genRandomNum(int length) {
int maxNum = 36;
int i;
int count = 0;
char[] str = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
StringBuffer pwd = new StringBuffer("");
Random r = new Random();
while (count < length) {
i = Math.abs(r.nextInt(maxNum));
pwd.append(str[i]);
count++;
}
return pwd.toString();
}
public static String genUuid(){
return UUID.randomUUID().toString().replace("-","").toUpperCase(Locale.ROOT);
}
/**
* 生成订单号
*
* @return
*/
public static synchronized String getBillno() {
StringBuilder billno = new StringBuilder();
// 日期(格式:20080524)
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
billno.append(format.format(new Date()));
return billno.toString();
}
public static boolean isEmpty(Object content) {
if (content == null) {
return true;
}
if (content instanceof String) {
return "".equals(content);
} else {
return false;
}
}
public static String replaceNonLegalChar(String str) {
if (str == null) {
return null;
}
str = str.replace("", "(");
str = str.replace("", ")");
str = str.replaceAll("\\s*", "");
return str;
}
public static boolean isNotEmpty(Object content) {
return !isEmpty(content);
}
/**
* 计算分页数量
*
* @param count
* @param pageSize
* @return
*/
public static int getPageCount(int count, int pageSize) {
// TODO Auto-generated method stub
int pageCount = 0;
if (count == 0) {
return 0;
}
// 页长不能为0
if (pageSize == 0) {
return -1;
}
if (count % pageSize == 0) {
pageCount = count / pageSize;
} else {
pageCount = count / pageSize + 1;
}
return pageCount;
}
/**
* 计算分页数量
*
* @param count
* @param pageSize
* @return
*/
public static long getPageCount(long count, int pageSize) {
// TODO Auto-generated method stub
long pageCount = 0;
if (count == 0) {
return 0;
}
// 页长不能为0
if (pageSize == 0) {
return -1;
}
if (count % pageSize == 0) {
pageCount = count / pageSize;
} else {
pageCount = count / pageSize + 1;
}
return pageCount;
}
public static boolean equals(String str1, String str2) {
// TODO Auto-generated method stub
return str1 == null ? str2 == null : str1.equals(str2);
}
/**
* 返回一个定长的随机纯字母字符串(只包含大小写字母)
*
* @param length 随机字符串长度
* @return 随机字符串
*/
public static String generateMixStr(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(letterChar.charAt(random.nextInt(letterChar.length())));
}
return sb.toString();
}
/**
* 返回日时分秒
*
* @param second
* @return
*/
public static String secondToTime(long second) {
long days = second / 86400;//转换天数
second = second % 86400;//剩余秒数
long hours = second / 3600;//转换小时数
second = second % 3600;//剩余秒数
long minutes = second / 60;//转换分钟
second = second % 60;//剩余秒数
String min = minutes + "";
if (minutes < 10) {
min = "0" + minutes;
}
String sec = second + "";
if (second < 10) {
sec = "0" + second;
}
if (0 < days) {
return days + "";
} else {
return hours + "";
}
}
public static double bigDecimal(Double d) {
if (d == null) {
return 0d;
}
return new BigDecimal(d).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
public static double bigDecimal(Double d, RoundingMode roundingMode) {
if (d == null) {
return 0d;
}
return new BigDecimal(d).setScale(2, roundingMode).doubleValue();
}
public static String isHideMobile(String mobile) {
if (mobile.length() == 11) {
mobile = mobile.substring(0, 3) + "****" + mobile.substring(7);
}
return mobile;
}
public static boolean isNumber(String str) {
String regex = "^([0-9]+(.[0-9]{1,2})?)|(-[0-9]+(.[0-9]{1,2})?)$";
Pattern pattern = Pattern.compile(regex);
Matcher match = pattern.matcher(str);
// match.find()
return match.matches();
}
/**
* 隐藏隐私信息
*
* @param param
* @return
*/
public static String hideSecret(String param) {
int len = param.length();
if (isContainChinese(param)) {
String replaceValue = "**";
if (param.length() == 2) {
replaceValue = "*";
}
return param.replaceAll("(.{1})(.*)(.{0})", "$1" + replaceValue + "$3");
}
return param.replaceAll("(.{" + (len < 12 ? 3 : 6) + "})(.*)(.{4})", "$1" + "****" + "$3");
}
private static boolean isContainChinese(String str) {
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = p.matcher(str);
if (m.find()) {
return true;
}
return false;
}
public static String buildPostForm(String baseUrl, Map<String, String> parameters) {
StringBuffer sb = new StringBuffer();
sb.append("<form name=\"punchout_form\" method=\"post\" action=\"");
sb.append(baseUrl);
sb.append("\">\n");
sb.append(buildHiddenFields(parameters));
sb.append("<input type=\"submit\" value=\"pay...\" style=\"display:none\" >\n");
sb.append("</form>\n");
sb.append("<script>document.forms[0].submit();</script>");
String form = sb.toString();
return form;
}
public static String buildHiddenFields(Map<String, String> parameters) {
if (parameters == null || parameters.isEmpty()) {
return "";
}
StringBuffer sb = new StringBuffer();
Set<String> keys = parameters.keySet();
for (String key : keys) {
String value = parameters.get(key);
// 除去参数中的空值
if (key == null || value == null) {
continue;
}
sb.append("<input type=\"hidden\" name=\"");
sb.append(key);
sb.append("\" value=\"");
// 转义双引号
String a = value.replace("\"", "&quot;");
sb.append(a).append("\">\n");
}
return sb.toString();
}
/**
* @param src
* @param replaceSrc 需要替换的字符
* @param replacementList 替换后的字符
* @return
*/
public static String replaceOneByOne(String src, String[] replaceSrc, String[] replacementList) {
if (replaceSrc == null) {
throw new IllegalArgumentException("replaceSrc 不能为空");
}
if (replacementList == null) {
throw new IllegalArgumentException("replacementList 不能为空");
}
if (replaceSrc.length != replacementList.length) {
throw new IllegalArgumentException("replaceSrc 和 replacementList的长度必须相等");
}
StringBuffer sb = new StringBuffer();
int start = 0;
if (replacementList.length == 0) {
return src;
}
for (int i = 0; i < replaceSrc.length; i++) {
int position = src.indexOf(replaceSrc[i], start);
if (position == -1) {
continue;
}
sb.append(src, start, position);
sb.append(replacementList[i]);
start = position + 1;
}
sb.append(src, start, src.length());
return sb.toString();
}
/**
* 密码校验
* @param password
* @return
*/
public static String passwordCheck(String password){
int length = password.length();
if (length >= 7 && length <= 16){
return password;
}else {
return null;
}
}
/**
* 金额校验
* @param str
* @return
*/
public static boolean isMoney(String str) {
// 判断小数点后2位的数字的正则表达式
Pattern pattern = Pattern.compile("^(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){0,2})?$");
Matcher match = pattern.matcher(str);
return match.matches();
}
}

View File

@ -19,6 +19,7 @@
<module>oss-service</module>
<module>admin</module>
<module>merchant-service-api</module>
<module>lkl-service-api</module>
<!-- <module>order-service</module>-->
</modules>