// Path: src/main/java/me/hao0/wechat/model/js/Config.java
// public class Config implements Serializable {
// 
//     private static final long serialVersionUID = -8263857663686622616L;
// 
//     /**
//      * 微信APP ID
//      */
//     private String appId;
// 
//     /**
//      * 时间戳(秒)
//      */
//     private Long timestamp;
// 
//     /**
//      * 随机字符串
//      */
//     private String nonStr;
// 
//     /**
//      * 签名
//      */
//     private String signature;
// 
//     public Config(String appId, Long timestamp, String nonStr, String signature) {
//         this.appId = appId;
//         this.timestamp = timestamp;
//         this.nonStr = nonStr;
//         this.signature = signature;
//     }
// 
//     public Config() {
//     }
// 
//     public String getAppId() {
//         return appId;
//     }
// 
//     public void setAppId(String appId) {
//         this.appId = appId;
//     }
// 
//     public Long getTimestamp() {
//         return timestamp;
//     }
// 
//     public void setTimestamp(Long timestamp) {
//         this.timestamp = timestamp;
//     }
// 
//     public String getNonStr() {
//         return nonStr;
//     }
// 
//     public void setNonStr(String nonStr) {
//         this.nonStr = nonStr;
//     }
// 
//     public String getSignature() {
//         return signature;
//     }
// 
//     public void setSignature(String signature) {
//         this.signature = signature;
//     }
// 
//     @Override
//     public String toString() {
//         return "Config{" +
//                 "appId='" + appId + '\'' +
//                 ", timestamp=" + timestamp +
//                 ", nonStr='" + nonStr + '\'' +
//                 ", signature='" + signature + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/me/hao0/wechat/model/js/Ticket.java
// public class Ticket implements Serializable {
// 
//     private static final long serialVersionUID = 978451551258121101L;
// 
//     /**
//      * 凭证字符串
//      */
//     private String ticket;
// 
//     /**
//      * 凭证类型
//      */
//     private TicketType type;
// 
//     /**
//      * 有效时间(s)
//      */
//     private Integer expire;
// 
//     /**
//      * 过期时刻(ms)
//      */
//     private Long expireAt;
// 
//     public String getTicket() {
//         return ticket;
//     }
// 
//     public void setTicket(String ticket) {
//         this.ticket = ticket;
//     }
// 
//     public TicketType getType() {
//         return type;
//     }
// 
//     public void setType(TicketType type) {
//         this.type = type;
//     }
// 
//     public Integer getExpire() {
//         return expire;
//     }
// 
//     public void setExpire(Integer expire) {
//         this.expire = expire;
//     }
// 
//     public Long getExpireAt() {
//         return expireAt;
//     }
// 
//     public void setExpireAt(Long expireAt) {
//         this.expireAt = expireAt;
//     }
// 
//     @Override
//     public String toString() {
//         return "Ticket{" +
//                 "ticket='" + ticket + '\'' +
//                 ", type=" + type +
//                 ", expire=" + expire +
//                 ", expireAt=" + expireAt +
//                 '}';
//     }
// }
// 
// Path: src/main/java/me/hao0/wechat/model/js/TicketType.java
// public enum TicketType {
// 
//     /**
//      * 用于调用微信JSSDK的临时票据
//      */
//     JSAPI("jsapi"),
// 
//     /**
//      * 用于调用卡券相关接口的临时票据
//      */
//     CARD("wx_card");
// 
//     private String type;
// 
//     private TicketType(String type){
//         this.type = type;
//     }
// 
//     public String type(){
//         return type;
//     }
// }


import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
import me.hao0.wechat.model.js.Config;
import me.hao0.wechat.model.js.Ticket;
import me.hao0.wechat.model.js.TicketType;
import java.util.Map;
import static me.hao0.common.util.Preconditions.*;

    /**
     * 获取临时凭证
     * @param accessToken accessToken
     * @param type 凭证类型
     *             @see me.hao0.wechat.model.js.TicketType
     * @return Ticket对象，或抛WechatException
     */
    public Ticket getTicket(String accessToken, TicketType type){
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNull(type, "ticket type can't be null");

        String url = TICKET_GET + accessToken + "&type=" + type.type();
        Map<String, Object> resp = doGet(url);
        Ticket t = new Ticket();
        t.setTicket((String)resp.get("ticket"));
        Integer expire = (Integer)resp.get("expires_in");
        t.setExpire(expire);
        t.setExpireAt(System.currentTimeMillis() + expire * 1000);
        t.setType(type);

        return t;
    }

    /**
     * 获取JSSDK配置信息
     * @param nonStr 随机字符串
     * @param url 调用JSSDK的页面URL全路径(去除#后的)
     * @return Config对象
     */
