一、jsapi_ticket是什么?
jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
二、注意事项
由于jsapi_ticket有效期为2小时,并且每天有实时调用量上限次数,所以最好开发的时候最好把jsapi_ticket存储起来,判断上次获取的jsapi_ticket是否有效,如果有效,就需要再次发起请求去获取jsapi_ticket了。
存储jsapi_ticket有2种方式
- 存储在内存中(本文介绍这种方式,只适用于部署单点项目,部署多点项目会造成jsapi_ticket错误)
- 存储在数据库中
三、多类型是什么?
前一阵子做了卡券的项目,发现获取jsapi_ticket的地址是不同的,在这里面做下说明,省的大家开发时遇到麻烦
正常获取jsapi_ticket的url地址(type为jsapi):
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
微信卡券获取jsapi_ticket的url地址(type为wx_card):
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card
四、代码实例
JsApiTicketUtils
下文代码中使用的获取token在微信公众号获取普通access_token中
/**
* jsapi_ticket是公众号用于调用微信JS接口的临时票据
* jsapi_ticket的每天有调用限额
* 长期存储jsapi_ticket
* */
public class JsApiTicketUtils {
private static Logger log = LoggerFactory.getLogger(JsApiTicketUtils.class);
private static Map<String, String> jsApiTicketMap = new HashMap<>();
private final static String JSAPI_TICKET = "jsapi";//jsapi_ticket
private final static String WX_CARD_JSAPI_TICKET = "wx_card";//微信卡券jsapi_ticket
/**
* 获取jsapi_ticket
*/
public static Map<String, String> getJsApiTicket() {
String time = jsApiTicketMap.get("jsapi_ticket_time");
String jsApiTicket = jsApiTicketMap.get("jsapi_ticket");
Long nowDate = new Date().getTime();
if (jsApiTicket != null && time != null && nowDate - Long.parseLong(time) < (1.5*60*60*1000)) {
log.info("jsApiTicket存在,且没有超时,返回jsApiTicketMap");
return jsApiTicketMap;
}
synchronized (JsApiTicketUtils.class) {
if(jsApiTicket != null && time != null && nowDate - Long.parseLong(time) < (1.5*60*60*1000)) {
log.info("jsApiTicket存在,且没有超时,返回jsApiTicketMap");
return jsApiTicketMap;
}
log.info("jsApiTicket超时,或者不存在,重新获取");
try {
//获取accessToken
String accessToken=WeiXinUtils.getAccessToken();
//根据accessToken获取jsapiTicket
String jsapiTicket = WeiXinUtils.getJsApiTicket(accessToken,JSAPI_TICKET);
log.info("jsapi_ticket_time:"+nowDate);
log.info("jsapi_ticket:"+jsapiTicket);
jsApiTicketMap.put("jsapi_ticket_time", nowDate + "");
jsApiTicketMap.put("jsapi_ticket", jsapiTicket);
} catch (Exception e) {
log.error("微信服务器发生错误",e);
}
return jsApiTicketMap;
}
/**
* 获取jsapi_ticket(微信卡券)
*/
public static Map<String, String> getWxCardJsApiTicket() {
String time = jsApiTicketMap.get("wx_card_jsapi_ticket_time");
String jsApiTicket = jsApiTicketMap.get("wx_card_jsapi_ticket");
Long nowDate = new Date().getTime();
if (jsApiTicket != null && time != null && nowDate - Long.parseLong(time) < (1.5*60*60*1000)) {
log.info("jsApiTicket存在,且没有超时,返回jsApiTicketMap");
return jsApiTicketMap;
}
synchronized (JsApiTicketUtils.class) {
if(jsApiTicket != null && time != null && nowDate - Long.parseLong(time) < (1.5*60*60*1000)) {
log.info("jsApiTicket存在,且没有超时,返回jsApiTicketMap");
return jsApiTicketMap;
}
log.info("jsApiTicket超时,或者不存在,重新获取");
try {
//获取accessToken
String accessToken=WeiXinUtils.getAccessToken();
//根据accessToken获取jsapiTicket
String jsapiTicket = WeiXinUtils.getJsApiTicket(accessToken,WX_CARD_JSAPI_TICKET);
log.info("wx_card_jsapi_ticket_time:"+nowDate);
log.info("wx_card_jsapi_ticket:"+jsapiTicket);
jsApiTicketMap.put("wx_card_jsapi_ticket_time", nowDate + "");
jsApiTicketMap.put("wx_card_jsapi_ticket", jsapiTicket);
} catch (Exception e) {
log.error("微信服务器发生错误",e);
}
return jsApiTicketMap;
}
}
WeiXinUtils
下文代码中使用的UrlConUtil在Http请求UrlConUtil工具类中
/**
* jsapi_ticket是公众号用于调用微信JS接口的临时票据
* */
public static String getJsApiTicket(String accessToken, String type){
String jsApiTicket = "";
// 这个url链接地址和参数皆不能变
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken+"&type="+type;
try {
JSONObject jsonObject = UrlConUtil.httpsRequest(url, "GET", null);
logger.info("获取jsapi_ticket返回的json:"+jsonObject);
Long expiresIn = jsonObject.getLong("expires_in");
logger.info("微信获取的expires_in:"+expiresIn);
String ticket = jsonObject.getString("ticket");
logger.info("微信获取的ticket:"+ticket);
}catch (Exception e){
logger.debug("获取jsapi_ticket发生异常",e);
}
return jsApiTicket;
}