From e8bcc8c0a6a8a5f4cec2d5c3e34313aeca367326 Mon Sep 17 00:00:00 2001 From: zxc <954985706@qq.com> Date: Wed, 8 Jul 2020 15:12:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/constant/NumConstant.java | 1 + .../epmet/dto/ComponentVerifyTicketDTO.java | 81 ++++++++++++++++ .../form/ComponentVerifyTicketFormDTO.java | 30 ++++-- .../result/AuthorizationInfoResultDTO.java | 44 +++++++++ .../com/epmet/constant/ModuleConstant.java | 15 +++ .../epmet/constant/ThirdPlatformConstant.java | 7 +- .../ComponentVerifyTicketController.java | 63 ++----------- .../controller/WeChatNotifyController.java | 78 ++++++++++++++++ .../epmet/dao/ComponentVerifyTicketDao.java | 36 ++++++++ .../entity/ComponentVerifyTicketEntity.java | 56 +++++++++++ .../main/java/com/epmet/redis/RedisThird.java | 35 +++++-- .../service/ComponentVerifyTicketService.java | 13 ++- .../ComponentVerifyTicketServiceImpl.java | 92 +++++++++++++++---- .../mapper/ComponentVerifyTicketDao.xml | 35 +++++++ 14 files changed, 490 insertions(+), 96 deletions(-) create mode 100644 epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/ComponentVerifyTicketDTO.java create mode 100644 epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/AuthorizationInfoResultDTO.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/WeChatNotifyController.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ComponentVerifyTicketDao.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/entity/ComponentVerifyTicketEntity.java create mode 100644 epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ComponentVerifyTicketDao.xml diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java index 00c957c680..8529ad013b 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/constant/NumConstant.java @@ -31,6 +31,7 @@ public interface NumConstant { int THIRTY = 30; int FORTY = 40; int FIFTY = 50; + int SIXTY = 60; int ONE_HUNDRED = 100; int ONE_THOUSAND = 1000; int MAX = 99999999; diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/ComponentVerifyTicketDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/ComponentVerifyTicketDTO.java new file mode 100644 index 0000000000..39f78fd2fc --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/ComponentVerifyTicketDTO.java @@ -0,0 +1,81 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dto; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + + +/** + * 微信发送的ticket表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2020-07-08 + */ +@Data +public class ComponentVerifyTicketDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private String id; + + /** + * 第三方平台ID + */ + private String appid; + + /** + * component_verify_ticket + */ + private String typeInfo; + + /** + * 票据内容 + */ + private String componentVerifyTicket; + + /** + * 删除标识 0-否,1-是 + */ + private String delFlag; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedTime; + +} \ No newline at end of file diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/ComponentVerifyTicketFormDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/ComponentVerifyTicketFormDTO.java index 6093755bea..308b69b4fd 100644 --- a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/ComponentVerifyTicketFormDTO.java +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/form/ComponentVerifyTicketFormDTO.java @@ -3,6 +3,7 @@ package com.epmet.dto.form; import lombok.Data; import java.io.Serializable; +import java.util.Date; /** * @Author zxc @@ -14,22 +15,37 @@ public class ComponentVerifyTicketFormDTO implements Serializable { private static final long serialVersionUID = -6547893374373422628L; /** - * 第三方平台 appid + * 主键 */ - private String appId; + private String id; /** - * 时间戳,单位:s + * 第三方平台ID */ - private Integer CreateTime; + private String appid; /** - * 固定为:"component_verify_ticket" + * component_verify_ticket */ - private String InfoType = "component_verify_ticket"; + private String typeInfo = "component_verify_ticket"; /** - * Ticket 内容 + * 票据内容 */ private String componentVerifyTicket; + + /** + * 删除标识 0-否,1-是 + */ + private String delFlag = "0"; + + /** + * 创建人 + */ + private String createdBy = "APP_USER"; + + /** + * 更新人 + */ + private String updatedBy = "APP_USER"; } diff --git a/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/AuthorizationInfoResultDTO.java b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/AuthorizationInfoResultDTO.java new file mode 100644 index 0000000000..ce31106941 --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/result/AuthorizationInfoResultDTO.java @@ -0,0 +1,44 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * 权限集列表 + * @Author zxc + * @CreateTime 2020/7/8 13:39 + */ +@Data +public class AuthorizationInfoResultDTO implements Serializable { + + private static final long serialVersionUID = 3253989119352850315L; + + /** + * 授权方 appid + */ + private String authorizer_appid; + + /** + * 接口调用令牌(在授权的公众号/小程序具备 API 权限时,才有此返回值) + */ + private String authorizer_access_token; + + /** + * authorizer_access_token 的有效期(在授权的公众号/小程序具备API权限时,才有此返回值),单位:秒 + */ + private Integer expires_in; + + /** + * 刷新令牌(在授权的公众号具备API权限时,才有此返回值),刷新令牌主要用于第三方平台获取和刷新已授权用户的 authorizer_access_token。 + * 一旦丢失,只能让用户重新授权,才能再次拿到新的刷新令牌。用户重新授权后,之前的刷新令牌会失效 + */ + private String authorizer_refresh_token; + + /** + * 授权给开发者的权限集列表 + */ + private List func_info; +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/constant/ModuleConstant.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/constant/ModuleConstant.java index 4c744b6c5b..6b8df00640 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/constant/ModuleConstant.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/constant/ModuleConstant.java @@ -12,12 +12,23 @@ public interface ModuleConstant { String SUCCESS = "success"; + /** + * 第三方平台 AppId + */ String COMPONENT_APPID = "component_appid"; String COMPONENT_APPSECRET = "component_appsecret"; + /** + * 第三方平台 access_token + */ String COMPONENT_ACCESS_TOKEN = "component_access_token"; + /** + * 有效期 + */ + String EXPIRES_IN = "expires_in"; + String PRE_AUTH_CODE = "pre_auth_code"; String AUTHORIZATION_CODE = "authorization_code"; @@ -54,6 +65,10 @@ public interface ModuleConstant { String AUTHORIZER_REFRESH_TOKEN_REDIS_KEY = "epmet:wechartthird:authorizerrefreshtoken"; + String AUTHORIZATION_CODE_REDIS_KEY = "epmet:wechartthird:authorizationcode"; + + String AUTH_INFO_REDIS_KEY = "epmet:wechartthird:authinfo"; + } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/constant/ThirdPlatformConstant.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/constant/ThirdPlatformConstant.java index 9976e22d35..618d62010f 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/constant/ThirdPlatformConstant.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/constant/ThirdPlatformConstant.java @@ -29,7 +29,7 @@ public interface ThirdPlatformConstant { /** * */ - String API_COMPONENT_TOKEN_URl = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=COMPONENT_ACCESS_TOKEN"; + String API_CREATE_PREAUTHCODE_URl = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=COMPONENT_ACCESS_TOKEN"; /** * @@ -41,6 +41,9 @@ public interface ThirdPlatformConstant { */ String API_QUERY_AUTH_URL = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=COMPONENT_ACCESS_TOKEN"; - + /** + * 获取令牌请求地址 + */ + String API_COMPONENT_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/component/api_component_token"; } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/ComponentVerifyTicketController.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/ComponentVerifyTicketController.java index 10b6b587c7..5736be20c0 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/ComponentVerifyTicketController.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/ComponentVerifyTicketController.java @@ -1,19 +1,18 @@ package com.epmet.controller; -import com.epmet.commons.tools.utils.Result; import com.epmet.service.ComponentVerifyTicketService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletResponse; /** * @Author zxc * @CreateTime 2020/7/6 9:07 */ @Slf4j -@RestController("wechatthird") +@RestController +@RequestMapping("thirdplatform") public class ComponentVerifyTicketController { @Autowired @@ -27,62 +26,12 @@ public class ComponentVerifyTicketController { * @param postData * @author zxc */ - @PostMapping(value = "/ticket") - public Result weChatPlatformEvent(@RequestParam("timestamp") String timestamp, + @PostMapping(value = "/componentverifyticket") + public String componentVerifyTicket(@RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce, @RequestParam("msg_signature") String msgSignature, @RequestBody String postData) { - componentVerifyTicketService.parseRequest(timestamp,nonce,msgSignature,postData); - return new Result(); + componentVerifyTicketService.componentVerifyTicket(timestamp,nonce,msgSignature,postData); + return "success"; } - - /** - * @Description 获取预授权码 - * @param - * @author zxc - */ - @PostMapping("ticketjob") - public Result ticketJob() { - componentVerifyTicketService.ticketJob(); - return new Result(); - } - - /** - * @Description 获取预授权码 - * @param - * @author zxc - */ - @PostMapping("preauthcode") - public Result preAuthCode(){ - componentVerifyTicketService.preAuthCode(); - return new Result(); - } - - /** - * @Description - * @param response - * @param authCode - * @param expiresIn - * @author zxc - */ - @PostMapping(value = "/authcode") - public Result weChatPlatformAuthCode(HttpServletResponse response, - @RequestParam("auth_code") String authCode, - @RequestParam("expires_in") String expiresIn) { - componentVerifyTicketService.weChatPlatformAuthCode(response,authCode,expiresIn); - return new Result(); - } - - /** - * @Description 获取/刷新接口调用令牌 - * @param authorizerAppId 授权方AppId - * @author zxc - */ - @PostMapping("refreshtoken") - public Result refreshToken(@RequestParam("authorizer_appid") String authorizerAppId){ - componentVerifyTicketService.refreshToken(authorizerAppId); - return new Result(); - } - - } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/WeChatNotifyController.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/WeChatNotifyController.java new file mode 100644 index 0000000000..721794c247 --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/WeChatNotifyController.java @@ -0,0 +1,78 @@ +package com.epmet.controller; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.service.ComponentVerifyTicketService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; + +/** + * @Author zxc + * @CreateTime 2020/7/8 15:06 + */ +@RestController +@RequestMapping("wechatthird") +public class WeChatNotifyController { + + @Autowired + private ComponentVerifyTicketService componentVerifyTicketService; + + /** + * @Description 定时获取 (令牌,component_access_token) + * 令牌(component_access_token)是第三方平台接口的调用凭据。令牌的获取是有限制的,每个令牌的有效期为 2 小时 + * @param + * @author zxc + */ + @PostMapping("componentaccesstoken") + public Result getComponentAccessToken() { + componentVerifyTicketService.getComponentAccessToken(); + return new Result(); + } + + /** + * @Description 获取预授权码 + * @param + * @author zxc + */ + @PostMapping("preauthcode") + public Result preAuthCode(){ + componentVerifyTicketService.preAuthCode(); + return new Result(); + } + + /** + * @Description 使用授权码获取授权信息 + * @param response + * @param authCode + * @param expiresIn + * @author zxc + */ + @PostMapping(value = "/authinfobyauthcode") + public Result authInfoByAuthCode(HttpServletResponse response, + @RequestParam("auth_code") String authCode, + @RequestParam("expires_in") String expiresIn) { + componentVerifyTicketService.authInfoByAuthCode(response,authCode,expiresIn); + return new Result(); + } + + /** + * @Description 获取/刷新接口调用令牌 + * @param authorizerAppId 授权方AppId + * @author zxc + */ + @PostMapping("refreshtoken") + public Result refreshToken(@RequestParam("authorizer_appid") String authorizerAppId){ + componentVerifyTicketService.refreshToken(authorizerAppId); + return new Result(); + } + + @PostMapping("redirecturi") + public Result redirectUri(){ + componentVerifyTicketService.redirectUri(); + return new Result(); + } +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ComponentVerifyTicketDao.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ComponentVerifyTicketDao.java new file mode 100644 index 0000000000..2ebdb26ed3 --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/dao/ComponentVerifyTicketDao.java @@ -0,0 +1,36 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.dto.form.ComponentVerifyTicketFormDTO; +import com.epmet.entity.ComponentVerifyTicketEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 微信发送的ticket表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2020-07-08 + */ +@Mapper +public interface ComponentVerifyTicketDao extends BaseDao { + + void insertComponentVerifyTicket(ComponentVerifyTicketFormDTO formDTO); + +} \ No newline at end of file diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/entity/ComponentVerifyTicketEntity.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/entity/ComponentVerifyTicketEntity.java new file mode 100644 index 0000000000..dd39c42496 --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/entity/ComponentVerifyTicketEntity.java @@ -0,0 +1,56 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 微信发送的ticket表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2020-07-08 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("component_verify_ticket") +public class ComponentVerifyTicketEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 第三方平台ID + */ + private String appid; + + /** + * component_verify_ticket + */ + private String typeInfo; + + /** + * 票据内容 + */ + private String componentVerifyTicket; + +} diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/redis/RedisThird.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/redis/RedisThird.java index 576e6a1794..3deac90425 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/redis/RedisThird.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/redis/RedisThird.java @@ -1,6 +1,8 @@ package com.epmet.redis; +import com.epmet.commons.tools.redis.RedisUtils; import com.epmet.constant.ModuleConstant; +import com.epmet.dto.result.AuthorizationInfoResultDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -18,14 +20,16 @@ public class RedisThird { @Autowired private RedisTemplate redisTemplate; + @Autowired + private RedisUtils redisUtils; /** - * @Description 缓存 component_access_token 有效期:2H + * @Description 缓存 component_access_token 有效期:1小时59分钟 (官网有效期:2H) * @param accessToken * @author zxc */ public void setComponentAccessToken (String accessToken){ - redisTemplate.opsForValue().set(ModuleConstant.ACCESS_TOKEN_REDIS_KEY+ModuleConstant.COMPONENT_ACCESS_TOKEN, accessToken, 60 * 60 * 2, TimeUnit.SECONDS); + redisTemplate.opsForValue().set(ModuleConstant.ACCESS_TOKEN_REDIS_KEY+ModuleConstant.COMPONENT_ACCESS_TOKEN, accessToken, 60 * 60 * 2 - 60, TimeUnit.SECONDS); } /** @@ -47,21 +51,22 @@ public class RedisThird { } /** - * @Description 缓存 component_verify_ticket 有效期:10min + * @Description 缓存 component_verify_ticket 有效期:9min (官方有效期 10分钟) * @param verifyTicket * @author zxc */ public void setComponentVerifyTicket(String verifyTicket){ - redisTemplate.opsForValue().set(ModuleConstant.TICKET_REDIS_KEY+ModuleConstant.TICKET_UNDERLINE_KEY, verifyTicket, 60 * 10, TimeUnit.SECONDS); + redisTemplate.opsForValue().set(ModuleConstant.TICKET_REDIS_KEY+ModuleConstant.TICKET_UNDERLINE_KEY, verifyTicket, 60 * 9, TimeUnit.SECONDS); } /** - * @Description 缓存 pre_auth_code 有效期:10min - * @param authCode + * @Description 缓存 pre_auth_code 有效期:9min (官方有效期 10分钟) + * @param authCode pre_auth_code 预授权码 + * @param expiresIn expires_in 有效期 * @author zxc */ - public void setPreAuthCode(String authCode){ - redisTemplate.opsForValue().set(ModuleConstant.PRE_AUTH_CODE_REDIS_KEY+ModuleConstant.PRE_AUTH_CODE, authCode, 60 * 10, TimeUnit.SECONDS); + public void setPreAuthCode(String authCode,Integer expiresIn){ + redisTemplate.opsForValue().set(ModuleConstant.PRE_AUTH_CODE_REDIS_KEY+ModuleConstant.PRE_AUTH_CODE, authCode,expiresIn, TimeUnit.SECONDS); } /** @@ -84,4 +89,18 @@ public class RedisThird { return redisTemplate.opsForValue().get(ModuleConstant.AUTHORIZER_REFRESH_TOKEN_REDIS_KEY+key).toString(); } + /** + * @Description 获取授权码 + * 授权码, 会在授权成功时(回调url)返回给第三方平台【code、expiresIn】 + * @param key + * @author zxc + */ + public String getAuthorizationCode(String key){ + return redisTemplate.opsForValue().get(ModuleConstant.AUTHORIZATION_CODE_REDIS_KEY+key).toString(); + } + + public void setAuthInfo(AuthorizationInfoResultDTO authInfo){ + redisUtils.set(ModuleConstant.AUTH_INFO_REDIS_KEY,authInfo,-1); + } + } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ComponentVerifyTicketService.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ComponentVerifyTicketService.java index cd7e167667..0a46086c1f 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ComponentVerifyTicketService.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/ComponentVerifyTicketService.java @@ -18,13 +18,14 @@ public interface ComponentVerifyTicketService { * @return 如果获得只需要返回 SUCCESS * @Author zxc */ - void parseRequest(String timestamp,String nonce,String msgSignature,String postData); + void componentVerifyTicket(String timestamp,String nonce,String msgSignature,String postData); /** - * @Description 定时获取 ticket + * @Description 定时获取 (令牌,component_access_token) + * 令牌(component_access_token)是第三方平台接口的调用凭据。令牌的获取是有限制的,每个令牌的有效期为 2 小时 * @author zxc */ - void ticketJob(); + void getComponentAccessToken(); /** * @Description 每个预授权码有效期为 10 分钟。需要先获取令牌才能调用 获取预授权码 @@ -33,13 +34,13 @@ public interface ComponentVerifyTicketService { void preAuthCode(); /** - * @Description + * @Description 使用授权码获取授权信息 * @param response * @param authCode * @param expiresIn * @author zxc */ - void weChatPlatformAuthCode(HttpServletResponse response,String authCode,String expiresIn); + void authInfoByAuthCode(HttpServletResponse response,String authCode,String expiresIn); /** * @Description 获取/刷新接口调用令牌 @@ -48,4 +49,6 @@ public interface ComponentVerifyTicketService { */ void refreshToken(String authorizerAppId); + void redirectUri(); + } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ComponentVerifyTicketServiceImpl.java b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ComponentVerifyTicketServiceImpl.java index c226125580..5ec14b22bd 100644 --- a/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ComponentVerifyTicketServiceImpl.java +++ b/epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/service/impl/ComponentVerifyTicketServiceImpl.java @@ -2,12 +2,16 @@ package com.epmet.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.utils.HttpClientManager; import com.epmet.constant.ModuleConstant; import com.epmet.constant.ThirdPlatformConstant; +import com.epmet.dao.ComponentVerifyTicketDao; +import com.epmet.dto.form.ComponentVerifyTicketFormDTO; +import com.epmet.dto.result.AuthorizationInfoResultDTO; import com.epmet.exception.AesException; import com.epmet.redis.RedisThird; import com.epmet.service.ComponentVerifyTicketService; -import com.epmet.util.OkHttpHelper; import com.epmet.util.WXBizMsgCrypt; import com.epmet.util.WXXmlToMapUtil; import lombok.extern.slf4j.Slf4j; @@ -15,9 +19,10 @@ import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; +import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; @@ -34,15 +39,16 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe @Autowired private RedisThird redisThird; @Autowired - private OkHttpHelper okHttpHelper; + private ComponentVerifyTicketDao ticketDao; /** * @Description 获得授权事件的票据 * @param * @author zxc */ + @Transactional(rollbackFor = Exception.class) @Override - public void parseRequest(String timeStamp,String nonce,String msgSignature,String postData) { + public void componentVerifyTicket(String timeStamp,String nonce,String msgSignature,String postData) { log.info(ModuleConstant.START_RECEIVE); try { //这个类是微信官网提供的解密类,需要用到消息校验Token 消息加密Key和服务平台appid @@ -52,9 +58,15 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe Map result = WXXmlToMapUtil.xmlToMap(xml); String componentVerifyTicket = MapUtils.getString(result, ModuleConstant.TICKET_KEY); if (StringUtils.isNotEmpty(componentVerifyTicket)) { - // 存储平台授权票据,保存ticket + // 缓存 ticket redisThird.setComponentVerifyTicket(componentVerifyTicket); + // 存数据库 + ComponentVerifyTicketFormDTO ticketFormDTO = new ComponentVerifyTicketFormDTO(); + ticketFormDTO.setAppid(PLATFORM_APP_ID); + ticketFormDTO.setComponentVerifyTicket(componentVerifyTicket); + ticketDao.insertComponentVerifyTicket(ticketFormDTO); } else { + log.error(ModuleConstant.ERROR_TICKET); throw new RuntimeException(ModuleConstant.ERROR_TICKET); } } catch (AesException e) { @@ -64,22 +76,22 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe } /** - * @Description 定时获取票据 + * @Description 定时获取 (令牌,component_access_token) * @param * @author zxc */ @Override - public void ticketJob() { + public void getComponentAccessToken() { log.info("====================开始执行定时任务获取令牌【component_access_token】===================="); Map reMap; try { - // 核心定时器,每一个小时执行一次 + // 核心定时器 String componentVerifyTicket = redisThird.getComponentVerifyTicket(ModuleConstant.TICKET_UNDERLINE_KEY); JSONObject jsonObject = new JSONObject(); jsonObject.put(ModuleConstant.COMPONENT_APPID, PLATFORM_APP_ID); jsonObject.put(ModuleConstant.COMPONENT_APPSECRET, PLATFORM_APP_SECRET); jsonObject.put(ModuleConstant.TICKET_UNDERLINE_KEY, componentVerifyTicket); - String post = okHttpHelper.post(API_COMPONENT_TOKEN_URl, JSON.toJSONString(jsonObject)); + String post = HttpClientManager.getInstance().sendPostByJSON(API_CREATE_PREAUTHCODE_URL, JSON.toJSONString(jsonObject)).getData(); HashMap hashMap = JSON.parseObject(post, HashMap.class); String componentAccessToken = hashMap.get(ModuleConstant.COMPONENT_ACCESS_TOKEN); if (StringUtils.isNotEmpty(componentAccessToken)) { @@ -105,12 +117,14 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe String accessToken = redisThird.getComponentAccessToken(ModuleConstant.COMPONENT_ACCESS_TOKEN); JSONObject jsonObject = new JSONObject(); jsonObject.put(ModuleConstant.COMPONENT_APPID, PLATFORM_APP_ID); - String post = okHttpHelper.post(API_CREATE_PREAUTHCODE_URL + accessToken, JSON.toJSONString(jsonObject)); + String post = HttpClientManager.getInstance().sendPostByJSON(API_CREATE_PREAUTHCODE_URL + accessToken, JSON.toJSONString(jsonObject)).getData(); log.info("====================返回post结果:" + post); HashMap hashMap = JSON.parseObject(post, HashMap.class); - String authCode = hashMap.get("pre_auth_code"); + String authCode = hashMap.get(ModuleConstant.PRE_AUTH_CODE); + String expiresIn = hashMap.get(ModuleConstant.EXPIRES_IN); + int ex = Integer.valueOf(expiresIn) - NumConstant.SIXTY; if (StringUtils.isNotEmpty(authCode)) { - redisThird.setPreAuthCode(authCode); + redisThird.setPreAuthCode(authCode,ex); } else { throw new RuntimeException("微信开放平台,第三方平台获取【预授权码】失败"); } @@ -120,22 +134,31 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe log.info("====================结束执行定时任务获取预授权码【pre_auth_code】===================="); } + /** + * @Description 使用授权码获取授权信息 + * @param response + * @param authCode + * @param expiresIn + * @author zxc + */ @Override - public void weChatPlatformAuthCode(HttpServletResponse response, String authCode, String expiresIn) { + public void authInfoByAuthCode(HttpServletResponse response, String authCode, String expiresIn) { // 获取令牌【component_access_token】 String accessToken = redisThird.getComponentAccessToken(ModuleConstant.COMPONENT_ACCESS_TOKEN); // 使用授权码获取授权信息 JSONObject jsonObject = new JSONObject(); jsonObject.put(ModuleConstant.COMPONENT_APPID, PLATFORM_APP_ID); jsonObject.put(ModuleConstant.AUTHORIZATION_CODE, authCode); - String post; + String authInfo; try { - post = okHttpHelper.post(API_QUERY_AUTH_URL + accessToken, JSON.toJSONString(jsonObject)); - HashMap hashMap = JSON.parseObject(post, HashMap.class); + authInfo = HttpClientManager.getInstance().sendPostByJSON(API_QUERY_AUTH_URL + accessToken, JSON.toJSONString(jsonObject)).getData(); + HashMap hashMap = JSON.parseObject(authInfo, HashMap.class); Map map = hashMap.get(ModuleConstant.AUTHORIZATION_INFO); + AuthorizationInfoResultDTO authorizationInfoResultDTO = mapToEntity(map, AuthorizationInfoResultDTO.class); + redisThird.setAuthInfo(authorizationInfoResultDTO); String authorizerRefreshToken = map.get(ModuleConstant.AUTHORIZER_REFRESH_TOKEN).toString(); redisThird.setAuthorizerRefreshToken(authorizerRefreshToken); - } catch (IOException e) { + } catch (Exception e) { e.printStackTrace(); } @@ -158,4 +181,39 @@ public class ComponentVerifyTicketServiceImpl implements ComponentVerifyTicketSe jsonObject.put(ModuleConstant.COMPONENT_APPID,PLATFORM_APP_ID); jsonObject.put("",redisThird.getAuthorizerRefreshToken("")); } + + @Override + public void redirectUri() { + + } + + /** + * @Description map 转 Entity + * @param map + * @param entity + * @author zxc + */ + public T mapToEntity(Map map, Class entity) { + T t = null; + try { + t = entity.newInstance(); + for(Field field : entity.getDeclaredFields()) { + if (map.containsKey(field.getName())) { + boolean flag = field.isAccessible(); + field.setAccessible(true); + Object object = map.get(field.getName()); + if (object!= null && field.getType().isAssignableFrom(object.getClass())) { + field.set(t, object); + } + field.setAccessible(flag); + } + } + return t; + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return t; + } } diff --git a/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ComponentVerifyTicketDao.xml b/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ComponentVerifyTicketDao.xml new file mode 100644 index 0000000000..a6a0e15ffb --- /dev/null +++ b/epmet-module/epmet-third/epmet-third-server/src/main/resources/mapper/ComponentVerifyTicketDao.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + INSERT INTO component_verify_ticket ( ID, APPID, TYPE_INFO, COMPONENT_VERIFY_TICKET, DEL_FLAG, CREATED_BY, CREATED_TIME, UPDATED_BY, UPDATED_TIME ) + VALUES + ( + REPLACE ( UUID(), '-', '' ), + #{appid}, + #{typeInfo}, + #{componentVerifyTicket}, + #{delFlag}, + #{createdBy}, + NOW(), + #{updatedBy}, + NOW() + ) + + + + \ No newline at end of file