1.获取微信ACCESS_TOKEN地址
https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
2.请求地址
GET https://api.weixin.qq.com/cgi-bin/token
3.返回实体
@Data
@Schema(description = "微信获取ACCESS_TOKEN参数")
public class WechatAccessTokenVO {
@Schema(description = "获取到的凭证")
private String access_token;
@Schema(description = "凭证有效时间,单位:秒。")
private Integer expires_in;
}
4.请求微信
@RetrofitClient(baseUrl = "${wechat.baseUrl}")
@Service
public interface WechatBasicsManager {
/**
* 获取AccessToken
*
* @param appid 小程序 appId
* @param grant_type 授权类型,此处只需填写 client_credential
* @param secret 小程序 appSecret
*/
@GET("cgi-bin/token")
WechatAccessTokenVO getAccessToken(@Query("grant_type") String grant_type, @Query("appid") String appid, @Query("secret") String secret);
}
5.调用(缓存redis)
@Service
public class WechatManager {
private static final Logger LOGGER = LoggerFactory.getLogger(WechatManager.class);
private static final String WECHAT_ACCESS_TOKEN_KEY = "WECHAT_ACCESS_TOKEN";
private static String WECHAT_GRANT_TYPE = "client_credential";
@Value("${wechat.appId}")
public String appId;
@Value("${wechat.appSecret}")
public String appSecret;// 小程序AppSecret
@Resource
private WechatBasicsManager wechatBasicsManager;
@Resource
private RedisManager redisManager;
/**
* 获取微信AccessToken
*
* @return
*/
public String getAccessToken() {
try {
// step1: 如果redis缓存中不存在accessToken,则调用微信接口获取accessToken并设置缓存
if (!redisManager.exist(WECHAT_ACCESS_TOKEN_KEY)) {
synchronized (this) {
if (!redisManager.exist(WECHAT_ACCESS_TOKEN_KEY)) {
WechatAccessTokenVO accessToken = wechatBasicsManager.getAccessToken(WECHAT_GRANT_TYPE, appId, appSecret);
String token = accessToken.getAccess_token();
Integer expireSecond = accessToken.getExpires_in() - 180;
redisManager.set(WECHAT_ACCESS_TOKEN_KEY, token, expireSecond);
}
}
}
// step2: 获取accessToken
String accessToken = redisManager.get(WECHAT_ACCESS_TOKEN_KEY);
return accessToken;
} catch (Exception e) {
LOGGER.error("=====获取微信AccessToken失败,请稍后重试!=====", e);
throw new BaseRuntimeException("获取微信AccessToken失败,请稍后重试!");
}
}
}
注:全局使用token注入WechatManager 调用getAccessToken即可