0
点赞
收藏
分享

微信扫一扫

3、微信订阅号access_toaken获取


前言

access_toaken能干什么

自定义菜单,客户回复消息,图文上传都需要用到它。非常重要,但是它的使用是有次数的,每天只能使用2000次,所以我们要非常小心,因为它两个小时才过期,所以,只要我们重复使用它,还是够用的啦


1、解决access_toaken失效问题

1.1、使用缓存(快)

1.2、使用数据库(慢)博主这里暂时没有缓存库,所以只能倒霉的用到数据库了,哎悲哀

1.2.1、实体

/**
* @Desc: 为了防止调用测试过多
* @Author HealerJean
* @Date 2018/6/1 下午3:04.
*/
@Data
@Entity
@Table(name = "wechat_access_toaken")
@Accessors(chain = true)
public class WechatAccessToaken {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String accessToaken; //防止调用过多 这里使用数据库进行添加

@Temporal(TemporalType.TIMESTAMP)
@Column(columnDefinition = "DEFAULT TIMESTI")
private Date cdate;

@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
private Date udate;



}



create table wechat_access_toaken(
id BIGINT(20) not null auto_increment,
accessToaken varchar(1000) default null,
cdate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
udate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY key (id));

2、获取access_toaken工具类

这里其实很重点了,这里获取access_toaken的时候,使用的是static方法,所以对于使用的服务层注入是不可以直接注入的,所以需要用到其他的一些简单的手段

@Resource
private WechatAccessToakenMapper wechatAccessToakenMapper;

@Resource
private WechatAccessToakenRepository wechatAccessToakenRepository;


//静态的方便直接调用
private static AccessToakeUtil accessToakeUtil;

@PostConstruct
public void init() {
accessToakeUtil = this;
accessToakeUtil.wechatAccessToakenRepository = this.wechatAccessToakenRepository;
accessToakeUtil.wechatAccessToakenMapper = this.wechatAccessToakenMapper;

}

package com.duodian.youhui.admin.utils;

import com.duodian.youhui.admin.constants.WeChatMessageParams;
import com.duodian.youhui.admin.utils.SdkHttpHelper;
import com.duodian.youhui.dao.db.utils.WechatAccessToakenRepository;
import com.duodian.youhui.dao.mybatis.utils.WechatAccessToakenMapper;
import com.duodian.youhui.data.http.HttpBackBean;
import com.duodian.youhui.entity.db.utils.WechatAccessToaken;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
* @Desc: 获取access_toaken
* @Author HealerJean
* @Date 2018/5/25 上午11:34.
*/
@Slf4j
@Service
public class AccessToakeUtil {

@Resource
private WechatAccessToakenMapper wechatAccessToakenMapper;

@Resource
private WechatAccessToakenRepository wechatAccessToakenRepository;


//静态的方便直接调用
private static AccessToakeUtil accessToakeUtil;

@PostConstruct
public void init() {
accessToakeUtil = this;
accessToakeUtil.wechatAccessToakenRepository = this.wechatAccessToakenRepository;
accessToakeUtil.wechatAccessToakenMapper = this.wechatAccessToakenMapper;

}

/**
* @Desc: 获取access_toaken
* @Date: 2018/5/24 下午6:50.
*/

public static String getAccessToaken(){

WechatAccessToaken wechatAccessToaken =accessToakeUtil.getWechatAccessToaken();

if(wechatAccessToaken!=null){ //先判断数据库中有没有
return wechatAccessToaken.getAccessToaken();
}

String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ WeChatMessageParams.WECHAT_APPID + "&secret=" + WeChatMessageParams.WECHAT_APPSECRET;

HttpBackBean httpBackBean = SdkHttpHelper.handleGet(url,null,null,SdkHttpHelper.OVERTIME);

log.info("获取 accessToken 返回结果"+httpBackBean.getResult());
String accessToken = JSONObject.fromObject(httpBackBean.getResult()).getString("access_token");
if(accessToken!=null){
accessToakeUtil.saveWechatAccessToaken(accessToken); //向数据库中保存accessToaken
return accessToken;
}else {
log.error("获取accessToken失败");
}

return null;
}

private WechatAccessToaken getWechatAccessToaken(){
return accessToakeUtil.wechatAccessToakenMapper.findOnlyToday();
}

private WechatAccessToaken saveWechatAccessToaken(String accessToaken){
accessToakeUtil.wechatAccessToakenRepository.deleteAll(); //保证只有一个数据
WechatAccessToaken wechatAccessToaken = new WechatAccessToaken();
wechatAccessToaken.setAccessToaken(accessToaken);
return accessToakeUtil.wechatAccessToakenRepository.save(wechatAccessToaken);
}
}

3、查询7000秒内的access_是否存在于数据库中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.duodian.youhui.dao.mybatis.utils.WechatAccessToakenMapper">


<select id="findOnlyToday" resultType="com.duodian.youhui.entity.db.utils.WechatAccessToaken">
<![CDATA[ SELECT * from wechat_access_toaken w WHERE TIMESTAMPDIFF(SECOND ,w.cdate,now()) < 7000 ]]>
</select>

</mapper>

3、微信订阅号access_toaken获取_github


举报

相关推荐

0 条评论