關(guān)于小程序開(kāi)發(fā)支付腹侣,或者消息推送叔收,或者微信支付 都需要accesstoken。微信官方文檔如下
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
?有些開(kāi)發(fā)同學(xué)每次都是現(xiàn)調(diào)用接口傲隶,根本不緩存accesstoken饺律,這種首先可能會(huì)達(dá)到限制次數(shù)的問(wèn)題,其次可能會(huì)存在一部分訪問(wèn)沒(méi)有處理完跺株,另外一個(gè)訪問(wèn)又重新獲取accesstoken复濒,從而導(dǎo)致別人的accesstoken過(guò)期了的問(wèn)題。
accesstoken 默認(rèn)是有每天2000次的調(diào)用限制帖鸦,有些同學(xué)覺(jué)得芝薇,這個(gè)怎么能夠用啊作儿?可是accesstoken還有個(gè)屬性就是有7200秒的有效期洛二,也就是兩個(gè)小時(shí),理論上一天最多消耗12次調(diào)用攻锰,沒(méi)有過(guò)期就調(diào)用緩存里面的晾嘶,所以是完全夠用的。
下面以java代碼為例實(shí)現(xiàn)這個(gè)過(guò)程娶吞。
@Controller
@RequestMapping("wx")
public class WxController {
private Loggerlog = LoggerFactory.getLogger(UserController.class);
private static AccessToken? ?myAccessToken;
@Value("${wxapp.appid}")
private String appId;
@Value("${wxapp.secret}")
private String secret;
@ResponseBody
@RequestMapping("accesstoken")
public String getAccessToken(){
try {
if (myAccessToken !=null && StringUtil.isNotEmpty(myAccessToken.getAccessToken()) && ((new Date().getTime() -myAccessToken.getDate().getTime()) /1000) <=7000) {//這里為了保險(xiǎn)設(shè)置成7000秒過(guò)期垒迂,而不是7200秒
//沒(méi)有過(guò)期
? ? ? ? ? ? return myAccessToken.getAccessToken();
}else {
//已經(jīng)過(guò)期,則重新申請(qǐng)
? ? ? ? ? ? String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +appId +"&secret=" +secret;
String json = MsgHttpRequest.get(url);
JSONObject jsonObject = JSONObject.parseObject(json);
if (jsonObject.containsKey("access_token")) {
AccessToken accessToken =new AccessToken();
accessToken.setAccessToken(jsonObject.get("access_token").toString());
accessToken.setDate(new Date());
myAccessToken = accessToken;
return myAccessToken.getAccessToken();
}else {
log.error("獲取getAccessToken異常:" + json);
}
}
}catch (Exception ex) {
log.error("getAccessToken錯(cuò)誤:");
ex.printStackTrace();
}
return "";
}
}
還有一個(gè)實(shí)體類(lèi)
public class AccessToken {
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
private StringaccessToken;
private Datedate;
}
其實(shí)比較簡(jiǎn)單妒蛇,使用一個(gè)靜態(tài)變量來(lái)當(dāng)作緩存保存獲取的accesstoken机断, 每次獲取的時(shí)候比較一下是否過(guò)期了,過(guò)期了就重新獲取绣夺,否則就用緩存里面的吏奸。當(dāng)然你也可以把a(bǔ)ccesstoken放到redis中,設(shè)置好過(guò)期時(shí)間就可以了陶耍。