@@ -1,20 +1,23 @@ | |||||
package com.ningdatech.pmapi.irs; | package com.ningdatech.pmapi.irs; | ||||
import com.alibaba.fastjson.JSONObject; | import com.alibaba.fastjson.JSONObject; | ||||
import com.google.common.collect.Maps; | |||||
import com.ningdatech.irs.service.IRefreshTokenService; | import com.ningdatech.irs.service.IRefreshTokenService; | ||||
import com.ningdatech.pmapi.AppTests; | import com.ningdatech.pmapi.AppTests; | ||||
import com.ningdatech.pmapi.common.util.CryptUtils; | import com.ningdatech.pmapi.common.util.CryptUtils; | ||||
import com.ningdatech.pmapi.common.util.HttpUtil; | import com.ningdatech.pmapi.common.util.HttpUtil; | ||||
import com.ningdatech.pmapi.gov.model.req.ProjectPushReq; | |||||
import com.ningdatech.pmapi.irs.model.dto.ForwardDTO; | |||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.springframework.beans.factory.annotation.Value; | import org.springframework.beans.factory.annotation.Value; | ||||
import org.springframework.http.HttpMethod; | |||||
import org.springframework.http.ResponseEntity; | |||||
import org.springframework.http.*; | |||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | ||||
import org.springframework.web.client.RestTemplate; | import org.springframework.web.client.RestTemplate; | ||||
import javax.annotation.Resource; | import javax.annotation.Resource; | ||||
import java.util.Map; | |||||
import java.util.Objects; | import java.util.Objects; | ||||
/** | /** | ||||
@@ -53,14 +56,9 @@ public class CoreTest extends AppTests { | |||||
Integer page = 1; | Integer page = 1; | ||||
long timestamp = System.currentTimeMillis(); | long timestamp = System.currentTimeMillis(); | ||||
String secret = refreshTokenService.refreshToken(appKey, appSecret, govRequestTokenUrl, govRefreshTokenUrl, | |||||
interfaceName, HttpMethod.POST.name()); | |||||
String sign = null; | |||||
try{ | |||||
sign = CryptUtils.MD5Encode(appKey + secret + timestamp); | |||||
}catch (Exception e){ | |||||
log.error(e.getMessage()); | |||||
} | |||||
// String secret = refreshTokenService.refreshToken(appKey, appSecret, govRequestTokenUrl, govRefreshTokenUrl, | |||||
// interfaceName, HttpMethod.POST.name()); | |||||
String secret = appSecret; | |||||
HttpComponentsClientHttpRequestFactory factory = HttpUtil.generateHttpRequestFactory(); | HttpComponentsClientHttpRequestFactory factory = HttpUtil.generateHttpRequestFactory(); | ||||
RestTemplate restTemplate; | RestTemplate restTemplate; | ||||
if(Objects.nonNull(factory)){ | if(Objects.nonNull(factory)){ | ||||
@@ -68,19 +66,26 @@ public class CoreTest extends AppTests { | |||||
}else{ | }else{ | ||||
restTemplate = new RestTemplate(); | restTemplate = new RestTemplate(); | ||||
} | } | ||||
String url = coreBizUrl + "?" + | |||||
"dingCode=" + orgCode + "&matterName=" + (StringUtils.isNotBlank(businessName)?businessName:StringUtils.EMPTY) + "&oid=&useState=1&" + | |||||
"limit=" + (Objects.isNull(limit) ? "10" : limit) + "&page=" + (Objects.isNull(page) ? "1" : page) + | |||||
"&appKey=" + appKey + "&sign=" + sign + "&requestTime=" + timestamp; | |||||
ResponseEntity<JSONObject> forEntity = restTemplate.getForEntity(url, JSONObject.class); | |||||
JSONObject body = forEntity.getBody(); | |||||
JSONObject datas = body.getJSONObject("datas"); | |||||
if(Objects.nonNull(datas)){ | |||||
System.out.println(datas); | |||||
} | |||||
System.out.println(forEntity.getBody()); | |||||
ForwardDTO dto = new ForwardDTO(); | |||||
Map<String,Object> map = Maps.newHashMap(); | |||||
map.put("dingCode",orgCode); | |||||
map.put("matterName",(StringUtils.isNotBlank(businessName)?businessName:StringUtils.EMPTY)); | |||||
map.put("useState",1); | |||||
map.put("limit",limit); | |||||
map.put("page",page); | |||||
map.put("appKey",appKey); | |||||
dto.setData(map); | |||||
dto.setUrl(coreBizUrl); | |||||
dto.setSecret(secret); | |||||
dto.setAppKey(appKey); | |||||
HttpHeaders headers = new HttpHeaders(); | |||||
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); | |||||
headers.setContentType(type); | |||||
headers.add("Accept", MediaType.APPLICATION_JSON.toString()); | |||||
HttpEntity<ForwardDTO> formEntity = new HttpEntity<ForwardDTO>(dto, headers); | |||||
String url = "http://10.53.168.41:38888/pm/api/v1/zwdd/pull/forward"; | |||||
ResponseEntity<String> forEntity = restTemplate.postForEntity(url,formEntity, String.class); | |||||
String body = forEntity.getBody(); | |||||
System.out.println(body);; | |||||
} | } | ||||
} | } |
@@ -112,6 +112,12 @@ | |||||
</exclusion> | </exclusion> | ||||
</exclusions> | </exclusions> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>org.apache.httpcomponents</groupId> | |||||
<artifactId>httpclient</artifactId> | |||||
<version>4.5.13</version> | |||||
</dependency> | |||||
</dependencies> | </dependencies> | ||||
<!-- 打包 --> | <!-- 打包 --> | ||||
@@ -102,4 +102,5 @@ public interface BizConst { | |||||
String OP_INSERT = "insert"; | String OP_INSERT = "insert"; | ||||
String OP_UPDATE = "update"; | String OP_UPDATE = "update"; | ||||
String OP_DELETE = "delete"; | String OP_DELETE = "delete"; | ||||
String OP_FAIL = "操作失败"; | |||||
} | } |
@@ -0,0 +1,85 @@ | |||||
package com.ningdatech.syndataapi.common.utils; | |||||
import org.apache.commons.codec.binary.Hex; | |||||
import javax.crypto.Mac; | |||||
import javax.crypto.SecretKey; | |||||
import javax.crypto.spec.SecretKeySpec; | |||||
import java.nio.charset.Charset; | |||||
import java.nio.charset.StandardCharsets; | |||||
import java.security.InvalidKeyException; | |||||
import java.security.MessageDigest; | |||||
import java.security.NoSuchAlgorithmException; | |||||
/** | |||||
* 加密工具 | |||||
* @author hank | |||||
*/ | |||||
public class CryptUtils { | |||||
/** | |||||
* 默认的算法 | |||||
*/ | |||||
private static final String DE_KEY_MAC = "HmacMD5"; | |||||
/** | |||||
* 默认的字符集 | |||||
*/ | |||||
private static final Charset DE_CHARSET = StandardCharsets.UTF_8; | |||||
/** | |||||
* 使用默认的算法(HmacMD5) 得到hmac 16进制字符串 | |||||
* @param inputStr 需要加密的串 | |||||
* @param key key | |||||
* @return 16进制字符串 | |||||
* @throws Exception | |||||
*/ | |||||
public static String encryptHMAC(String inputStr, String key) throws Exception { | |||||
return encryptHMAC(inputStr, key, DE_KEY_MAC); | |||||
} | |||||
/** | |||||
* 使用指定的算法得到hmac 16进制字符串 | |||||
* @param inputStr 需要加密的串 | |||||
* @param key key | |||||
* @param keyMac hmac算法 | |||||
* @return 16进制字符串 | |||||
* @throws Exception | |||||
*/ | |||||
public static String encryptHMAC(String inputStr, String key, String keyMac) throws Exception { | |||||
return Hex.encodeHexString(encryptHMAC(inputStr.getBytes(DE_CHARSET), key, keyMac)); | |||||
} | |||||
public static String MD5Encode(String origin) throws NoSuchAlgorithmException { | |||||
MessageDigest md = MessageDigest.getInstance("MD5"); | |||||
return Hex.encodeHexString(md.digest(origin.getBytes(DE_CHARSET))); | |||||
} | |||||
private static byte[] encryptHMAC(byte[] data, String key, String keyMac) throws Exception { | |||||
SecretKey secretKey = new SecretKeySpec(key.getBytes(DE_CHARSET), keyMac); | |||||
Mac mac = Mac.getInstance(secretKey.getAlgorithm()); | |||||
mac.init(secretKey); | |||||
return mac.doFinal(data); | |||||
} | |||||
/** | |||||
* 生成HMAC-MD5值 | |||||
* @param data 消息数据 | |||||
* @param key 密钥 | |||||
* @return HMAC-MD5值 | |||||
* @throws NoSuchAlgorithmException | |||||
* @throws InvalidKeyException | |||||
*/ | |||||
public static byte[] hmacMd5(byte[] data, byte[] key) | |||||
throws NoSuchAlgorithmException, InvalidKeyException { | |||||
SecretKeySpec signingKey = new SecretKeySpec(key, "HmacMD5"); | |||||
Mac mac = Mac.getInstance("HmacMD5"); | |||||
mac.init(signingKey); | |||||
return mac.doFinal(data); | |||||
} | |||||
public static void main(String[] args) throws Exception{ | |||||
System.out.println("HMACStr:\n" + encryptHMAC("a", "hank")); | |||||
} | |||||
} |
@@ -1,7 +1,9 @@ | |||||
package com.ningdatech.syndataapi.open.controller; | package com.ningdatech.syndataapi.open.controller; | ||||
import com.ningdatech.basic.model.ApiResponse; | import com.ningdatech.basic.model.ApiResponse; | ||||
import com.ningdatech.syndataapi.open.manage.IrsManage; | |||||
import com.ningdatech.syndataapi.open.manage.ProjectReceiveManage; | import com.ningdatech.syndataapi.open.manage.ProjectReceiveManage; | ||||
import com.ningdatech.syndataapi.scheduler.model.dto.ForwardDTO; | |||||
import com.ningdatech.syndataapi.scheduler.model.dto.ProjectBaseInfoDTO; | import com.ningdatech.syndataapi.scheduler.model.dto.ProjectBaseInfoDTO; | ||||
import com.ningdatech.syndataapi.scheduler.model.dto.ProjectSaveDTO; | import com.ningdatech.syndataapi.scheduler.model.dto.ProjectSaveDTO; | ||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
@@ -25,6 +27,8 @@ public class ProjectReceiveController { | |||||
private final ProjectReceiveManage receiveManage; | private final ProjectReceiveManage receiveManage; | ||||
private final IrsManage irsManage; | |||||
@PostMapping("/save") | @PostMapping("/save") | ||||
@ApiOperation("项目归集接收") | @ApiOperation("项目归集接收") | ||||
public ApiResponse<String> save(@Valid @RequestBody ProjectSaveDTO dto) { | public ApiResponse<String> save(@Valid @RequestBody ProjectSaveDTO dto) { | ||||
@@ -42,4 +46,10 @@ public class ProjectReceiveController { | |||||
public ApiResponse<String> deleteAll() { | public ApiResponse<String> deleteAll() { | ||||
return ApiResponse.ofSuccess(receiveManage.deleteAll()); | return ApiResponse.ofSuccess(receiveManage.deleteAll()); | ||||
} | } | ||||
@ApiOperation(value = "转发IRS请求", notes = "转发IRS请求 用于") | |||||
@PostMapping("/forward") | |||||
public String forward(@Valid @RequestBody ForwardDTO dto) { | |||||
return irsManage.forward(dto); | |||||
} | |||||
} | } |
@@ -0,0 +1,56 @@ | |||||
package com.ningdatech.syndataapi.open.manage; | |||||
import com.google.common.base.Joiner; | |||||
import com.ningdatech.syndataapi.common.constant.BizConst; | |||||
import com.ningdatech.syndataapi.common.utils.CryptUtils; | |||||
import com.ningdatech.syndataapi.scheduler.model.dto.ForwardDTO; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.http.ResponseEntity; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.web.client.RestTemplate; | |||||
import java.util.Map; | |||||
/** | |||||
* @Classname IrsManage | |||||
* @Description | |||||
* @Date 2023/9/1 15:15 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
public class IrsManage { | |||||
/** | |||||
* 转发IRS请求 | |||||
* @param dto | |||||
* @return | |||||
*/ | |||||
public String forward(ForwardDTO dto) { | |||||
try{ | |||||
String url = dto.getUrl(); | |||||
String appkey = dto.getAppKey(); | |||||
long timestamp = System.currentTimeMillis(); | |||||
String requestSecret = dto.getSecret(); | |||||
String sign = CryptUtils.MD5Encode(appkey + requestSecret + timestamp); | |||||
url = url + "?requestTime=" + timestamp + "&sign=" + sign + asUrlParams(dto.getData()); | |||||
log.info("url :{}",url); | |||||
RestTemplate restTemplate = new RestTemplate(); | |||||
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); | |||||
log.info(forEntity.getBody()); | |||||
return forEntity.getBody(); | |||||
}catch (Exception e){ | |||||
log.error("e:" + e); | |||||
} | |||||
return BizConst.OP_FAIL; | |||||
} | |||||
public static String asUrlParams(Map<String, Object> source){ | |||||
return Joiner.on("&") | |||||
// 用指定符号代替空值,key 或者value 为null都会被替换 | |||||
.useForNull("") | |||||
.withKeyValueSeparator("=") | |||||
.join(source); | |||||
} | |||||
} |
@@ -0,0 +1,26 @@ | |||||
package com.ningdatech.syndataapi.scheduler.model.dto; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.io.Serializable; | |||||
import java.util.Map; | |||||
/** | |||||
* @Classname ForwardDTO | |||||
* @Description | |||||
* @Date 2023/7/13 18:03 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Data | |||||
@AllArgsConstructor | |||||
@NoArgsConstructor | |||||
public class ForwardDTO implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
private String url; | |||||
private String secret; | |||||
private String appKey; | |||||
private Map<String,Object> data; | |||||
} |