Commit 40b95c9f authored by zhengjian's avatar zhengjian

你我贷

parent 3ec4b7ee
......@@ -11,19 +11,24 @@ import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContexts;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.net.ssl.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
......@@ -100,5 +105,66 @@ public class HttpClientConfig {
.build();
}
@Bean("niwodaiHttpsClient")
public CloseableHttpClient niwodaiHttpsClient() throws Exception{
/**
* 创建TrustManager
*/
X509TrustManager xtm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream(new File("F:\\9_QFNEW\\data-export-platform\\src\\main\\resources\\niwodai\\qg-keystore.jks")), "password".toCharArray());
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File("F:\\9_QFNEW\\data-export-platform\\src\\main\\resources\\niwodai\\qg-truststore.jks"), "password".toCharArray(), new TrustSelfSignedStrategy())
.loadKeyMaterial(keyStore, "password".toCharArray())
.build();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
sslcontext,
new String[]{"TLSv1.2"},
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslConnectionSocketFactory)
.build();
// connection manager
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
connectionManager.setMaxTotal(10000);
connectionManager.setDefaultMaxPerRoute(1000);
HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException arg0, int retryTimes, HttpContext arg2) {
if (retryTimes >= 2)
return false;
if (arg0 instanceof UnknownHostException || arg0 instanceof ConnectTimeoutException
|| !(arg0 instanceof SSLException) || arg0 instanceof SocketTimeoutException)
return true;
HttpClientContext clientContext = HttpClientContext.adapt(arg2);
HttpRequest request = clientContext.getRequest();
if (!(request instanceof HttpEntityEnclosingRequest)) // 如果请求被认为是幂等的,那么就重试。即重复执行不影响程序其他效果的
return true;
return false;
}
};
// keep alive strategy
ConnectionKeepAliveStrategy keepAliveStrategy = new DefaultConnectionKeepAliveStrategy();
return HttpClients.custom()
.setConnectionManager(connectionManager)
.setRetryHandler(retryHandler)
.setKeepAliveStrategy(keepAliveStrategy)
.build();
}
}
......@@ -26,4 +26,8 @@ public class RedisKeyConstants {
* 分发失败节点记录
*/
public final static String DISTRIBUTE_FAIL_TYPE_RECORD = "ASSET.DISTRIBUTE.DISTRIBUTE.FAIL.TYPE.KEY.8SAWNB_";
/**
* 你我贷token
*/
public static final String NI_WO_DAI_TOKEN_KEY = "DATA_EXPORT_PLATFORM:NIWODAI:TOKEN:YHALEA";
}
......@@ -78,4 +78,8 @@ public interface IHttpService {
public Map<String,String> postHasResponse(String url, Map<String, String> parameters);
public String post(String uri, Map<String, String> headers,Map<String, String> parameters,boolean isLog,int timeOut);
String postNiwodai(String uri, Map<String, String> headers, Map<String, String> parameters, boolean isLog);
String postNiwodaiJson(String uri, Map<String, String> headers, String jsonParams, boolean isLog);
}
......@@ -47,6 +47,9 @@ public class HttpServiceImpl implements IHttpService {
@Autowired
@Qualifier("httpClient")
private CloseableHttpClient httpClient;
@Autowired
@Qualifier("niwodaiHttpsClient")
private CloseableHttpClient niwodaiHttpsClient;
@Override
public String get(String uri) {
......@@ -275,6 +278,73 @@ public class HttpServiceImpl implements IHttpService {
IOUtils.closeQuietly(httpResponse);
}
}
@Override
public String postNiwodai(String uri, Map<String, String> headers, Map<String, String> parameters, boolean isLog) {
return doniwodaiHttps(RequestBuilder.post(),uri,headers,parameters,isLog,TIME_OUT_60);
}
@Override
public String postNiwodaiJson(String uri,Map<String, String> headers, String jsonParams,boolean isLog) {
return doniwodaiObjectHttps(RequestBuilder.post(),uri,headers,jsonParams,isLog,TIME_OUT_60);
}
public String doniwodaiObjectHttps(RequestBuilder requestBuilder, String uri, Map<String, String> headers, String jsonParams, boolean isLog, int timeOut){
String method = requestBuilder.getMethod();
HttpEntity httpEntity = null;
CloseableHttpResponse httpResponse = null;
try {
requestBuilder.setUri(uri);
this.setConfig(requestBuilder,timeOut);
this.setHeader(requestBuilder, headers);
this.setParameter(requestBuilder, jsonParams);
httpResponse = niwodaiHttpsClient.execute(requestBuilder.build());
int statusCode = httpResponse.getStatusLine().getStatusCode();
String response = null;
if(statusCode==200){
httpEntity = httpResponse.getEntity();
response = EntityUtils.toString(httpEntity, "UTF-8");
}
if(isLog) {
LOGGER.info("{}, uri:{},parameters:{},response:{},statusCode:{}", method, uri, jsonParams,response,statusCode);
}
return response;
} catch (Exception e) {
LOGGER.error("{}, uri:{}, parameters:{}", method, uri, jsonParams, e);
return null;
} finally {
EntityUtils.consumeQuietly(httpEntity);
IOUtils.closeQuietly(httpResponse);
}
}
public String doniwodaiHttps(RequestBuilder requestBuilder, String uri, Map<String, String> headers, Map<String, String> parameters, boolean isLog, int timeOut){
String method = requestBuilder.getMethod();
HttpEntity httpEntity = null;
CloseableHttpResponse httpResponse = null;
try {
requestBuilder.setUri(uri);
this.setConfig(requestBuilder,timeOut);
this.setHeader(requestBuilder, headers);
this.setParameter(requestBuilder, parameters);
httpResponse = niwodaiHttpsClient.execute(requestBuilder.build());
int statusCode = httpResponse.getStatusLine().getStatusCode();
String response = null;
if(statusCode==200){
httpEntity = httpResponse.getEntity();
response = EntityUtils.toString(httpEntity, "UTF-8");
}
if(isLog)
LOGGER.info("{}, uri:{},parameters:{},response:{},statusCode:{}", method, uri, parameters,response,statusCode);
return response;
} catch (Exception e) {
LOGGER.error("{}, uri:{}, parameters:{}", method, uri, parameters, e);
return null;
} finally {
EntityUtils.consumeQuietly(httpEntity);
IOUtils.closeQuietly(httpResponse);
}
}
/**
* Set Parameter
*
......
package com.quantgroup.asset.distribution.service.niwodai;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiDataImportCheckRequestVO;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiDataImportCheckResponseVO;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiIncomingRequestVO;
import com.quantgroup.asset.distribution.service.niwodai.vo.NiwodaiIncomingResponseVO;
public interface INiwodaiService {
NiwodaiDataImportCheckResponseVO dataImportCheck(NiwodaiDataImportCheckRequestVO requestVO);
NiwodaiIncomingResponseVO incoming(NiwodaiIncomingRequestVO niwodaiIncomingRequestVO);
}
package com.quantgroup.asset.distribution.service.niwodai.impl;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps;
import com.quantgroup.asset.distribution.constant.RedisKeyConstants;
import com.quantgroup.asset.distribution.exception.QGException;
import com.quantgroup.asset.distribution.service.httpclient.IHttpService;
import com.quantgroup.asset.distribution.service.niwodai.INiwodaiService;
import com.quantgroup.asset.distribution.service.niwodai.vo.*;
import com.quantgroup.asset.distribution.service.redis.IRedisService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Base64;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import static com.quantgroup.asset.distribution.exception.QGExceptionType.COMMON_THIRD_PARTY_TIMEOUT;
@Slf4j
@Service
public class NiwodaiServiceImpl implements INiwodaiService {
final static String domain = "https://api.preprod.geerong.com:8443/test";
final static String domain2 = "https://api.preprod.geerong.com:8443/al/test/asset";
final static String dataImportCheckUrl = domain2 + "/std/v1/entry";
final static String authUrl = domain + "/oauth/token";
final static String incomingUrl = domain2 + "/std/v1/apply";
final static String clientId = "36c36b1e-5e60-4ef9-811c-6714fbf88d90";
final static String clientSecret = "3W8uCiQk7aM1Vxwgaltt2A0tDqN8YYoKnz62pj8rKxw0usZYN6fQRL8wB7Eq3XKy";
@Autowired
IRedisService<String> iRedisService;
@Autowired
IHttpService iHttpService;
@Override
public NiwodaiDataImportCheckResponseVO dataImportCheck(NiwodaiDataImportCheckRequestVO requestVO) {
String token = getToken();
if (StringUtils.isEmpty(token)) {
log.error("你我贷准入检查时获取token失败,requestVO : {}", JSON.toJSONString(requestVO));
throw new QGException("你我贷准入检查时获取token失败", COMMON_THIRD_PARTY_TIMEOUT);
}
String result = iHttpService.postNiwodaiJson(dataImportCheckUrl, commonHeader(token), JSON.toJSONString(requestVO), true);
if (StringUtils.isNotEmpty(result)) {
return JSON.parseObject(result, NiwodaiDataImportCheckResponseVO.class);
}
return null;
}
@Override
public NiwodaiIncomingResponseVO incoming(NiwodaiIncomingRequestVO requestVO) {
String token = getToken();
if (StringUtils.isEmpty(token)) {
log.error("你我贷进件时获取token失败,requestVO : {}", JSON.toJSONString(requestVO));
throw new QGException("你我贷进件时获取token失败", COMMON_THIRD_PARTY_TIMEOUT);
}
String result = iHttpService.postNiwodaiJson(incomingUrl, commonHeader(token), JSON.toJSONString(requestVO),true);
if (StringUtils.isNotEmpty(result)) {
return JSON.parseObject(result, NiwodaiIncomingResponseVO.class);
}
return null;
}
public String getToken() {
String token = iRedisService.getString(RedisKeyConstants.NI_WO_DAI_TOKEN_KEY);
if (StringUtils.isBlank(token)) {
NiwodaiAccessTokenResponseVO vo = acquireAccessToken();
if (vo != null){
token = vo.getAccessToken();
iRedisService.setStringEx(RedisKeyConstants.NI_WO_DAI_TOKEN_KEY,token,10, TimeUnit.MINUTES);
}else {
return null;
}
}
return token;
}
public NiwodaiAccessTokenResponseVO acquireAccessToken() {
Map<String, String> header = Maps.newHashMap();
header.put("Content-Type", "application/x-www-form-urlencoded");
header.put("Authorization", "Basic " + Base64.getEncoder().encodeToString((clientId + ":" + clientSecret).getBytes()));
Map<String, String> parameters = Maps.newHashMap();
parameters.put("grant_type", "client_credentials");
String result = null;
try {
result = iHttpService.postNiwodai(authUrl, header, parameters, true);
} catch (Exception e) {
e.printStackTrace();
}
if (StringUtils.isNotEmpty(result)) {
return JSON.parseObject(result, NiwodaiAccessTokenResponseVO.class);
}
return null;
}
private static Map<String, String> commonHeader(String token) {
Map<String, String> header = Maps.newHashMap();
header.put("Authorization", " bearer " + token);
header.put("Content-Type", "application/json");
return header;
}
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class NiwodaiAccessTokenResponseVO {
@JsonProperty("access_token")
private String accessToken;
@JsonProperty("token_type")
private String tokenType;
@JsonProperty("expire_in")
private Long expireIn;
@JsonProperty("scope")
private String scope;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class NiwodaiDataImportCheckRequestVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 真实姓名 必填
*/
private String realName;
/**
*身份证号 必填
*/
private String idcardNumber;
/**
* 电话号码 必填
*/
private String phone;
/**
* 期望借款金额 非必填
*/
private BigDecimal amount;
/**
* 用户ID 非必填
*/
private String externalUserId;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class NiwodaiDataImportCheckResponseVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 是否通过,是:true,否:false 必须
*/
private Boolean pass;
/**
* 准入未通过原因 非必须
*/
private String reason;
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
@Data
public class NiwodaiIncomingRequestVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 资产渠道唯一标识当前申请信息的流水号 必填
*/
private String orderId;
/**
* 借款人基本信息 必填
*/
private NiwodaiCostant.UserInfo userInfo;
/**
* 借款申请信息 必填
*/
private NiwodaiCostant.LoanInfo loanInfo;
/**
* 公司信息 必填
*/
private NiwodaiCostant.CompnayInfo companyInfo;
/**
* 联系人信息 必填
*/
private NiwodaiCostant.Contacts contacts;
/**
* 运营商数据 必填
*/
private NiwodaiCostant.MnoData mnoData;
/**
* 手机安装App信息,JSON序列化后的字符串(需要GZIP压缩) 非必填
*/
private String appListData;
/**
* 设备信息,JSON序列化后的字符串(需要GZIP压缩) 非必填
*/
private String deviceInfo;
/**
* 人行征信授权信息 非必填
*/
private NiwodaiCostant.CreditRefData creditRefData;
public Map<String,Object> toMap(){
return JSONObject.parseObject(JSON.toJSONString(this));
}
}
package com.quantgroup.asset.distribution.service.niwodai.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class NiwodaiIncomingResponseVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 300004:进件处理中; 300005:进件拒绝 必填
*/
private Integer code;
/**
* 描述信息 非必填
*/
private String message;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment