ZijinRequestApiComponents.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. package com.ydtech.modules.order.components;
  2. import com.ydtech.config.properties.ZjApiConfigurationProperties;
  3. import com.ydtech.exception.SystemException;
  4. import com.ydtech.modules.order.constants.OrderCacheConstant;
  5. import com.ydtech.modules.order.entity.api.zj.constants.enums.RequestUrl;
  6. import com.ydtech.modules.order.entity.api.zj.constants.enums.ResultEnum;
  7. import com.ydtech.modules.order.entity.api.zj.request.*;
  8. import com.ydtech.modules.order.entity.api.zj.response.*;
  9. import com.ydtech.modules.order.entity.config.ZjConfigureParameters;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.redisson.api.RLock;
  12. import org.redisson.api.RedissonClient;
  13. import org.springframework.data.redis.core.StringRedisTemplate;
  14. import org.springframework.http.HttpHeaders;
  15. import org.springframework.stereotype.Component;
  16. import org.springframework.util.ObjectUtils;
  17. import java.util.HashMap;
  18. import java.util.Map;
  19. import java.util.concurrent.TimeUnit;
  20. /**
  21. * @description: 资金财险请求
  22. * @author: wenks
  23. * @date: 2023/8/9 16:57
  24. **/
  25. @Slf4j
  26. @Component
  27. public class ZijinRequestApiComponents {
  28. private static final String AUTHORIZATION = "Authorization";
  29. private static final String ZKI_API_AUTHORIZATION = "ZKIApiAuthorization";
  30. // 递归层级
  31. public static final int RECURSIVE_HIERARCHY = 3;
  32. private final InsCrawlerOrderComponents insCrawlerOrderComponents;
  33. private final ZjApiConfigurationProperties zjApiConfigurationProperties;
  34. private final ConfigureParametersComponents configureParametersComponents;
  35. private final StringRedisTemplate redisTemplate;
  36. private final RedissonClient redissonClient;
  37. private static final String USER_ID = "28317480921155536850";
  38. public ZijinRequestApiComponents(InsCrawlerOrderComponents insCrawlerOrderComponents, ZjApiConfigurationProperties zjApiConfigurationProperties, ConfigureParametersComponents configureParametersComponents, StringRedisTemplate redisTemplate, RedissonClient redissonClient) {
  39. this.insCrawlerOrderComponents = insCrawlerOrderComponents;
  40. this.zjApiConfigurationProperties = zjApiConfigurationProperties;
  41. this.configureParametersComponents = configureParametersComponents;
  42. this.redisTemplate = redisTemplate;
  43. this.redissonClient = redissonClient;
  44. }
  45. public <T, B extends BaseResponse> B request(String url, String desc, T requestBody, Class<B> responseType, HttpHeaders httpHeaders) {
  46. B b = insCrawlerOrderComponents.request(url, "紫金财险", desc, requestBody, responseType, httpHeaders);
  47. ResultEnum.verify(b.getRtnCode(), b.getRtnMsg());
  48. return b;
  49. }
  50. public <T, B extends BaseResponse> B request(RequestUrl requestUrl, T requestBody, Class<B> responseType, HttpHeaders httpHeaders) {
  51. String url = zjApiConfigurationProperties.getUrl() + requestUrl.getUri();
  52. return request(url, requestUrl.getDesc(), requestBody, responseType, httpHeaders);
  53. }
  54. /**
  55. * 获取 接入方 token 车险业务token
  56. *
  57. * @param zjConfigureParameters 紫金api配置
  58. * @param httpHeaders 请求头
  59. * @return HttpHeaders
  60. */
  61. private HttpHeaders getToken(ZjConfigureParameters zjConfigureParameters, HttpHeaders httpHeaders) {
  62. // 1 为接入方提供获取token服务
  63. GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest(zjConfigureParameters.getAppKey(), zjConfigureParameters.getAppSecret());
  64. GetAccessTokenResponse accessToken = getAccessToken(getAccessTokenRequest);
  65. httpHeaders.set(AUTHORIZATION, accessToken.getToken());
  66. // 2 车险业务获取token服务
  67. QueryTokenRequest queryTokenRequest = new QueryTokenRequest(zjConfigureParameters.getAppKey(), USER_ID);
  68. QueryTokenResponse queryTokenResponse = queryToken(queryTokenRequest, httpHeaders);
  69. httpHeaders.set(ZKI_API_AUTHORIZATION, queryTokenResponse.getToken());
  70. // 3. 将请求的token放入redis
  71. Map<String, String> map = new HashMap<>();
  72. map.put(AUTHORIZATION, accessToken.getToken());
  73. map.put(ZKI_API_AUTHORIZATION, queryTokenResponse.getToken());
  74. redisTemplate.opsForHash().putAll(zjConfigureParameters.getAccessToken(), map);
  75. redisTemplate.expire(zjConfigureParameters.getAccessToken(), OrderCacheConstant.ZJ_ACCESS_TOKEN_TIME, TimeUnit.HOURS);
  76. return httpHeaders;
  77. }
  78. /**
  79. * 配置方式获取请求头
  80. *
  81. * @param zjConfigureParameters 配置参数
  82. * @return HttpHeaders
  83. */
  84. public HttpHeaders getHttpHeaders(ZjConfigureParameters zjConfigureParameters, int number) {
  85. if (number <= 0) {
  86. throw new SystemException("接口请求异常,请重试!");
  87. }
  88. number--;
  89. HttpHeaders httpHeaders = new HttpHeaders();
  90. Map<Object, Object> entries = redisTemplate.opsForHash().entries(zjConfigureParameters.getAccessToken());
  91. // 缓存中不存在就去请求token
  92. if (!ObjectUtils.isEmpty(entries)) {
  93. String authorization = (String) entries.get(AUTHORIZATION);
  94. String zKIApiAuthorization = (String) entries.get(ZKI_API_AUTHORIZATION);
  95. httpHeaders.set(AUTHORIZATION, authorization);
  96. httpHeaders.set(ZKI_API_AUTHORIZATION, zKIApiAuthorization);
  97. return httpHeaders;
  98. }
  99. // 使用分布式锁 只有一个人可以访问登录
  100. RLock lock = redissonClient.getLock(zjConfigureParameters.getAccessLock());
  101. try {
  102. boolean isLock = lock.tryLock(1, 10000, TimeUnit.MILLISECONDS);
  103. if (isLock) {
  104. try {
  105. return this.getToken(zjConfigureParameters, httpHeaders);
  106. } finally {
  107. lock.unlock();
  108. }
  109. }
  110. } catch (InterruptedException e) {
  111. log.debug(e.getMessage());
  112. lock.unlock();
  113. Thread.currentThread().interrupt();
  114. throw new SystemException(e.getMessage());
  115. }
  116. // 睡眠一段时间 自调用 重新获取缓存中的 header
  117. try {
  118. Thread.sleep(280);
  119. } catch (InterruptedException e) {
  120. log.debug(e.getMessage());
  121. Thread.currentThread().interrupt();
  122. throw new SystemException("接口请求异常,请重试!");
  123. }
  124. return getHttpHeaders(zjConfigureParameters, number);
  125. }
  126. /**
  127. * 协议id获取请求头
  128. *
  129. * @param agreementId 协议id
  130. * @return HttpHeaders
  131. */
  132. public HttpHeaders getHttpHeaders(String agreementId) {
  133. ZjConfigureParameters zjConfigureParameters = configureParametersComponents.toEntity(ZjConfigureParameters.class, agreementId);
  134. return getHttpHeaders(zjConfigureParameters, RECURSIVE_HIERARCHY);
  135. }
  136. /**
  137. * 为接入方提供获取token服务
  138. *
  139. * @param getAccessTokenRequest 紫金财险 为接入方提供获取token服务 入参实体
  140. * @return 出参实体
  141. */
  142. public GetAccessTokenResponse getAccessToken(GetAccessTokenRequest getAccessTokenRequest) {
  143. String url = zjApiConfigurationProperties.getAccessTokenUrl();
  144. GetAccessTokenResponse response = insCrawlerOrderComponents.request(url, "紫金财险", "为接入方提供获取token服务", getAccessTokenRequest, GetAccessTokenResponse.class);
  145. ResultEnum.verify(response.getRtnCode(), response.getRtnMsg());
  146. return response;
  147. }
  148. /**
  149. * 车险业务获取token服务
  150. *
  151. * @param queryTokenRequest 紫金财险 车险业务获取token服务 入参实体
  152. * @return 出参实体
  153. */
  154. public QueryTokenResponse queryToken(QueryTokenRequest queryTokenRequest, HttpHeaders httpHeaders) {
  155. return request(RequestUrl.QUERY_TOKEN, queryTokenRequest, QueryTokenResponse.class, httpHeaders);
  156. }
  157. /**
  158. * 车型查询
  159. *
  160. * @param modelQueryRequest 紫金财险 车型查询 入参实体
  161. * @return 出参实体
  162. */
  163. public ModelQueryResponse modelQuery(ModelQueryRequest modelQueryRequest, HttpHeaders httpHeaders) {
  164. return request(RequestUrl.MODELS_QUERY, modelQueryRequest, ModelQueryResponse.class, httpHeaders);
  165. }
  166. /**
  167. * 获取车辆实际价值
  168. *
  169. * @param queryActualValueRequest 紫金财险 获取车辆实际价值 入参实体
  170. * @return 出参实体
  171. */
  172. public QueryActualValueResponse queryActualValue(QueryActualValueRequest queryActualValueRequest, HttpHeaders httpHeaders) {
  173. return request(RequestUrl.QUERY_ACTUAL_VALUE, queryActualValueRequest, QueryActualValueResponse.class, httpHeaders);
  174. }
  175. /**
  176. * 查询“车+意”中意外险方案信息
  177. *
  178. * @param queryVehicProductsRequest 紫金财险 查询“车+意”中意外险方案信息(非摩托车险)入参实体
  179. * @return 出参实体
  180. */
  181. public QueryVehicProductsResponse queryVehicleProducts(QueryVehicProductsRequest queryVehicProductsRequest, HttpHeaders httpHeaders) {
  182. return request(RequestUrl.QUERY_VEHIC_PRODUCTS, queryVehicProductsRequest, QueryVehicProductsResponse.class, httpHeaders);
  183. }
  184. /**
  185. * 保费计算
  186. *
  187. * @param calculatePremiumRequest 紫金财险 保费计算 入参实体
  188. * @return 出参实体
  189. */
  190. public CalculatePremiumResponse calculatePremium(CalculatePremiumRequest calculatePremiumRequest, HttpHeaders httpHeaders) {
  191. return request(RequestUrl.CALCULATE_PREMIUM, calculatePremiumRequest, CalculatePremiumResponse.class, httpHeaders);
  192. }
  193. /**
  194. * 文件上传
  195. *
  196. * @param uploadFileRequest 紫金财险 文件上传 入参实体
  197. * @return 出参实体
  198. */
  199. public UploadFileResponse uploadFile(UploadFileRequest uploadFileRequest, HttpHeaders httpHeaders) {
  200. return request(RequestUrl.UPLOAD_FILE, uploadFileRequest, UploadFileResponse.class, httpHeaders);
  201. }
  202. /**
  203. * 文件信息与订单关联
  204. *
  205. * @param uploadImageInfoListRequest 紫金财险 文件信息与订单关联 入参实体
  206. * @return 出参实体
  207. */
  208. public BaseResponse uploadImageInfoList(UploadImageInfoListRequest uploadImageInfoListRequest, HttpHeaders httpHeaders) {
  209. return request(RequestUrl.UPLOAD_IMAGE_INFO_LIST, uploadImageInfoListRequest, BaseResponse.class, httpHeaders);
  210. }
  211. /**
  212. * 特约查询
  213. *
  214. * @param queryClauseDataRequest 紫金财险 特约查询 入参实体
  215. * @return 出参实体
  216. */
  217. public QueryClauseDataResponse queryClauseData(QueryClauseDataRequest queryClauseDataRequest, HttpHeaders httpHeaders) {
  218. return request(RequestUrl.QUERY_CLAUSE_DATA, queryClauseDataRequest, QueryClauseDataResponse.class, httpHeaders);
  219. }
  220. /**
  221. * 提交核保
  222. *
  223. * @param submitVerifyRequest 紫金财险 提交核保 入参实体
  224. * @return 出参实体
  225. */
  226. public SubmitVerifyResponse submitVerify(SubmitVerifyRequest submitVerifyRequest, HttpHeaders httpHeaders) {
  227. return request(RequestUrl.SUBMIT_VERIFY, submitVerifyRequest, SubmitVerifyResponse.class, httpHeaders);
  228. }
  229. /**
  230. * 聚合支付服务
  231. *
  232. * @param zbfAggregatePayRequest 紫金财险 聚合支付服务 入参实体
  233. * @return 出参实体
  234. */
  235. public ZbfAggregatePayResponse zbfAggregatePay(ZbfAggregatePayRequest zbfAggregatePayRequest, HttpHeaders httpHeaders) {
  236. return request(zjApiConfigurationProperties.getPayUrl(), RequestUrl.ZBF_AGGREGATE_PAY.getDesc(), zbfAggregatePayRequest, ZbfAggregatePayResponse.class, httpHeaders);
  237. }
  238. /**
  239. * 订单详情查询服务
  240. *
  241. * @param orderNoRequest 紫金财险 订单详情查询服务 入参实体
  242. * @return 出参实体
  243. */
  244. public QueryOrderDetailResponse getOrderDetail(OrderNoRequest orderNoRequest, HttpHeaders httpHeaders) {
  245. return request(zjApiConfigurationProperties.getOrderUrl(), RequestUrl.GET_ORDER_DETAIL.getDesc(), orderNoRequest, QueryOrderDetailResponse.class, httpHeaders);
  246. }
  247. /**
  248. * 未缴费保单撤单
  249. *
  250. * @param orderNoRequest 紫金财险 未缴费保单撤单 入参实体
  251. * @return 出参实体
  252. */
  253. public void cancel(OrderNoRequest orderNoRequest, HttpHeaders httpHeaders) {
  254. request(RequestUrl.CANCEL, orderNoRequest, BaseResponse.class, httpHeaders);
  255. }
  256. /**
  257. * 生成电子保单下载
  258. *
  259. * @param busNo 保单号
  260. * @param busType 证件号
  261. * @param identifyNo 单证类型 1-交强险,2-保险标志,3-商业险,4-非车险,5-批单
  262. * @return 电子保单连接
  263. */
  264. public String getDownLoadDocumentUrl(String busNo, String busType, String identifyNo) {
  265. String parameter = String.format("?busNo=%s&busType=%s&identifyNo=%s", busNo, busType, identifyNo);
  266. String downLoadDocument = zjApiConfigurationProperties.getDownLoadDocument();
  267. return downLoadDocument + parameter;
  268. }
  269. }