获取微信公众号的access_token

前言

官方文档地址开始开发 / 获取 Access token

微信公众号开发中绝大多数接口调用都需要带上access_token这个参数,这个参数是7200秒过期,但是如果业务量稍微大一点,每次都从微信服务器获取一次的话,获取的次数是不够的,每天获取access_token的次数是有限的,所以我们不能每次使用接口都获取一次,我们需要进行一个存储和超时监测。

获取原始的Token回显

我们需要进行一个GET请求,可以直接浏览器进行一下尝试,APPID和APPSECRET需要填写你自己真实的(或者测试号的)一个字符串

你需要对这个URL进行一次GET请求,https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

一切正常的话你会出现一个这样子的JSON回显,access_token就是你需要的那个字符串,expires_in代表有效期为7200秒

{
    "access_token": "73__tC83-IVcgP_p2Fdj78uXCTDKqbMyLqa7BBK_zcLHCYSB3ct3bDIE77X7Mba8mfjomkZuuqWPvOnQTu-ZVWk0M9UPdEAHyhFV2_-zG48G7RznKmmYP8ymwdvXToCUGjABAIAM",
    "expires_in": 7200
}

AccessToken存储类

由于每天的调用次数有限,我们是需要本地存着它,过期再获取

我们需要定义一个类,这个类有两个参数,一个是字符串类型的token,一个是超时时间expireTime

我们直接将超时时间设置成当前时间加上默认的超时时间,微信返回的json结构中的expires_in为单位为秒的7200,而java中时间的默认值为long类型的一个毫秒值,所以我们改写这个SetExpireTime

    public void setExpireTime(long expireIn) {
        this.expireTime = System.currentTimeMillis() + expireIn *
                1000;
    }

我们再写一个方法用于判断token是否超时

    public boolean isExpired() {
        return System.currentTimeMillis() > this.expireTime;
    }

完整的类代码

package cn.omvn.domain.wechat;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 2023-10-05
 * 栋dong
 */
public class WechatAccessToken {
    private String token;
    private long expireTime;

    public void setExpireTime(long expireIn) {
        this.expireTime = System.currentTimeMillis() + expireIn *
                1000;
    }
    public boolean isExpired() {
        return System.currentTimeMillis() > this.expireTime;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public long getExpireTime() {
        return expireTime;
    }
}

获取AccessToken的工具类

这个工具类有唯一的作用就是获取微信公众号的AccessToken,需要三个参数,一个就是刚刚定义的AccessToken存储类,一个是appID,还有appsecret,这两个参数最好从配置文件中获取。

这个类中需要有两个方法,一个是私有的通过GET请求获取token并且设置token和超时时间,JAVA进行GET请求可以通过这篇文章写一个静态的工具类

你需要用string的format方法进行字符串拼接,把APPID和APPSECRET进行拼接

        String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",
                appID,
                appsecret);

一个是公共的供外部调用GetToken,在里面判断token为空或者token已经超时的话,调用私有的方法重新获取一下token,然后进行返回

package cn.omvn.utils;

/**
 * 2023-10-05
 * 栋dong
 */


import cn.omvn.domain.wechat.WechatAccessToken;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component

public class WechatToken {
    @Value("${wechat.appID}")
    private  String appID;
    @Value("${wechat.appsecret}")
    private  String appsecret;
    private static WechatAccessToken wechatAccessToken = new WechatAccessToken();
    private void getToken() {
        String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",
                appID,
                appsecret);
        System.out.println("公众号的APPID为:"+appID);
        System.out.println("公众号的appsecret为:"+appsecret);
        System.out.println("进行获取token的url为:"+url);
        try {
            String response = HttpUtil.doGet(url);
            JSONObject jsonObject = JSON.parseObject(String.valueOf(response));

            // 访问解析后的数据
            String Token = jsonObject.getString("access_token");
            long expiresIn = jsonObject.getLong("expires_in");
            wechatAccessToken.setToken(Token);
            wechatAccessToken.setExpireTime(expiresIn);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public String GetToken(){
        if(wechatAccessToken == null || wechatAccessToken.isExpired()){
            this.getToken();
        }
        return wechatAccessToken.getToken();
    }
}
版权声明:除特殊说明,博客文章均为栋dong原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。
如有需要,请在留言板留言,或者添加我的QQ或者微信
我只是一个学生,如有错误或者侵权,请联系我,谢!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