Java微信公衆平臺開發之access_token獲取(Spring Boot 2.X)

官方文檔連接java

access_token是何物,access_token是公衆號的全局惟一接口調用憑據,公衆號調用各接口時都需使用access_token。開發者須要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前爲2個小時,需定時刷新,重複獲取將致使上次獲取的access_token失效。git

官方是這麼介紹的,因爲有請求次數限制,確定不能隨用隨取,須要採用中控服務器保存。github

此外在刷新過程當中,中控服務器可對外繼續輸出的老access_token,此時公衆平臺後臺會保證在5分鐘內,新老access_token均可用,這保證了第三方業務的平滑過渡,這就保證了不須要考慮access_token失效的問題了,前提是正確獲取到並及時刷新了。redis

1、安裝Redis

Linux能夠用docker去安裝,Windows下安裝並設置Redisspring

2、獲取access_token並緩存到Redis

AppID和AppSecret可在「微信公衆平臺-開發-基本配置」頁中得到(須要已經成爲開發者,且賬號沒有異常狀態)。docker

若是是測試號,不存在白名單一說,正式的公衆號調用接口時,請登陸「微信公衆平臺-開發-基本配置」提早將服務器IP地址添加到IP白名單中,點擊查看設置方法,不然將沒法調用成功json

聲明: 因爲沒開發過實際的公衆號,不清楚如何正確的緩存access_token,只是我我的的作法。

多環境配置,在application-dev.yml加入 ,appid 、appsecret、token替換成本身的api

#wechat
wechat:
  appid: yours
  appsecret: yours
  token: yours

讀取配置緩存

/**
 * FileName: WechatAccountConfig
 * Author:   Phil
 * Date:     11/20/2018 3:10 PM
 * Description: 配置文件
 * History:
 * <author>          <time>          <version>          <desc>
 * 做者姓名           修改時間           版本號              描述
 */
package com.phil.modules.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 〈一句話功能簡述〉<br>
 * 〈接入配置信息〉
 *
 * @author Phil
 * @create 11/20/2018 3:10 PM
 * @since 1.0
 */
@Component
@Getter
@Setter
@ConfigurationProperties(prefix = "wechat")
public class WechatAccountConfig {

    /***
     * 微信的appid
     */
    private String appid;
    /***
     * 微信的secret
     */
    private String appsecret;
    /***
     * 微信受權url
     */
    private String returnUrl;
    /***
     * 微信的驗證token
     */
    private String token;
}

application.properties里加上配置服務器

#auth
#獲取憑證的連接
wechat.auth.get-access-token-url=https://api.weixin.qq.com/cgi-bin/token

讀取配置

/**
 * FileName: WechatAuthConfig
 * Author:   Phil
 * Date:     11/21/2018 7:10 PM
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 做者姓名           修改時間           版本號              描述
 */
package com.phil.wechat.auth.config;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 〈一句話功能簡述〉<br>
 * 〈〉
 *
 * @author Phil
 * @create 11/21/2018 7:10 PM
 * @since 1.0
 */
@Component
@Getter
@Setter
@ToString
@ConfigurationProperties(prefix = "wechat.auth")
public class WechatAuthConfig {

    //獲取憑證
    private String getAccessTokenUrl;


}

定義接收的實體Bean

/**
 * FileName: AccessToken
 * Author:   Phil
 * Date:     12/4/2018 2:13 PM
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 做者姓名           修改時間           版本號              描述
 */
package com.phil.wechat.auth.model.response;

import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; import java.io.Serializable; /** * 〈一句話功能簡述〉<br> * 〈微信通用接口憑證〉 * * @author Phil * @create 12/4/2018 2:13 PM * @since 1.0 */ @Getter @Setter public class AccessToken implements Serializable { private static final long serialVersionUID = 5806078615354556552L; // 獲取到的憑證 @SerializedName("access_token") private String accessToken; // 憑證有效時間,單位:秒 private int expires_in; }

讀取並緩存到Redis

/**
 * FileName: AuthServiceImpl
 * Author:   Phil
 * Date:     11/21/2018 12:13 PM
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 * 做者姓名           修改時間           版本號              描述
 */
package com.phil.wechat.auth.service.impl;

import com.google.gson.JsonSyntaxException;
import com.phil.modules.config.WechatAccountConfig;
import com.phil.modules.result.ResultState;
import com.phil.modules.util.HttpUtil;
import com.phil.modules.util.JsonUtil;
import com.phil.modules.util.RedisUtils;
import com.phil.wechat.auth.config.WechatAuthConfig;
import com.phil.wechat.auth.model.BasicAuthParam;
import com.phil.wechat.auth.model.response.AccessToken;
import com.phil.wechat.auth.model.response.AuthAccessToken;
import com.phil.wechat.auth.model.response.AuthUserInfo;
import com.phil.wechat.auth.service.WechatAuthService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;

/**
 * 〈一句話功能簡述〉<br>
 * 〈〉
 *
 * @author Phil
 * @create 11/21/2018 12:13 PM
 * @since 1.0
 */
@Service
@Slf4j
public class WechatAuthServiceImpl implements WechatAuthService {

    @Value("${wechat.token}")
    private String token;

    @Resource
    RedisUtils redisUtils;

    @Resource
    WechatAuthConfig wechatAuthConfig;

    @Resource
    private WechatAccountConfig wechatAccountConfig;

    /**
     * 獲取受權憑證token
     *
     * @return 受權憑證token
     */
    @Override
    public String getAccessToken() {
        String accessToken = null;
        if (Objects.isNull(redisUtils.get(token))) {
            Map<String, String> map = new TreeMap<>();
            map.put("appid", wechatAccountConfig.getAppid());
            map.put("secret", wechatAccountConfig.getAppsecret());
            map.put("grant_type", "client_credential");
            String json = HttpUtil.doGet(wechatAuthConfig.getGetAccessTokenUrl(), map);
            AccessToken bean = JsonUtil.fromJson(json, AccessToken.class);
            if (bean != null) {
                accessToken = bean.getAccessToken();
                log.info("從微信服務器獲取的受權憑證{}", accessToken);
                redisUtils.set(token, accessToken, 60 * 120);
                log.info("從微信服務器獲取的token緩存到Redis");
            }
        } else {
            accessToken = redisUtils.get(token).toString();
            log.info("從redis中獲取的受權憑證{}", accessToken);
        }
        return accessToken;
    }
}

又或者可使用定時去緩存刷新

 

完整代碼查看GitHub連接,不定時更新

相關文章
相關標籤/搜索