882f72f67319bc4ba793e635b69a54c95249aaa6.svn-base 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package cn.com.goldenwater.dcproj.utils.http;
  2. import cn.com.goldenwater.dcproj.utils.HttpHeadHelper;
  3. import cn.com.goldenwater.id.util.UuidUtil;
  4. import com.dcxx.framework.watermanagesdk.model.ResponseMessage;
  5. import com.dcxx.framework.watermanagesdk.utils.EncryptHelper;
  6. import com.dcxx.framework.watermanagesdk.utils.JsonHelper;
  7. import org.apache.commons.collections.MapUtils;
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.data.redis.core.RedisCallback;
  14. import org.springframework.data.redis.core.RedisTemplate;
  15. import org.springframework.http.HttpEntity;
  16. import org.springframework.http.HttpHeaders;
  17. import org.springframework.http.MediaType;
  18. import org.springframework.stereotype.Component;
  19. import org.springframework.web.client.RestTemplate;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import java.util.Objects;
  23. import java.util.concurrent.TimeUnit;
  24. @Component
  25. public class SsoHttpHelper {
  26. private Logger logger = LoggerFactory.getLogger(getClass());
  27. // 定义接口常量
  28. public static String GET_ACCESS_TOKEN = "/service/v1/token/getAccessToken";//获取access_token
  29. @Value("${watermanage.baseurl}")
  30. private String baseurl;
  31. @Value("${watermanage.appkey}")
  32. private String appkey;
  33. @Value("${watermanage.appsecret}")
  34. private String appsecret;
  35. @Autowired
  36. private RedisTemplate redisTemplate;
  37. /**
  38. * @Description
  39. * @date 2020-07-15
  40. * 接入资源业务系统
  41. * 获取access_token保存至redis中,设置有效时长7200秒,
  42. */
  43. public String getAccessToken() throws Exception {
  44. // 获取waterManageAccessToken,如果为空,则请求waterManageAccessToken,保存至redis,时长为7300秒,过期后需重新生成放入
  45. String waterManageAccessToken = (String) redisTemplate.opsForValue().get("watermanage_access_token");
  46. logger.info("watermanage_access_token是否为空:" + waterManageAccessToken);
  47. if (StringUtils.isBlank(waterManageAccessToken)) {
  48. Map<String, String> parameter = new HashMap<>();//添加参数
  49. parameter.put("appkey", appkey);
  50. String nonce = UuidUtil.genernateNonce(8);
  51. parameter.put("nonce", nonce);
  52. String timestamp = System.currentTimeMillis() + "";
  53. parameter.put("timestamp", timestamp);
  54. String content = "appkey=" + appkey + "&appsecret=" + appsecret + "&nonce=" + nonce + "&timestamp=" + timestamp;
  55. parameter.put("sign", EncryptHelper.sha(content));
  56. ResponseMessage responseMessage = this.allMethod(parameter, GET_ACCESS_TOKEN, waterManageAccessToken);
  57. if (0 == responseMessage.getStatus()) {
  58. Map<String, Object> map = (Map) responseMessage.getMessage();
  59. waterManageAccessToken = MapUtils.getString(map, "access_token");
  60. redisTemplate.opsForValue().set("watermanage_access_token", waterManageAccessToken, 7200, TimeUnit.SECONDS);
  61. return waterManageAccessToken;
  62. } else {
  63. this.logger.info("请求业务接口获取access_token异常 ==> " + responseMessage.getErrmsg());
  64. throw new Exception("请求业务接口获取access_token异常 ==> " + responseMessage.getErrmsg());
  65. }
  66. }
  67. return waterManageAccessToken;
  68. }
  69. /**
  70. * @Description
  71. * @date 2020-07-15
  72. * 接入资源业务系统
  73. * 获取access_token保存至redis中,设置有效时长7200秒,
  74. */
  75. public String getAccessTokenDingChuan(String dingChuanAppkey, String dingChuanAppsecret) throws Exception {
  76. // 获取waterManageAccessToken,如果为空,则请求waterManageAccessToken,保存至redis,时长为7300秒,过期后需重新生成放入
  77. String waterManageAccessToken = (String) redisTemplate.opsForValue().get("ding_chuan_token");
  78. logger.info("watermanage_access_token是否为空:" + waterManageAccessToken);
  79. if (StringUtils.isBlank(waterManageAccessToken)) {
  80. Map<String, Object> parameter = new HashMap<>();//添加参数
  81. parameter.put("appkey", dingChuanAppkey);
  82. String nonce = UuidUtil.genernateNonce(8);
  83. parameter.put("nonce", nonce);
  84. String timestamp = System.currentTimeMillis() + "";
  85. parameter.put("timestamp", timestamp);
  86. String content = dingChuanAppkey + dingChuanAppsecret + nonce + timestamp;
  87. parameter.put("sign", EncryptHelper.sha(content));
  88. ResponseMessage responseMessage = this.allMethodDingChuan(parameter, "/api/open/auth/getToken", waterManageAccessToken, "https://sldc.dcyun.com:38266/supervisepc");
  89. if (0 == responseMessage.getStatus()) {
  90. Map<String, Object> map = (Map) responseMessage.getMessage();
  91. waterManageAccessToken = MapUtils.getString(map, "token");
  92. redisTemplate.opsForValue().set("ding_chuan_token", waterManageAccessToken, 7200, TimeUnit.SECONDS);
  93. return waterManageAccessToken;
  94. } else {
  95. this.logger.info("请求业务接口获取access_token异常 ==> " + responseMessage.getErrmsg());
  96. throw new Exception("请求业务接口获取access_token异常 ==> " + responseMessage.getErrmsg());
  97. }
  98. }
  99. return waterManageAccessToken;
  100. }
  101. /**
  102. * @Description请求数据
  103. * @date 2020-07-15
  104. */
  105. public ResponseMessage allMethod(Map<String, String> map, String url, String watermanage_access_token) {
  106. ResponseMessage responseMessage = new ResponseMessage("");
  107. try {
  108. //(1)每个appkey调用单个接口的频率不可超过5次/秒,否则返回错误码701401。
  109. //(2)每个appkey调用单个接口的频率不可超过300次/分,否则返回错误码701402。
  110. //(3)每个appkey调用多个接口的频率不可超过500次/分,否则返回错误码701403。
  111. //(4)如果有具体接口调用频次限制,以接口调用频次为准。
  112. Thread.sleep(230);
  113. HttpHeaders headers = new HttpHeaders();
  114. if (StringUtils.isNotBlank(watermanage_access_token)) {
  115. headers.add("watermanage_access_token", watermanage_access_token);
  116. }
  117. headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
  118. HttpEntity<Map<String, String>> strEntity;
  119. if (null != map) {
  120. strEntity = new HttpEntity<>(map, headers);
  121. } else {
  122. strEntity = new HttpEntity<>(headers);
  123. }
  124. RestTemplate restTemplate = new RestTemplate();
  125. this.logger.info("访问接口:url=" + url);
  126. String allMethod = restTemplate.postForObject(baseurl + url, strEntity, String.class);
  127. responseMessage = JsonHelper.json2Object(allMethod, ResponseMessage.class);
  128. return responseMessage;
  129. } catch (InterruptedException e) {
  130. this.logger.error("睡眠等待过程异常", e);
  131. return new ResponseMessage(-1, "睡眠等待过程报错");
  132. } catch (Exception e) {
  133. this.logger.error("访问水管平台报错" + url + "---" + e.getMessage().toString());
  134. return new ResponseMessage(-1, "访问水管平台报错");
  135. }
  136. }
  137. /**
  138. * @Description请求数据
  139. * @date 2020-07-15
  140. */
  141. public ResponseMessage allMethodDingChuan(Map<String, Object> map, String url, String watermanage_access_token, String dingChuanUrl) {
  142. ResponseMessage responseMessage = new ResponseMessage("");
  143. try {
  144. Thread.sleep(230);
  145. Map<String, String> headers = new HashMap<>();
  146. if (StringUtils.isNotBlank(watermanage_access_token)) {
  147. headers.put("token", watermanage_access_token);
  148. }
  149. headers.put("Content-Type", "application/json");
  150. //String allMethod = restTemplate.postForObject(dingChuanUrl + url, strEntity, String.class);
  151. String result = HttpHeadHelper.doPost(dingChuanUrl + url, map, headers);
  152. responseMessage = JsonHelper.json2Object(result, ResponseMessage.class);
  153. return responseMessage;
  154. } catch (InterruptedException e) {
  155. this.logger.error("睡眠等待过程异常", e);
  156. return new ResponseMessage(-1, "睡眠等待过程报错");
  157. } catch (Exception e) {
  158. this.logger.error("访问水管平台报错" + url + "---" + e.getMessage().toString());
  159. return new ResponseMessage(-1, "访问水管平台报错");
  160. }
  161. }
  162. /**
  163. * 获取一个redis漫衍锁
  164. *
  165. * @param lockKey 锁住的key
  166. * @param lockExpireMils 锁住的时长。若是超时未解锁,视为加锁线程殒命,其他线程可争取锁
  167. * @return
  168. */
  169. public boolean lock(String lockKey, long lockExpireMils) {
  170. return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
  171. long nowTime = System.currentTimeMillis();
  172. Boolean acquire = connection.setNX(lockKey.getBytes(), String.valueOf(nowTime + lockExpireMils + 1).getBytes());
  173. if (acquire) {
  174. return Boolean.TRUE;
  175. } else {
  176. byte[] value = connection.get(lockKey.getBytes());
  177. if (Objects.nonNull(value) && value.length > 0) {
  178. long oldTime = Long.parseLong(new String(value));
  179. if (oldTime < nowTime) {
  180. //connection.getSet:返回这个key的旧值并设置新值。
  181. byte[] oldValue = connection.getSet(lockKey.getBytes(), String.valueOf(nowTime + lockExpireMils + 1).getBytes());
  182. //当key不存时会返回空,示意key不存在或者已在管道中使用
  183. return oldValue == null ? false : Long.parseLong(new String(oldValue)) < nowTime;
  184. }
  185. }
  186. }
  187. return Boolean.FALSE;
  188. });
  189. }
  190. }