// Path: src/main/java/me/hao0/wechat/model/js/Config.java
// public class Config implements Serializable {
// 
//     private static final long serialVersionUID = -8263857663686622616L;
// 
//     /**
//      * 微信APP ID
//      */
//     private String appId;
// 
//     /**
//      * 时间戳(秒)
//      */
//     private Long timestamp;
// 
//     /**
//      * 随机字符串
//      */
//     private String nonStr;
// 
//     /**
//      * 签名
//      */
//     private String signature;
// 
//     public Config(String appId, Long timestamp, String nonStr, String signature) {
//         this.appId = appId;
//         this.timestamp = timestamp;
//         this.nonStr = nonStr;
//         this.signature = signature;
//     }
// 
//     public Config() {
//     }
// 
//     public String getAppId() {
//         return appId;
//     }
// 
//     public void setAppId(String appId) {
//         this.appId = appId;
//     }
// 
//     public Long getTimestamp() {
//         return timestamp;
//     }
// 
//     public void setTimestamp(Long timestamp) {
//         this.timestamp = timestamp;
//     }
// 
//     public String getNonStr() {
//         return nonStr;
//     }
// 
//     public void setNonStr(String nonStr) {
//         this.nonStr = nonStr;
//     }
// 
//     public String getSignature() {
//         return signature;
//     }
// 
//     public void setSignature(String signature) {
//         this.signature = signature;
//     }
// 
//     @Override
//     public String toString() {
//         return "Config{" +
//                 "appId='" + appId + '\'' +
//                 ", timestamp=" + timestamp +
//                 ", nonStr='" + nonStr + '\'' +
//                 ", signature='" + signature + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/me/hao0/wechat/model/js/Ticket.java
// public class Ticket implements Serializable {
// 
//     private static final long serialVersionUID = 978451551258121101L;
// 
//     /**
//      * 凭证字符串
//      */
//     private String ticket;
// 
//     /**
//      * 凭证类型
//      */
//     private TicketType type;
// 
//     /**
//      * 有效时间(s)
//      */
//     private Integer expire;
// 
//     /**
//      * 过期时刻(ms)
//      */
//     private Long expireAt;
// 
//     public String getTicket() {
//         return ticket;
//     }
// 
//     public void setTicket(String ticket) {
//         this.ticket = ticket;
//     }
// 
//     public TicketType getType() {
//         return type;
//     }
// 
//     public void setType(TicketType type) {
//         this.type = type;
//     }
// 
//     public Integer getExpire() {
//         return expire;
//     }
// 
//     public void setExpire(Integer expire) {
//         this.expire = expire;
//     }
// 
//     public Long getExpireAt() {
//         return expireAt;
//     }
// 
//     public void setExpireAt(Long expireAt) {
//         this.expireAt = expireAt;
//     }
// 
//     @Override
//     public String toString() {
//         return "Ticket{" +
//                 "ticket='" + ticket + '\'' +
//                 ", type=" + type +
//                 ", expire=" + expire +
//                 ", expireAt=" + expireAt +
//                 '}';
//     }
// }
// 
// Path: src/main/java/me/hao0/wechat/model/js/TicketType.java
// public enum TicketType {
// 
//     /**
//      * 用于调用微信JSSDK的临时票据
//      */
//     JSAPI("jsapi"),
// 
//     /**
//      * 用于调用卡券相关接口的临时票据
//      */
//     CARD("wx_card");
// 
//     private String type;
// 
//     private TicketType(String type){
//         this.type = type;
//     }
// 
//     public String type(){
//         return type;
//     }
// }


// Path: src/main/java/me/hao0/wechat/core/JsSdks.java
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
import me.hao0.wechat.model.js.Config;
import me.hao0.wechat.model.js.Ticket;
import me.hao0.wechat.model.js.TicketType;
import java.util.Map;
import static me.hao0.common.util.Preconditions.*;


    /**
     * 获取临时凭证
     * @param accessToken accessToken
     * @param type 凭证类型
     *             @see me.hao0.wechat.model.js.TicketType
     * @return Ticket对象，或抛WechatException
     */
    public Ticket getTicket(String accessToken, TicketType type){
        checkNotNullAndEmpty(accessToken, "accessToken");
        checkNotNull(type, "ticket type can't be null");

        String url = TICKET_GET + accessToken + "&type=" + type.type();
        Map<String, Object> resp = doGet(url);
        Ticket t = new Ticket();
        t.setTicket((String)resp.get("ticket"));
        Integer expire = (Integer)resp.get("expires_in");
        t.setExpire(expire);
        t.setExpireAt(System.currentTimeMillis() + expire * 1000);
        t.setType(type);

        return t;
    }

    /**
     * 获取JSSDK配置信息
     * @param nonStr 随机字符串
     * @param url 调用JSSDK的页面URL全路径(去除#后的)
     * @return Config对象
     */
    public Config getConfig(String nonStr, String url){