-
Notifications
You must be signed in to change notification settings - Fork 17
7 jsapi_ticket中控服务器
jsapi_ticket
是使用js-sdk
必须要的一个凭证,需要配置在js
中。
附录:参考JS-SDK授权验证
要获取jsapi_ticket可以使用如下的方法
String jsapi_ticket = TokenProxy.jsApiTicket();
jsapi_ticket
每日有一个次数限制,所以客户服务器不能每次是都去请求一个新的jsapi_ticket
,每次请求之后,jsapi_ticket
都有一个过期时间。因此微信平台建议你使用一个中控服务器来定时刷新jsapi_ticket
,取得之后存起来不用再去请求jsapi_ticket
,因为jsapi_ticket
请求有次数限制。 这样处理只有有两个好处:
- 保证
jsapi_ticket
每日都不会超出访问限制,保证服务的正常。 - 提高服务的性能,不用每次发送业务请求之前都先发送一次
jsapi_ticket
获取请求。
wechat-framework
获取jsapi_ticket
是通过jsapi_ticket
的代理TokenProxy
来获取,而此代理封装了jsapi_ticket
的中控服务器。对jsapi_ticket
的保存有两种方式,一种是内存保存,一种是持久化保存(数据库或者文件)。内存保存方式的中控服务器由wechat-framework
实现,客户不做任何操作。如果客户要使用持久化保存,那么就需要自己去定义中控服务器。所以有如下两种中控服务器:
-
jsapi_ticket
默认中控服务器 -
jsapi_ticket
自定义中控服务器
wechat-framework
的默认中控服务器是内存模式,即将jsapi_ticket
保存在内存中,直到过期的时候再去请求一个新的来替代。默认中控服务器对应的类是JsApiTicketMemServer
。
- 优点:此模式的中控服务器有点是效率高,使用方便,客户不用关心。
- 缺点:无法支持多服务器的集群,如果多个服务器的时候,此方式将不被支持。
如果你需要将jsapi_ticket
保存在数据库或者文件中,那么就需要使用自定义的中控服务器。自定义的服务器需要客户自己完成,必须继承抽象类CustomerServer
,完成其中的保存和查询方法即可,同时自定义的服务器是由定时器来驱动操作的,需要配置监听器。
配置自定义jsapi_ticket
服务器的详细步骤:
- 创建自己的服务器类,需要继承
wechat-framework
的CustomerServer
类,实现save
和find
方法,前者是将jsapi_ticket
保存到数据库的操作,后者是从数据库中查询jsapi_ticket
的方法,里面可以是一个sql
操作之类的。
public class CustomerJsApiTicketServer extends CustomerServer{
@Override
public String find() {
String accessToken = null;
//执行数据库操作
// String sql = "select cfgValue from cfg where cfg.cfgKey = 'jsapi_ticket'";
// accessToken = DBUtil.query(sql);
return accessToken;
}
@Override
public boolean save(Token jsapiTicket) {
//如果没有需要插入,如果有的就更新,假设已经有了数据库配置项
// String sql = "update cfg set cfg.cfgValue=" + jsapiTicket.getToken() +
// " where cfg.cfgKey= 'jsapi_ticket'";
// DBUtil.execute(sql);
return true;
}
}
- 在
wechat4j.properties
配置文件中配置wechat.ticket.jsapi.server.class
项,配上刚才新建的服务器类的路径,示例如下:
wechat.ticket.jsapi.server.class=com.sample.wechat.CustomerJsApiTicketServer
- 在
web.xml
中配置wechat-framework
的监听器。代码如下:
<listener>
<listener-class>com.itfvck.wechatframework.core.token.TokenListener</listener-class>
</listener>
通过如上三步就能配置好自己的数据库jsapi_ticket
服务器。这样由中控服务器定时去刷新jsapi_ticket
,然后保存到数据库中,业务逻辑中要使用jsapi_ticket
的时候,是通过代理去数据库拿到数据。
定时刷新任务会提前200秒运行,防止到有效期之后运行过程中新jsapi_ticket
没有取得旧的jsapi_ticket
过期的情况发生。