微信之获取JspApiTiket

本文介绍了如何通过代码实现微信API的AccessToken获取,并讨论了为何避免Redis缓存AccessToken,选择存储JspApiTicket。还展示了TokenUtil和TokenUtilImpl类的实现,涉及HTTP请求、JSON操作以及Redis数据管理。
摘要由CSDN通过智能技术生成

直接上代码

 /**
     * 获取AccessToken(这里不需要存redis)
     * @return 返回拿到的access_token及有效期
     */
    public  AccessToken getAccessTokenKd(String APPID,String APPSECRET) throws ClientProtocolException, IOException{
        AccessToken token = new AccessToken();
        String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET );
        try {
            JSONObject jsonObject = doGetStr(url);
            log.info("获取到的json数据:"+jsonObject);
            if(jsonObject!=null  && (jsonObject.getString("errcode") != null || !"".equals(jsonObject.getString("errcode")))){ //如果返回不为空,将返回结果封装进AccessToken实体类
                token.setAccesstoken(jsonObject.getString("access_token"));//取出access_token
                token.setExpiresIn(jsonObject.getInteger("expires_in"));//取出access_token的有效期
                //tokenUtil.insertToken(APPID+":accessToken", token.getAccesstoken(),6000, TimeUnit.SECONDS);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return token;
    }

//获取Tiket
 public  JspApiTiket getApitiket(String APPID,String APPSECRET) {
        AccessToken atoken = new AccessToken();
        JspApiTiket jatiket = new JspApiTiket();

        try {
            atoken = getAccessTokenKd(APPID,APPSECRET);//调用工具类获取Access_token
            /*
            拼接字符串生成getJspApiTiket所需的参数url
             */
            String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + atoken.getAccesstoken() + "&type=jsapi";
            jatiket = WeiXinUtil.getJspApiTiket( url );//调用工具类获取JspApiTiket
            //这里存一下redis 获取到的Tiket实效时间也是7200s
            tokenUtil.insertToken(APPID+":jspApiTiket", jatiket.getTiket(),6000, TimeUnit.SECONDS);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jatiket;
    }

/**
     * @param url 请求的URL
     * @return 将请求URL后返回的数据,转为JSON格式
     */
    public static JSONObject doGetStr(String url) throws ClientProtocolException, Exception {
        DefaultHttpClient client = new DefaultHttpClient();//获取DefaultHttpClient请求
        HttpGet httpGet = new HttpGet(url);//HttpGet将使用Get方式发送请求URL
        JSONObject jsonObject = null;
        HttpResponse response = client.execute(httpGet);//使用HttpResponse接收client执行httpGet的结果
        HttpEntity entity = response.getEntity();//从response中获取结果,类型为HttpEntity
        if(entity != null){
            String result = EntityUtils.toString(entity,"UTF-8");//HttpEntity转为字符串类型
            jsonObject = JSONObject.parseObject(result);//字符串类型转为JSON类
            System.out.print( "get请求完成,返回数据="+ jsonObject.toString());
        }
        return jsonObject;
    }

微信官方文档.
如果你把access_token存到redis会出现这种情况:每次获取到access_token后,存在redis里面两个小时,但是在别的地方再次调用过了,导致redis中的已经失效;所以直接存JspApiTiket即可。
注:
这里的access_token为全局token,默认一天最多获取2000次,次数也可以去申请。

TokenUtil类

@Resource
public interface TokenUtil {
    /**
     *1、存数据
     * */
    void createtoken(String token, String type, Object object);

    /**
     *2、取数据
     * */
    Object getInfoByToken(String token, String type);

    /**
     *3、删除某个数据
     * */
    public void deleteByToken(String token, String type);

    /**
     *4、取全部数据
     * */
    Object getInfoByToken(String token);

    Object getToken(String token);

    void insertToken(String tianquanToken, String token, Integer expireTime);
}

TokenUtilImpl类

@Service("TokenUtil")
public class TokenUtilImpl implements TokenUtil {
    /**
     * 声明
     * */
    @Resource
    private RedisTemplate  redisTemplate;

    /**
     *
     * 1、生成tokenMap ,存储用户信息
     * */
    @Override
    public void createtoken(String token, String type, Object object){
        redisTemplate.opsForHash().put(token, type ,object );
    }


    /**
     *
     * 2、根据token获取用户信息
     * */
    @Override
    public Object getInfoByToken(String token, String type) {
        return  redisTemplate.opsForHash().get(token, type);

    }


    @Override
    public Object getToken(String token) {
        return redisTemplate.opsForValue().get(token);
    }

    @Override
    public void insertToken(String tianquanToken, String token, Integer expireTime) {
        redisTemplate.opsForValue().set(tianquanToken,token, expireTime, TimeUnit.MINUTES );
    }

    @Override
    public void deleteByToken(String token, String type) {
        redisTemplate.opsForHash().delete(token,type);
    }

    @Override
    public Object getInfoByToken(String token) {
        return redisTemplate.opsForHash().entries(token);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值