package cn.com.do1.dsf.modules.zdph.base.service.impl;
import cn.com.do1.dsf.common.utils.StringUtils;
import cn.com.do1.dsf.modules.zdph.base.service.ZdphAccessTokenService;
import cn.com.do1.dsf.modules.zdph.base.service.ZdphRequestService;
import cn.com.do1.dsf.modules.zdph.base.util.ZdphHttpRequestBaseUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sgcc.sm.SM2Utils;
import com.sgcc.sm.SM3Utils;
import com.sgcc.sm.Util;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.util.encoders.Hex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* 中電普華請求Service實現類
* Created by ysq
* time 2020-01-11 11:39
* Copyright (c) 2019 廣東道一信息技術股份有限公司 All rights reserved.
*/
@Slf4j
@Service("zdphRequestService")
public class ZdphRequestServiceImpl implements ZdphRequestService {
@Value("${zdph.serverUrl}")
private String serverUrl;
@Value("${zdph.serverPort}")
private String serverPort;
@Value("${zdph.serverScheme}")
private String serverScheme;
@Value("${zdph.publicKey}")
private String publicKey;
@Value("${zdph.privateKey}")
private String privateKey;
@Autowired
private ZdphAccessTokenService zdphAccessTokenService;
/**
* 通用請求
* @param url 接口相對路徑
* @param params 參數
* @return 解密後的json
*/
@Override
public String requestPost(String url, Map<String, String> params) {
//封裝url
StringBuilder urlBuilder = new StringBuilder()
.append(serverScheme)
.append("://")
.append(serverUrl).append(":")
.append(serverPort)
.append(url);
return commonRequestPost(urlBuilder.toString(),true,params);
}
/**
* 獲取accessToken
* @param url access路徑
* @param params 參數
* @return json
*/
@Override
public String reqestAccessToken(String url, Map<String, String> params) {
StringBuilder urlBuilder = new StringBuilder()
.append(serverScheme)
.append("://")
.append(serverUrl).append(":")
.append(serverPort)
.append(url);
return commonRequestPost(urlBuilder.toString(),false,params);
}
/**
* 統一加密請求
* @param url
* @param isNeedToken
* @param params
* @return
*/
protected String commonRequestPost(String url,boolean isNeedToken,Map<String, String> params){
String accessToken = "";
//獲取accessToken
if(isNeedToken) {
accessToken = zdphAccessTokenService.getAccessToken();
}
try {
Map<String,String> requestParam = new HashMap<>();
String jsonValue;
if(null == params || params.isEmpty()){
jsonValue = "";
}else{
ObjectMapper objectMapper = new ObjectMapper();
jsonValue = objectMapper.writeValueAsString(params);
}
Calendar calendar = Calendar.getInstance(Locale.CHINA);
long timestamp = calendar.getTime().getTime();
//加密對象
byte[] encByte = new SM2Utils().encryptData(Util.decodeHex(publicKey.toCharArray()), Util.encodeHexString(jsonValue.getBytes()).getBytes());
String encryptData = Util.byteToHex(encByte);
//簽名生成
StringBuilder signBuilder = new StringBuilder().append(encryptData).append(accessToken).append(timestamp);
byte[] md = new SM3Utils().sign(signBuilder.toString().getBytes());
String sign = new String(Hex.encode(md));
//塞入對象
requestParam.put("encryptData", encryptData);
requestParam.put("timestamp", String.valueOf(timestamp));
requestParam.put("sign", sign);
//請求
String resultJson = ZdphHttpRequestBaseUtil.postJsonData(url,accessToken,requestParam);
if(StringUtils.isEmpty(resultJson)){
return "";
}
JSONObject jsonObject = JSON.parseObject(resultJson);
String encryptDataKey = "encryptData";
if(!jsonObject.containsKey(encryptDataKey)){
return "";
}
encryptData = jsonObject.getString(encryptDataKey);
byte[]decByte = new SM2Utils().decryptData(Hex.decode(privateKey), Hex.decode(encryptData.getBytes()));
String decryptValue = new String(Hex.decode(decByte));
log.info("請求路徑={} 請求參數={} 請求結果={}",url,JSON.toJSONString(requestParam),decryptValue);
return decryptValue;
}catch (Exception e){
log.error("請求中電普華結果異常",e);
}
return "";
}
}