1. 在配置文件中加配置参数
#微信相关数据
wechat:
mch_appid: abc122345677
wx_secret: abcyyydffgdd7b95403552c2
mchid: abc3asdfasd02
key: Fasdf17Yasdfasd3asdf02
url: https\://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
query_url: https\://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo
sslFile: C:\\Users\\Administrator\\Desktop\\vym_doc\\20180116wxpaycertificate\\cert\\apiclient_cert.p12
app_access_token_url: https\://api.weixin.qq.com/cgi-bin/token?grant_type\=client_credential&appid\=abc122345677&secret\=abcyyydffgdd7b95403552c2
template_id_msg: x9cUUj_pIabcyyydffgdd7b95403552c2aYArs
2. 在程序中调用
@Component
public class WechatAppAccessToken {
private final static String ACCESS_TOKEN = "access_token";
private final static String EXPIRES_IN = "expires_in";
private static WechatAppAccessToken wechatAppAccessToken;
@Resource
private RedisUtil redisUtil;
@Value("${wechat.app_access_token_url}")
public String appTokenUrl;
@PostConstruct
public void init() {
wechatAppAccessToken = this;
wechatAppAccessToken.redisUtil = this.redisUtil;
wechatAppAccessToken.appTokenUrl = this.appTokenUrl;
}
/**
* 获取微信公众号的accessToken
* 企业微信公众号secret
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static String getAppAccessToken(Boolean isValid) throws Exception {
String accessTokenRds = wechatAppAccessToken.redisUtil.getValue(ACCESS_TOKEN+"_vym");
if (!StringUtil.isEmpty(accessTokenRds, true) && accessTokenRds.length() > 20 && isValid)
return accessTokenRds;
else {
String accessTokenStr = HttpClientUtil.sendJsonPost(wechatAppAccessToken.appTokenUrl, "");
HashMap<String, Object> tokenMap = JsonUtil.json2bean(accessTokenStr, HashMap.class);
accessTokenRds = (String) tokenMap.get(WechatAppAccessToken.ACCESS_TOKEN);
if(StringUtil.isEmpty(accessTokenRds, true))
return null;
Integer expires_in = (Integer) tokenMap.get(WechatAppAccessToken.EXPIRES_IN);
System.out.println("获取新的token:" + accessTokenRds);
wechatAppAccessToken.redisUtil.setRedisWithTime(ACCESS_TOKEN+"_vym", accessTokenRds,expires_in);
return accessTokenRds;
}
}
}
3. 分析
- 使用注解的时候,该类也必须要注解,否则不识别类内的注解
- 由于类内的加载顺序问题,会预先加载静态成员变量,导致无法获取变量值。这时需要@PostConstruct来加载变量值。
- 虽然该类有注解,但是调用的时候,可以直接用静态方法调用。
- String accessToken = WechatAppAccessToken.getAppAccessToken(true);