|
@@ -0,0 +1,281 @@
|
|
|
|
+package info.aspirecn.iov.sjjh.supplier10000053.service.impl;
|
|
|
|
+
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
+import info.aspirecn.iov.sjjh.commons.lang.ChannelTypeHandleResponseObject;
|
|
|
|
+import info.aspirecn.iov.sjjh.commons.lang.Constant;
|
|
|
|
+import info.aspirecn.iov.sjjh.commons.lang.PatternTools;
|
|
|
|
+import info.aspirecn.iov.sjjh.supplier10000053.constant.CommonConstant;
|
|
|
|
+import info.aspirecn.iov.sjjh.supplier10000053.exception.ServiceException;
|
|
|
|
+import info.aspirecn.iov.sjjh.supplier10000053.model.CommonRequestObject;
|
|
|
|
+import info.aspirecn.iov.sjjh.supplier10000053.model.CommonResponseObject;
|
|
|
|
+import info.aspirecn.iov.sjjh.supplier10000053.model.CreditScoreRequestParam;
|
|
|
|
+import info.aspirecn.iov.sjjh.supplier10000053.model.TokenResponseObject;
|
|
|
|
+import info.aspirecn.iov.sjjh.supplier10000053.service.ChannelService;
|
|
|
|
+import info.aspirecn.iov.sjjh.supplier10000053.util.Des3Util;
|
|
|
|
+import info.aspirecn.iov.sjjh.supplier10000053.util.HttpUtil;
|
|
|
|
+import info.aspirecn.rdc.aspirecloud.node.except.utils.ErrorUtils;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
|
+import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+
|
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
|
+import javax.validation.ConstraintViolation;
|
|
|
|
+import javax.validation.Validation;
|
|
|
|
+import javax.validation.Validator;
|
|
|
|
+import javax.validation.ValidatorFactory;
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.Set;
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @author xusonglin
|
|
|
|
+ * @version V1.0
|
|
|
|
+ **/
|
|
|
|
+@Service
|
|
|
|
+@Slf4j
|
|
|
|
+public class ChannelServiceImpl implements ChannelService {
|
|
|
|
+ @Value("${supplier.token.url}")
|
|
|
|
+ private String tokenUrl;
|
|
|
|
+ @Value("${supplier.token.appId}")
|
|
|
|
+ private String appId;
|
|
|
|
+ @Value("${supplier.token.appSecret}")
|
|
|
|
+ private String appSecret;
|
|
|
|
+ @Value("${supplier.interface.url}")
|
|
|
|
+ private String interfaceUrl;
|
|
|
|
+ @Value("${supplier.productId.creditScore}")
|
|
|
|
+ private String creditScore;
|
|
|
|
+ @Value("${supplier.des.key}")
|
|
|
|
+ private String desKey;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ StringRedisTemplate stringRedisTemplate;
|
|
|
|
+ @Autowired
|
|
|
|
+ private ObjectMapper objectMapper;
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public String queryAccessToken(int outTime) {
|
|
|
|
+ StringBuffer buffer = new StringBuffer(tokenUrl)
|
|
|
|
+ .append("?")
|
|
|
|
+ .append("appId=")
|
|
|
|
+ .append(appId)
|
|
|
|
+ .append("&appSecret=")
|
|
|
|
+ .append(appSecret);
|
|
|
|
+
|
|
|
|
+ String responseContext = "";
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ responseContext = HttpUtil.doGet(outTime, buffer.toString());
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ log.info("supplier10000053.getToken调用接口异常-Exception:{}", e);
|
|
|
|
+ ErrorUtils.captureException(e);
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ log.info("supplier10000053.getToken返回结果:{}", responseContext);
|
|
|
|
+ TokenResponseObject responseObject = JSONObject.toJavaObject(
|
|
|
|
+ JSON.parseObject(responseContext), TokenResponseObject.class);
|
|
|
|
+ if (responseObject != null && responseObject.getCode().equals(CommonConstant.GET_TOKEN_SUCCESS_CODE)) {
|
|
|
|
+ String token = responseObject.getToken() + "&&" + System.currentTimeMillis();
|
|
|
|
+ stringRedisTemplate.opsForValue().set(CommonConstant.REDIS_TOKEN_KEY, token, 30, TimeUnit.MINUTES);
|
|
|
|
+ return responseObject.getToken();
|
|
|
|
+ } else {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String getAccessToken(int outTime) {
|
|
|
|
+ String redisToken = stringRedisTemplate.opsForValue().get(CommonConstant.REDIS_TOKEN_KEY);
|
|
|
|
+ String token;
|
|
|
|
+ if (StringUtils.isNotBlank(redisToken)) {
|
|
|
|
+ String[] redisTokenArray = redisToken.split("&&");
|
|
|
|
+ String accessTokenTimestamp = redisTokenArray[1];
|
|
|
|
+ if (System.currentTimeMillis() - Long.parseLong(accessTokenTimestamp) >= 1680000) {
|
|
|
|
+ // 超过2小时,重新获取token
|
|
|
|
+ token = queryAccessToken(outTime);
|
|
|
|
+ log.info("超过28分钟,重新获取token");
|
|
|
|
+ } else {
|
|
|
|
+ // 从redis中获取token
|
|
|
|
+ token = redisTokenArray[0];
|
|
|
|
+ log.info("从redis中获取token");
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ // token不存在,获取token
|
|
|
|
+ token = queryAccessToken(outTime);
|
|
|
|
+ log.info("token不存在,获取token");
|
|
|
|
+ }
|
|
|
|
+ return token;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ChannelTypeHandleResponseObject creditScoreQuery(HttpServletRequest request, String customBody, int outTime) {
|
|
|
|
+ ChannelTypeHandleResponseObject ret = new ChannelTypeHandleResponseObject();
|
|
|
|
+ ret.setIsCharge(Constant.INTERFACE_QUERY_NO_FEE);
|
|
|
|
+ String upstreamCode = "" + Constant.LOG_UPSTREAM_DEFAULT_RESPONSE_CODE;
|
|
|
|
+ request.setAttribute(Constant.LOG_UPSTREAM_RESPONSE_CODE, upstreamCode);
|
|
|
|
+ String returnType = request.getHeader(Constant.CUSTOMER_RETURN_TYPE_PARA);
|
|
|
|
+ if (StringUtils.isBlank(returnType)) {
|
|
|
|
+ returnType = Constant.CUSTOMER_RETURN_ZW;
|
|
|
|
+ }
|
|
|
|
+ if (outTime <= CommonConstant.PARA_ZERO) {
|
|
|
|
+ outTime = Constant.HTTPCLIENT_CONNECTTIMEOUT;
|
|
|
|
+ }
|
|
|
|
+ log.info("supplier10000053.creditScoreQuery---customBody={},outTime={}", customBody, outTime);
|
|
|
|
+ CreditScoreRequestParam requestParam = new CreditScoreRequestParam();
|
|
|
|
+ try {
|
|
|
|
+ requestParam = objectMapper.readValue(customBody, CreditScoreRequestParam.class);
|
|
|
|
+ } catch (IOException ioe) {
|
|
|
|
+ log.info("supplier10000053.creditScoreQuery接口-IOException:{}", ioe);
|
|
|
|
+ ErrorUtils.captureException(ioe);
|
|
|
|
+ ret.setCode(Constant.FAIL);
|
|
|
|
+ }
|
|
|
|
+ // 参数校验
|
|
|
|
+ if (!validateParams(ret, returnType, requestParam)) {
|
|
|
|
+ ret.setCode(Constant.SUCCESS);
|
|
|
|
+ request.setAttribute(Constant.LOG_UPSTREAM_RESPONSE_CODE, upstreamCode);
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ CommonRequestObject requestObject = new CommonRequestObject();
|
|
|
|
+ String traceId = request.getHeader("x-b3-traceid");
|
|
|
|
+// String traceId = System.currentTimeMillis() + "test";
|
|
|
|
+// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyMMddhhmmss");
|
|
|
|
+// requestParam.setEmpowerNo(simpleDateFormat.format(new Date()) + (String.valueOf(System.currentTimeMillis()).substring(0, 8)));
|
|
|
|
+
|
|
|
|
+ String encryptParam = Des3Util.encode(desKey, JSON.toJSONString(requestParam));
|
|
|
|
+ JSONObject encryptParamObject = new JSONObject();
|
|
|
|
+ encryptParamObject.put("params", encryptParam);
|
|
|
|
+
|
|
|
|
+ requestObject.setAccessId(traceId);
|
|
|
|
+ requestObject.setProductId(creditScore);
|
|
|
|
+ requestObject.setCustomBody(encryptParamObject);
|
|
|
|
+
|
|
|
|
+ String token = getAccessToken(outTime);
|
|
|
|
+ try {
|
|
|
|
+ CommonResponseObject responseObject = getCommonResponseObject("creditScoreQuery", token, outTime, JSON.toJSONString(requestObject));
|
|
|
|
+ if (responseObject != null) {
|
|
|
|
+ setCreditScoreResponseObject(responseObject, ret);
|
|
|
|
+ upstreamCode = responseObject.getResultCode();
|
|
|
|
+ } else {
|
|
|
|
+ ret.setCode(Constant.FAIL);
|
|
|
|
+ }
|
|
|
|
+ } catch (ServiceException se) {
|
|
|
|
+ if (se.getErrorCode().equals(Constant.REQUEST_TIMEOUT)) {
|
|
|
|
+ log.info("supplier10000053.creditScoreQuery-SocketTimeoutException:", se);
|
|
|
|
+ ErrorUtils.captureException(se);
|
|
|
|
+ ret.setCode(Constant.REQUEST_TIMEOUT);
|
|
|
|
+ } else {
|
|
|
|
+ log.info("supplier10000053.creditScoreQuery接口-Exception:", se);
|
|
|
|
+ ErrorUtils.captureException(se);
|
|
|
|
+ ret.setCode(Constant.FAIL);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ request.setAttribute(Constant.LOG_UPSTREAM_RESPONSE_CODE, upstreamCode);
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void setCreditScoreResponseObject(CommonResponseObject commonResponseObject, ChannelTypeHandleResponseObject ret) {
|
|
|
|
+ if (commonResponseObject.getResultCode().equals(CommonConstant.RESPONSE_CODE_1)) {
|
|
|
|
+ JSONObject resultBody = JSON.parseObject(commonResponseObject.getResultBody());
|
|
|
|
+ String jxbScore = resultBody.getString("jxbScore3");
|
|
|
|
+ if (jxbScore.equals("-1")) {
|
|
|
|
+ ret.setResultCode(Constant.JK_RETURN_CODE_1190);
|
|
|
|
+ ret.setResultBody(Constant.RETURN_MESSAGE_137);
|
|
|
|
+ ret.setResultDesc(Constant.RETURN_MESSAGE_137);
|
|
|
|
+ } else if (jxbScore.equals("-2")) {
|
|
|
|
+ ret.setResultCode(Constant.JK_RETURN_CODE_1191);
|
|
|
|
+ ret.setResultBody(Constant.RETURN_MESSAGE_138);
|
|
|
|
+ ret.setResultDesc(Constant.RETURN_MESSAGE_138);
|
|
|
|
+ } else {
|
|
|
|
+ ret.setResultCode(Constant.JK_RETURN_CODE_MATCH);
|
|
|
|
+ ret.setResultBody(jxbScore);
|
|
|
|
+ ret.setResultDesc(CommonConstant.QUERY_SUCCESS_MESSAGE);
|
|
|
|
+ ret.setIsCharge(Constant.INTERFACE_QUERY_FEE);
|
|
|
|
+ }
|
|
|
|
+ } else if (commonResponseObject.getResultCode().equals(CommonConstant.RESPONSE_CODE_8)) {
|
|
|
|
+ ret.setResultCode(Constant.JK_RETURN_CODE_INVALID_PARAMETER);
|
|
|
|
+ ret.setResultDesc(Constant.INVALID_PARAMETER);
|
|
|
|
+ ret.setResultBody(Constant.INVALID_PARAMETER);
|
|
|
|
+ } else {
|
|
|
|
+ ret.setResultCode(Constant.JK_RETURN_CODE_OTHER_ERROR);
|
|
|
|
+ ret.setResultBody(Constant.OTHER_ERROR);
|
|
|
|
+ ret.setResultDesc(Constant.OTHER_ERROR);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private CommonResponseObject getCommonResponseObject(String method, String token, int outTime, String body) {
|
|
|
|
+ String responseContext;
|
|
|
|
+ try {
|
|
|
|
+ log.info("supplier10000053.{}---requestBody:{}", method, body);
|
|
|
|
+ responseContext = HttpUtil.doPost(interfaceUrl, body, outTime, token);
|
|
|
|
+ log.info("supplier10000053.{}---上游返回结果:{}", method, responseContext);
|
|
|
|
+ } catch (ServiceException se) {
|
|
|
|
+ log.info("supplier10000053.请求上游结果-ServiceException:", se);
|
|
|
|
+ throw se;
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isBlank(responseContext)) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return JSON.toJavaObject(JSON.parseObject(responseContext), CommonResponseObject.class);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private boolean validateParams(ChannelTypeHandleResponseObject ret, String returnType, CreditScoreRequestParam requestObject) {
|
|
|
|
+ if (!validateParamNullValue(requestObject)) {
|
|
|
|
+ if (Constant.CUSTOMER_RETURN_ZW.equals(returnType)) {
|
|
|
|
+ ret.setResultCode(Constant.INVALID_PARAMETER_CODE);
|
|
|
|
+ ret.setResultBody(Constant.PARAMETER_NAME_ERROR);
|
|
|
|
+ ret.setResultDesc(Constant.PARAMETER_NAME_ERROR);
|
|
|
|
+ } else {
|
|
|
|
+ ret.setResultCode(Constant.JK_RETURN_CODE_INVALID_PARAMETER);
|
|
|
|
+ ret.setResultBody(Constant.PARAMETER_NAME_ERROR);
|
|
|
|
+ ret.setResultDesc(Constant.PARAMETER_NAME_ERROR);
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ } else if (StringUtils.isBlank(requestObject.getMobile()) ||
|
|
|
|
+ !PatternTools.checkResult(Constant.PATTERN_MOBILE_REGEX, requestObject.getMobile())) {
|
|
|
|
+ if (Constant.CUSTOMER_RETURN_ZW.equals(returnType)) {
|
|
|
|
+ ret.setResultCode(Constant.MOBILE_FORMAT_ERROR_CODE);
|
|
|
|
+ ret.setResultDesc(Constant.MOBILE_FORMAT_ERROR);
|
|
|
|
+ ret.setResultBody(Constant.MOBILE_FORMAT_ERROR);
|
|
|
|
+ } else {
|
|
|
|
+ ret.setResultCode(Constant.JK_MOBILE_FORMAT_ERROR_CODE);
|
|
|
|
+ ret.setResultDesc(Constant.JK_MOBILE_FORMAT_ERROR);
|
|
|
|
+ ret.setResultBody(Constant.JK_MOBILE_FORMAT_ERROR);
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ } else if (StringUtils.isBlank(requestObject.getEmpowerNo())
|
|
|
|
+ || requestObject.getEmpowerNo().length() != 20) {
|
|
|
|
+ if (Constant.CUSTOMER_RETURN_ZW.equals(returnType)) {
|
|
|
|
+ ret.setResultCode(Constant.INVALID_PARAMETER_CODE);
|
|
|
|
+ ret.setResultDesc(Constant.INVALID_PARAMETER);
|
|
|
|
+ ret.setResultBody(Constant.INVALID_PARAMETER);
|
|
|
|
+ } else {
|
|
|
|
+ ret.setResultCode(Constant.JK_RETURN_CODE_INVALID_PARAMETER);
|
|
|
|
+ ret.setResultDesc(Constant.INVALID_PARAMETER);
|
|
|
|
+ ret.setResultBody(Constant.INVALID_PARAMETER);
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ } else {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private boolean validateParamNullValue(Object jsonResolveObject) {
|
|
|
|
+ ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
|
|
|
|
+ Validator validator = vf.getValidator();
|
|
|
|
+ Set<ConstraintViolation<Object>> set = validator.validate(jsonResolveObject);
|
|
|
|
+ for (ConstraintViolation<Object> con : set) {
|
|
|
|
+ if (StringUtils.isNotBlank(con.getMessage())) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+}
|