新增 微信第三方平台 使用授权码获取授权信息接口

This commit is contained in:
Lemon
2023-07-29 11:42:01 +08:00
parent d4723d9274
commit 13b7a1f9a6
6 changed files with 148 additions and 3 deletions

View File

@@ -6,6 +6,7 @@ import com.jsowell.common.core.controller.BaseController;
import com.jsowell.common.response.RestApiResponse; import com.jsowell.common.response.RestApiResponse;
import com.jsowell.pile.domain.AuthorizationEventResult; import com.jsowell.pile.domain.AuthorizationEventResult;
import com.jsowell.pile.dto.GetComponentTokenDTO; import com.jsowell.pile.dto.GetComponentTokenDTO;
import com.jsowell.pile.vo.agentDev.AuthInfo;
import com.jsowell.service.AgentDevService; import com.jsowell.service.AgentDevService;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -28,7 +29,7 @@ public class AgentDevController extends BaseController {
private AgentDevService agentDevService; private AgentDevService agentDevService;
/** /**
* 授权事件接收URL,验证票据、 * 授权事件接收URL,验证票据、授权事件
* *
* @param timestamp * @param timestamp
* @param nonce * @param nonce
@@ -82,4 +83,24 @@ public class AgentDevController extends BaseController {
return response; 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;
}
} }

View File

@@ -9,6 +9,7 @@ import com.jsowell.common.util.wxplatform.AesException;
import com.jsowell.common.util.wxplatform.WXBizMsgCrypt; import com.jsowell.common.util.wxplatform.WXBizMsgCrypt;
import com.jsowell.common.util.wxplatform.WXXmlToMapUtil; import com.jsowell.common.util.wxplatform.WXXmlToMapUtil;
import com.jsowell.pile.dto.GetComponentTokenDTO; import com.jsowell.pile.dto.GetComponentTokenDTO;
import com.jsowell.pile.vo.agentDev.AuthInfo;
import org.apache.commons.collections.MapUtils; import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomStringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -124,6 +125,7 @@ public class AgentDevService {
/** /**
* 小程序/公众号授权事件 * 小程序/公众号授权事件
*
* @param map * @param map
*/ */
private void authorizedInform(Map<String, String> map) { private void authorizedInform(Map<String, String> map) {
@@ -209,4 +211,44 @@ public class AgentDevService {
return token; 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;
}
} }

View File

@@ -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 * 微信第三方平台 token
*/ */
public static final String COMPONENT_ACCESS_TOKEN = "component_access_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 * 充电桩sn生成 key
*/ */

View File

@@ -1,6 +1,9 @@
package com.jsowell.pile.dto; package com.jsowell.pile.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
/** /**
* 获取第三方平台令牌 DTO * 获取第三方平台令牌 DTO
@@ -9,6 +12,9 @@ import lombok.Data;
* @Date 2023/7/28 14:05 * @Date 2023/7/28 14:05
*/ */
@Data @Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class GetComponentTokenDTO { public class GetComponentTokenDTO {
/** /**
* 第三方平台 appId * 第三方平台 appId

View File

@@ -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<PermissionInfo> permissionInfoList;
}

View File

@@ -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;
}