From 13b7a1f9a6f001d1eead5fc2f5ccf840e093cdfe Mon Sep 17 00:00:00 2001 From: Lemon Date: Sat, 29 Jul 2023 11:42:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E5=B9=B3=E5=8F=B0=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=8E=88=E6=9D=83=E7=A0=81=E8=8E=B7=E5=8F=96=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/uniapp/AgentDevController.java | 23 ++++++++- .../com/jsowell/service/AgentDevService.java | 42 +++++++++++++++++ .../common/constant/CacheConstants.java | 14 +++++- .../pile/dto/GetComponentTokenDTO.java | 6 +++ .../jsowell/pile/vo/agentDev/AuthInfo.java | 47 +++++++++++++++++++ .../pile/vo/agentDev/PermissionInfo.java | 19 ++++++++ 6 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 jsowell-pile/src/main/java/com/jsowell/pile/vo/agentDev/AuthInfo.java create mode 100644 jsowell-pile/src/main/java/com/jsowell/pile/vo/agentDev/PermissionInfo.java diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/AgentDevController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/AgentDevController.java index 9d0d22928..e745aa07a 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/AgentDevController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/AgentDevController.java @@ -6,6 +6,7 @@ import com.jsowell.common.core.controller.BaseController; import com.jsowell.common.response.RestApiResponse; import com.jsowell.pile.domain.AuthorizationEventResult; import com.jsowell.pile.dto.GetComponentTokenDTO; +import com.jsowell.pile.vo.agentDev.AuthInfo; import com.jsowell.service.AgentDevService; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +29,7 @@ public class AgentDevController extends BaseController { private AgentDevService agentDevService; /** - * 授权事件接收URL,验证票据、 + * 授权事件接收URL,验证票据、授权事件 * * @param timestamp * @param nonce @@ -82,4 +83,24 @@ public class AgentDevController extends BaseController { return response; } + + /** + * 使用授权码获取授权信息 + * @param authorizationCode + * @return + */ + @GetMapping("/getAuthInfo/{authorizationCode}") + public RestApiResponse getAuthInfo(@PathVariable("authorizationCode") String authorizationCode) { + logger.info("使用授权码获取授权信息 params:{}", authorizationCode); + RestApiResponse response = null; + try { + AuthInfo authInfo = agentDevService.getAuthInfoByAuthCode(authorizationCode); + response = new RestApiResponse<>(authInfo); + } catch (Exception e) { + logger.error("使用授权码获取授权信息 error,", e); + response = new RestApiResponse<>(e); + } + logger.info("使用授权码获取授权信息 result:{}", response); + return response; + } } diff --git a/jsowell-admin/src/main/java/com/jsowell/service/AgentDevService.java b/jsowell-admin/src/main/java/com/jsowell/service/AgentDevService.java index 11f359d16..5a504d9b8 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/AgentDevService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/AgentDevService.java @@ -9,6 +9,7 @@ import com.jsowell.common.util.wxplatform.AesException; import com.jsowell.common.util.wxplatform.WXBizMsgCrypt; import com.jsowell.common.util.wxplatform.WXXmlToMapUtil; import com.jsowell.pile.dto.GetComponentTokenDTO; +import com.jsowell.pile.vo.agentDev.AuthInfo; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.RandomStringUtils; import org.slf4j.Logger; @@ -124,6 +125,7 @@ public class AgentDevService { /** * 小程序/公众号授权事件 + * * @param map */ private void authorizedInform(Map map) { @@ -209,4 +211,44 @@ public class AgentDevService { return token; } + /** + * 使用授权码获取授权信息 + * 并将授权信息中的 接口调用令牌、刷新令牌存入缓存 + * + * @param authorizationCode + */ + public AuthInfo getAuthInfoByAuthCode(String authorizationCode) { + // 获取 component_access_token + GetComponentTokenDTO dto = GetComponentTokenDTO.builder() + .appId(PLATFORM_APP_ID) + .appSecret(PLATFORM_APP_SECRET) + .verifyTicket(null) + .build(); + String componentToken = getComponentToken(dto); + // 使用授权码获取授权信息 url + String url = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=" + componentToken; + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("component_appid", PLATFORM_APP_ID); + jsonObject.put("authorization_code", authorizationCode); + + String result = HttpUtils.sendPost(url, JSONObject.toJSONString(jsonObject)); + logger.info("获取第三方平台 使用授权码获取授权信息 请求参数:{}, 请求结果:{}", JSONObject.toJSONString(jsonObject), result); + AuthInfo authInfo = JSONObject.parseObject(result, AuthInfo.class); + if (authInfo == null) { + throw new RuntimeException("获取第三方平台 使用授权码获取授权信息 error"); + } + String authorizerAccessToken = authInfo.getAuthorizerAccessToken(); // 接口调用令牌, 默认有效期 7200 秒 + String authorizerRefreshToken = authInfo.getAuthorizerRefreshToken(); // 刷新令牌 永久保存 + String authorizerAppid = authInfo.getAuthorizerAppid(); // 授权方 appid + + String authAccessTokenKey = CacheConstants.AUTHORIZER_ACCESS_TOKEN + authorizerAppid; + redisCache.setCacheObject(authAccessTokenKey, authorizerAccessToken, authInfo.getExpiredTime(), TimeUnit.SECONDS); + + String authRefreshTokenKey = CacheConstants.AUTHORIZER_REFRESH_TOKEN + authorizerAppid; + redisCache.setCacheObject(authRefreshTokenKey, authorizerRefreshToken); + + return authInfo; + } + } diff --git a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java index be67c1ab6..69fb33112 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java +++ b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java @@ -113,18 +113,28 @@ public class CacheConstants { /** * 微信第三方平台 用户授权码 */ - public static final String COMPONENT_AUTHORIZATION_CODE = "component_authorization_code"; + public static final String COMPONENT_AUTHORIZATION_CODE = "component_authorization_code:"; /** * 微信第三方平台 用户预授权码 */ - public static final String COMPONENT_PRE_AUTHORIZATION_CODE = "component_pre_authorization_code"; + public static final String COMPONENT_PRE_AUTHORIZATION_CODE = "component_pre_authorization_code:"; /** * 微信第三方平台 token */ public static final String COMPONENT_ACCESS_TOKEN = "component_access_token:"; + /** + * 接口调用令牌 + */ + public static final String AUTHORIZER_ACCESS_TOKEN = "authorizer_access_token:"; + + /** + * 刷新令牌 + */ + public static final String AUTHORIZER_REFRESH_TOKEN = "authorizer_refresh_token:"; + /** * 充电桩sn生成 key */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/GetComponentTokenDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/GetComponentTokenDTO.java index 8c77ea217..63f918101 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/GetComponentTokenDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/GetComponentTokenDTO.java @@ -1,6 +1,9 @@ package com.jsowell.pile.dto; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * 获取第三方平台令牌 DTO @@ -9,6 +12,9 @@ import lombok.Data; * @Date 2023/7/28 14:05 */ @Data +@NoArgsConstructor +@AllArgsConstructor +@Builder public class GetComponentTokenDTO { /** * 第三方平台 appId diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/agentDev/AuthInfo.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/agentDev/AuthInfo.java new file mode 100644 index 000000000..5bbf4bff9 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/agentDev/AuthInfo.java @@ -0,0 +1,47 @@ +package com.jsowell.pile.vo.agentDev; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +import java.util.List; + +/** + * 用户授权信息实体 + * + * @author Lemon + * @Date 2023/7/29 9:18 + */ +@Data +public class AuthInfo { + /** + * 授权方 appid + */ + @JSONField(name = "authorizer_appid") + private String authorizerAppid; + + /** + * 接口调用令牌 + */ + @JSONField(name = "authorizer_access_token") + private String authorizerAccessToken; + + /** + * authorizer_access_token 的有效期, 单位:秒 + */ + @JSONField(name = "expires_in") + private Integer expiredTime; + + /** + * 刷新令牌 + * 刷新令牌主要用于第三方平台获取和刷新已授权用户的 authorizer_access_token。 + * 一旦丢失,只能让用户重新授权,才能再次拿到新的刷新令牌。用户重新授权后,之前的刷新令牌会失效 + */ + @JSONField(name = "authorizer_refresh_token") + private String authorizerRefreshToken; + + /** + * 授权给开发者的权限集列表 + */ + @JSONField(name = "func_info") + private List permissionInfoList; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/agentDev/PermissionInfo.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/agentDev/PermissionInfo.java new file mode 100644 index 000000000..e23130a97 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/agentDev/PermissionInfo.java @@ -0,0 +1,19 @@ +package com.jsowell.pile.vo.agentDev; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +/** + * TODO + * + * @author Lemon + * @Date 2023/7/29 9:24 + */ +@Data +public class PermissionInfo { + + @JSONField(name = "funcscope_category") + private String funcscopeCategory; + + private String id; +} From ad6b914abf0a31e3f7cd53bbb0207b81eafff6fb Mon Sep 17 00:00:00 2001 From: Lemon Date: Sat, 29 Jul 2023 14:37:46 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E5=B9=B3=E5=8F=B0=20=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E4=BD=93=E9=AA=8C?= =?UTF-8?q?=E7=89=88=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/uniapp/AgentDevController.java | 27 +++++++++- .../com/jsowell/service/AgentDevService.java | 46 +++++++++++++++-- .../pile/dto/agentDev/CommitCodeDTO.java | 49 +++++++++++++++++++ .../{ => agentDev}/GetComponentTokenDTO.java | 2 +- 4 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 jsowell-pile/src/main/java/com/jsowell/pile/dto/agentDev/CommitCodeDTO.java rename jsowell-pile/src/main/java/com/jsowell/pile/dto/{ => agentDev}/GetComponentTokenDTO.java (93%) diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/AgentDevController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/AgentDevController.java index e745aa07a..01768fc4f 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/AgentDevController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/AgentDevController.java @@ -5,10 +5,10 @@ import com.jsowell.common.annotation.Anonymous; import com.jsowell.common.core.controller.BaseController; import com.jsowell.common.response.RestApiResponse; import com.jsowell.pile.domain.AuthorizationEventResult; -import com.jsowell.pile.dto.GetComponentTokenDTO; +import com.jsowell.pile.dto.agentDev.CommitCodeDTO; +import com.jsowell.pile.dto.agentDev.GetComponentTokenDTO; import com.jsowell.pile.vo.agentDev.AuthInfo; import com.jsowell.service.AgentDevService; -import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -86,6 +86,7 @@ public class AgentDevController extends BaseController { /** * 使用授权码获取授权信息 + * * @param authorizationCode * @return */ @@ -103,4 +104,26 @@ public class AgentDevController extends BaseController { logger.info("使用授权码获取授权信息 result:{}", response); return response; } + + + /** + * 提交代码并生成体验版小程序 + * + * @param dto + * @return + */ + @PostMapping("/commitCode") + public RestApiResponse commitCode(@RequestBody CommitCodeDTO dto) { + logger.info("提交代码并生成体验版小程序 params:{}", JSONObject.toJSONString(dto)); + RestApiResponse response = null; + try { + String commitResult = agentDevService.commitCode(dto); + response = new RestApiResponse<>(commitResult); + } catch (Exception e) { + logger.error("提交代码并生成体验版小程序 error,", e); + response = new RestApiResponse<>(e); + } + logger.info("提交代码并生成体验版小程序 result:{}", response); + return response; + } } diff --git a/jsowell-admin/src/main/java/com/jsowell/service/AgentDevService.java b/jsowell-admin/src/main/java/com/jsowell/service/AgentDevService.java index 5a504d9b8..b85690052 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/AgentDevService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/AgentDevService.java @@ -8,16 +8,17 @@ import com.jsowell.common.util.http.HttpUtils; import com.jsowell.common.util.wxplatform.AesException; import com.jsowell.common.util.wxplatform.WXBizMsgCrypt; import com.jsowell.common.util.wxplatform.WXXmlToMapUtil; -import com.jsowell.pile.dto.GetComponentTokenDTO; +import com.jsowell.pile.domain.agentDev.CategoryInfo; +import com.jsowell.pile.dto.agentDev.CommitCodeDTO; +import com.jsowell.pile.dto.agentDev.GetComponentTokenDTO; import com.jsowell.pile.vo.agentDev.AuthInfo; import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.RandomStringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Locale; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -251,4 +252,43 @@ public class AgentDevService { return authInfo; } + + /** + * 提交代码并生成体验版小程序 + * + * @param dto + * @return + */ + public String commitCode(CommitCodeDTO dto) { + String redisKey = CacheConstants.AUTHORIZER_ACCESS_TOKEN + dto.getAuthorizerAppid(); + String authAccessToken = redisCache.getCacheObject(redisKey); + if (StringUtils.isBlank(authAccessToken)) { + throw new RuntimeException("微信第三方平台 提交代码 error: authAccessToken为空"); + } + // 提交代码 url + String url = "https://api.weixin.qq.com/wxa/commit?access_token=" + authAccessToken; + JSONObject jsonObject = new JSONObject(); + jsonObject.put("template_id", dto.getTemplateId()); + jsonObject.put("ext_json", dto.getExtJson()); + jsonObject.put("user_version", dto.getUserVersion()); + jsonObject.put("user_desc", dto.getUserDesc()); + + String result = HttpUtils.sendPost(url, JSONObject.toJSONString(jsonObject)); + logger.info("获取第三方平台 使用授权码获取授权信息 请求参数:{}, 请求结果:{}", JSONObject.toJSONString(jsonObject), result); + // 将返回结果转为json对象 + JSONObject resultJson = JSONObject.parseObject(result); + + return resultJson.getString("errmsg"); + } + + + + + + + public String submitAudit() { + + + return null; + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/agentDev/CommitCodeDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/agentDev/CommitCodeDTO.java new file mode 100644 index 000000000..d328b14e9 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/agentDev/CommitCodeDTO.java @@ -0,0 +1,49 @@ +package com.jsowell.pile.dto.agentDev; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 微信第三方平台 提交代码并生成体验版DTO + * + * @author Lemon + * @Date 2023/7/29 13:26 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CommitCodeDTO { + + /** + * 授权方appid + */ + private String authorizerAppid; + + /** + * 代码库中的代码模板 ID,可通过getTemplateList接口获取代码模板template_id。 + */ + // @JSONField(name = "template_id") + private String templateId; + + /** + * 为了方便第三方平台的开发者引入 extAppid 的开发调试工作,引入ext.json配置文件概念,该参数则是用于控制ext.json配置文件的内容。 + */ + // @JSONField(name = "ext_json") + private String extJson; + + /** + * 代码版本号,开发者可自定义(长度不要超过 64 个字符) + */ + // @JSONField(name = "user_version") + private String userVersion; + + /** + * 代码描述,开发者可自定义 + */ + // @JSONField(name = "user_desc") + private String userDesc; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/GetComponentTokenDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/agentDev/GetComponentTokenDTO.java similarity index 93% rename from jsowell-pile/src/main/java/com/jsowell/pile/dto/GetComponentTokenDTO.java rename to jsowell-pile/src/main/java/com/jsowell/pile/dto/agentDev/GetComponentTokenDTO.java index 63f918101..b10b9488c 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/GetComponentTokenDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/agentDev/GetComponentTokenDTO.java @@ -1,4 +1,4 @@ -package com.jsowell.pile.dto; +package com.jsowell.pile.dto.agentDev; import lombok.AllArgsConstructor; import lombok.Builder;