微信公众号获取jsapi_ticket(多类型)

一、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种方式

  1. 存储在内存中(本文介绍这种方式,只适用于部署单点项目,部署多点项目会造成jsapi_ticket错误)
  2. 存储在数据库中

三、多类型是什么?

前一阵子做了卡券的项目,发现获取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;
}
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值