色总的微信小程序开发记录(二)--获取access_token

微信小程序开发记录(二)--获取access_token

  • 获取access_token
    • getAccessToken接口
    • access_token 的存储与更新
    • 后台代码

微信小程序还提供了一系列在开发者后端服务器上使用 HTTPS 请求调用的 API,帮助开发者在后台完成各类数据分析、管理和查询等操作。如 getAccessToken,code2Session 等。而在开发者服务器上调用微信的接口就需要access_token 了。

获取access_token

access_token 是小程序全局唯一后台接口调用凭据,调用绝大多数后台接口时都需使用。开发者可以通过 getAccessToken 接口获取并进行妥善保存。为了 access_token 的安全性,后端 API 不能直接在小程序内通过 wx.request 调用,即 api.weixin.qq.com 不能被配置为服务器域名。开发者应在后端服务器使用getAccessToken获取 access_token,并调用相关 API。

getAccessToken接口

GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

请求参数

属性 类型 说明
grant_type string 填写 client_credential
appid string 小程序唯一凭证,即 AppID,可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
secret string 小程序唯一凭证密钥,即 AppSecret,获取方式同 appi

返回值
Object返回的 JSON 数据包

返回值 类型 说明
access_token string 获取到的凭证
expires_in number 凭证有效时间,单位:秒。目前是7200秒之内的值。
errcode number 错误码
errmsg string 错误信息

errcode 的合法值

说明
-1 系统繁忙,此时请开发者稍候再试
0 请求成功
40001 AppSecret 错误或者 AppSecret 不属于这个小程序,请开发者确认 AppSecret 的正确性
40002 请确保 grant_type 字段值为 client_credential
40013 不合法的 AppID,请开发者检查 AppID 的正确性,避免异常字符,注意大小写

返回数据示例
正常返回

{“access_token”:“ACCESS_TOKEN”,“expires_in”:7200}

错误时返回

{“errcode”:40013,“errmsg”:“invalid appid”}

access_token 的存储与更新

access_token 的存储至少要保留 512 个字符空间;
access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;建议开发者使用中控服务器统一获取和刷新 access_token,其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致 access_token 覆盖而影响业务;access_token 的有效期通过返回的 expire_in 来传达,目前是7200秒之内的值,中控服务器需要根据这个有效时间提前去刷新。在刷新过程中,中控服务器可对外继续输出的老 access_token,此时公众平台后台会保证在5分钟内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token 的接口,这样便于业务服务器在API调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。

后台代码

	/**
     * 微信小程序管理后台APPID
     */
	@Value("${spring.wx.appId}")
    private String AppId;
	
	/**
     * 微信小程序管理后台凭证密钥AppSecret
     */
    @Value("${spring.wx.appSecret}")
    private String AppSecret;

 	/**
     * getAccessToken接口地址---https://api.weixin.qq.com/cgi-bin/token
     */
    @Value("${spring.wx.getAccessToken}")
    private String getAccessToken;

	/**
     * redis文件夹名称
     */
    @Value("${spring.wx.redisFolderName}")
    private String redisFolderName;
    
    /**
     * redis Token分层文件夹名称
     */
    private static final String weChatAccessToken="weChat_access_token";
    
    @Autowired
    private RedisTemplate redisTemplate;
    
	/**
     * 方法--获取token
     * @return  String
     */
    public String  getToken(){
        //获取接口访问令牌
        String access_token = null;
        //拼装redis文件夹名称,并获取redis中的值
        Boolean hasKey=redisTemplate.hasKey(redisFolderName+weChatAccessToken);
        if(hasKey){
            //有参数
            access_token=(String)redisTemplate.opsForValue().get(redisFolderName+weChatAccessToken);
        }else {
            try{
                //无参数-访问第三方接口重新获取,调用getTokenFromWeChat方法
                AccessTokenObject accessTokenObject = getTokenFromWeChat();
                //获取到的凭证
                access_token=accessTokenObject.getAccess_token();
                //凭证有效时间,单位:秒。目前是7200秒之内的值。
                Long expires_in=accessTokenObject.getExpires_in();
                //redis新增WeChatAccessToken
                //将获取到的凭证存放在redis中,有限期就是expires_in
                redisTemplate.opsForValue().set(redisFolderName+weChatAccessToken, access_token, expires_in, TimeUnit.SECONDS);
            }catch (Exception e){
                logger.error("远程获取微信访问令牌失败!");
            }
        }
        return access_token;
    }
    
	/**
     * 工具--微信接口重新获取token
     * @return  AccessTokenObject
     */
    private AccessTokenObject getTokenFromWeChat() {
        AccessTokenObject token = null;
        //getAccessToken接口URL
        String url = getAccessToken + "?grant_type=client_credential&appid=" + AppId + "&secret=" + AppSecret;
        JSONObject result = ConnectUtil.HttpGet(url);
        if (result != null) {
            try {
                token = new AccessTokenObject();
                String access_token=result.getString("access_token");
                Long expires_in=result.getLong("expires_in");
                token.setAccess_token(access_token);
                token.setExpires_in(expires_in);
            } catch (Exception e) {
                token = null;
                e.printStackTrace();
                logger.error("远程获取微信访问令牌失败!");
            }
        } else {
            token = null;
            // 获取token失败
            logger.error("result为空,远程获取微信访问令牌失败");
        }
        return token;
    }

你可能感兴趣的:(小程序,微信,java,小程序)