精华内容
下载资源
问答
  • 问题:access_token与refresh_token之为什么要用refresh_token刷新不重新获取access_token?   网上挺多回答的,但是我都觉得不是很满意,所以我就自己总结了一下;   原因是access_token只保存2个小时,而refresh_...

    作为一个小白,在做微信第三方登录的时候遇到的一些问题总结了一下:

    问题:access_token与refresh_token之为什么要用refresh_token刷新不重新获取access_token?

     

    网上挺多回答的,但是我都觉得不是很满意,所以我就自己总结了一下;

     

    原因是access_token只保存2个小时,而refresh_token保存30天;

    当access_token在登录2个小时后过期了,难道就要用户在重新登录吗?

    当然不可能,这个时候refresh_token就有用武之地了;

     

    那又有同学问了,那我直接重新访问

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

    不就能获取access_token了吗?为什么要用refresh_token刷新?

     

    那么重点就来了,上面的访问路径需要参数code,而code是一次性的参数,就是用一次之后就没用了的,需要重新获取,而重新获取就需要用户再一次扫码或者账号登录才能获取code,所以到这里应该就能明白为什么要用refresh_token刷新而不是重新用code来获取access_token了;

     

    说道这有些不细心的同学就要问了,怎么用refresh_token进行刷新,其实官网上是有的,但是我还是在这里简单的讲述一下吧;

     

    请求一下链接进行refresh_token刷新:

    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

     

    必要的参数说明:

    appid:唯一的标识

    grant_type:填refresh_token(就这几个英文字母,就是这个类型)

    refresh_token:填写code获取access_token时获取到的refresh_token;

     

    有不理解的可以在评论与我讨论;

    有说错的请前辈在评论里指教;


    展开全文
  • 小程序如何获取access_token

    千次阅读 2019-01-10 16:09:55
    小程序如何获取access_token 首先:获取access_token需要小程序的appid和AppSecret,这个可以通过“小程序公众平台——开发——开发设置”查到 如下,在需要access_token的地方,请求get_access_token()接口,该...

    小程序如何获取access_token

    首先:获取access_token需要小程序的appid和AppSecret,这个可以通过“小程序公众平台——开发——开发设置”查到

    如下,在需要access_token的地方,请求get_access_token()接口,该接口查询数据库是否有未过期的access_token,有的话就返回,没有的话请求 getAccessToken()这个接口获取新的access_token,并返回。

    public static function getAccessToken($routineAppId = '',$routineAppSecret = ''){
        $routineAppId = SystemConfig::getValue('routine_appId');
        $routineAppSecret = SystemConfig::getValue('routine_appsecret');
        $url  ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$routineAppId."&secret=".$routineAppSecret;
        return json_decode(self::curlGet($url),true);
    }
    
    
    public static function get_access_token(){
        $accessToken = db('routine_access_token')->where('id',1)->find();
        if($accessToken['stop_time'] > time()) return $accessToken['access_token'];
        else{
            $accessToken = self::getAccessToken();
            if(isset($accessToken['access_token'])){
                $data['access_token'] = $accessToken['access_token'];
                $data['stop_time'] = bcadd($accessToken['expires_in'],time(),0);
                db('routine_access_token')->where('id',1)->update($data);
            }
            return $accessToken['access_token'];
        }
    }
    
    展开全文
  • 微信企业号之获取access_token

    千次阅读 2018-12-05 08:29:30
    获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。因此开发者,在使用业务接口前,要明确access_token的颁发来源,使用...

    一.前言

    获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。因此开发者,在使用业务接口前,要明确access_token的颁发来源,使用正确的access_token。

    二.使用流程

    请求方式: GET(HTTPS)
    请求地址: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRECT
    注:此处标注大写的单词ID和SECRET,为需要替换的变量,根据实际获取值更新。其它接口也采用相同的标注,不再说明。

    参数 必须 说明
    corpid 企业ID,获取方式参考:术语说明-corpid
    corpsecret 应用的凭证密钥,获取方式参考:术语说明-secret
    权限说明:

    每个应用有独立的secret,所以每个应用的access_token应该分开来获取

    返回结果:
    {
       "errcode": 0"errmsg": "ok""access_token": "accesstoken000001",
       "expires_in": 7200
    }
    
    参数说明:
    参数 说明
    errcode 出错返回码,为0表示成功,非0表示调用失败
    errmsg 返回码提示语
    access_token 获取到的凭证,最长为512字节
    expires_in 凭证的有效时间(秒)
    注意事项:

    开发者需要缓存access_token,用于后续接口的调用(注意:不能频繁调用gettoken接口,否则会受到频率拦截)。当access_token失效或过期时,需要重新获取。

    access_token的有效期通过返回的expires_in来传达,正常情况下为7200秒(2小时),有效期内重复获取返回相同结果,过期后获取会返回新的access_token。
    由于企业微信每个应用的access_token是彼此独立的,所以进行缓存时需要区分应用来进行存储。
    access_token至少保留512字节的存储空间。
    企业微信可能会出于运营需要,提前使access_token失效,开发者应实现access_token失效时重新获取的逻辑。

    展开全文
  • 1.access_token是公众号的全局唯一接口...根据文档的指示,我们的access_token的需求如下:单一获取和刷新access_token的值,全局保存,用到的都去这个地方去拿。定时去刷新(现在是2个小时刷新一次)2.我们使用redis...

    1.access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token,所以这个数据是非常的重要的,首先阅读以下微信开发文档,对于access_token是这样写的。


    根据文档的指示,我们的access_token的需求如下:单一获取和刷新access_token的值,全局保存,用到的都去这个地方去拿。定时去刷新(现在是2个小时刷新一次)

    2.我们使用redis来全局缓存access_token的值,需要用到access_token的时候就去redis当中去取。并且,这个值每两个小时刷新一次。

        //刷新access_token 100分钟刷新一次,服务器启动的时候刷新一次(access_token有效期是120分钟,我设置的是每100分钟刷新一次)
        @Scheduled(initialDelay = 1000, fixedDelay = 100*60*1000)
        public void get_access_token() {
            try {
                String appid = "填上你公众号的appid";
                String appsecret = "填上你公众号的appsecret";
                String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
                requestUrl = requestUrl.replace("APPID",appid).replace("APPSECRET",appsecret);
                JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl,"GET",null);
                if(jsonObject.getString("access_token")!=null){
                    Jedis jedis = jedisPool.getResource();
                    try {
                        Map<String,String> map = new HashMap<String,String>();
                        map.put("access_token",jsonObject.getString("access_token"));
                        jedis.hmset(appid, map);
                    } catch(Exception e){
                        if(jedis != null){
                            jedis.close();
                            jedis = null;
                        }
                        e.printStackTrace();
                    } finally {
                        if(jedis != null){
                            jedis.close();
                        }
                    }
                }
                else{
                    logger.info("定时刷新access_token失败,微信返回的信息是"+jsonObject.toJSONString());
                }
            }
            catch (Exception e){
                logger.info("更新access_token的过程当中发生了异常,异常的信息是"+e.getMessage());
            }
        }
        /**
         * 发送https请求
         *
         * @param requestUrl    请求地址
         * @param requestMethod 请求方式(GET、POST)
         * @param outputStr     提交的数据
         * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
         */
        public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
            JSONObject jsonObject = null;
            try {
                // 创建SSLContext对象,并使用我们指定的信任管理器初始化
                TrustManager[] tm = {new MyX509TrustManager()};
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
                // 从上述SSLContext对象中得到SSLSocketFactory对象
                SSLSocketFactory ssf = sslContext.getSocketFactory();
    
                URL url = new URL(requestUrl);
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                //HttpURLConnection  con= url.openConnection();
                conn.setSSLSocketFactory(ssf);
                //2017年9月15日16:21:40
                //新设置的,可能是一直在链接导致的程序死亡
                conn.setConnectTimeout(10 * 1000);
                conn.setReadTimeout(50 * 1000);
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                // 设置请求方式(GET/POST)
                conn.setRequestMethod(requestMethod);
    
                // 当outputStr不为null时向输出流写数据
                if (null != outputStr) {
                    OutputStream outputStream = conn.getOutputStream();
                    // 注意编码格式
                    outputStream.write(outputStr.getBytes("UTF-8"));
                    outputStream.close();
                }
    
                // 从输入流读取返回内容
                InputStream inputStream = conn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String str = null;
                StringBuffer buffer = new StringBuffer();
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }
    
                // 释放资源
                bufferedReader.close();
                inputStreamReader.close();
                inputStream.close();
                inputStream = null;
                conn.disconnect();
    
                jsonObject = JSONObject.parseObject(buffer.toString());
            } catch (ConnectException ce) {
                System.out.println("连接超时:{}" + ce);
            } catch (Exception e) {
                System.out.println("https请求异常:{}" + e);
                //log.error("https请求异常:{}", e);
            }
            return jsonObject;
        }
    public class MyX509TrustManager implements X509TrustManager {
    
        // 检查客户端证书
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
    
        // 检查服务器端证书
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
    
        // 返回受信任的X509证书数组
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }

    其中jedisPool的配置如下:

        @Value("${spring.redis.host}")
        private String host;
    
        @Value("${spring.redis.port}")
        private int port;
    
        @Value("${spring.redis.timeout}")
        private int timeout;
    
        @Value("${spring.redis.poolMaxIdle}")
        private int maxIdle;
    
        @Value("${spring.redis.poolMaxWait}")
        private long maxWaitMillis;
    
        /*@Value("${spring.redis.password}")
        private String password;*/
    
        @Bean
        @Scope("singleton")
        public JedisPool redisPoolFactory() {
            System.out.println("jedispool");
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxIdle(maxIdle);
            jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
            JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, null);
            logger.info("host:"+host);
            logger.info("port:"+port);
            logger.info("timeout:"+timeout);
            return jedisPool;
        }

    这样,我们就把access_token全局进行了缓存,在其他需要使用到access_token的时候,就去redis当中获取数据,调用其他的接口。我们满足了微信开发文档的三点要求

    1.全局唯一获取刷新access_token ,全局缓存,需要的都去redis当中去取。

    2.定时刷新access_token,不会出现access_token过期的情况

    3.access_token有效时间可能会在未来有调整,到时候我们只需要改一下定时器的时间即可。



    展开全文
  • oauth2使用password模式获取access_token

    万次阅读 2018-05-21 11:06:58
    oauth2获取access_token的几种方式:   简化模式(implicit):在redirect_url中传递access_token,oauth客户端运行在浏览器中。 密码模式(password):将用户名和密码传过去,直接获取access_token。 客户端...
  • 一、微信公众号获取 access_token access_token 是微信调用接口全局唯一的凭据。它的特点是唯一的,有效期为2 小时,提前 5分钟请求,接口权限,每天 2000 次。它的请求地址是 https请求方式: GET ...
  • 微信获取 access_token

    千次阅读 2016-05-26 10:04:03
    相关知识微信公众账号开发时,常常需要获取access_token(入口权限),有了access_token(入口权限),才能获取用户信息,调用微信接口;微信为我们提供了两种access_token,页面授权access_token和基础access_token...
  • 今天在做一个扫描微信公众号带参数二维码的时候我首先通过:"...; 获取access_token"... 获取 用户信息但是在获取用户信息的时候出现了 invalid credential, access_token is invalid or no...
  • 如何获取access_token

    千次阅读 2018-04-12 19:20:32
    access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token,那怎么获取access_token首先定义APPID和APPSECRET然后定义一个access_token函数判断是否存在该文件,如果存在,就读取并取出...
  • 1.获取access_token 在开始之前还是有必要啰嗦啰嗦,什么时access_token? 官方文档介绍:access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存...
  • 获取access_token的中控服务器

    千次阅读 2018-07-18 18:13:15
    access_token 是全局唯一接口调用凭据,...access_token 的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取access_token 失效。 获取 access_token 公众平台的 API 调用所需的 access_token 的使用及...
  • MVC 微信公众号 获取 access_token

    千次阅读 2016-09-21 16:37:00
    官方文档说明:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN 具体实现方法如下: 类WXApi.cs: ... #region 获取access_token /// /// 获取access_token ///
  • java版实时获取access_token

    万次阅读 多人点赞 2016-05-10 21:05:41
    java版微信公众号开发之实时获取access_token
  • 进行微信公众号相关开发,获取access_token是首要一步,因为access_token是公众号的全局唯一接口调用凭据。公众号调用各接口时都需使用access_tokenaccess_token的存储至少要保留512个字符空间。access_token的...
  • 但是我的菜单每次获取openid的时候也有一个access_token 这个openid根据OAuth2.0鉴权接口获得,我每次发送模版消息的时候都要根据access_token去发送,但是我保存在有效范围内的access_token 变成了无效 本人现在对...
  • 首先先查看微信公众技术文档之获取access_token,了解各参数含义 前提:获取到公众号的AppId和AppSecret 一、常量类 /** * 公众号相关 */ public class WechartConst { //公众号的唯一标识 public static final...
  • 如何获取access_token

    千次阅读 2018-04-13 10:03:07
    access_token是公众号的全局...access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取access_token失效。公众平台的API调用所需的access_token的使用及生成方式说明:1、建议公众号开发者使用...
  • 微信公众号开发(三)获取access_token 1、说明 access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。...
  • 微信小程序nodejs获取access_token

    千次阅读 2018-04-12 18:28:39
    获取access_token说明 官方文档说明 access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token...
  • 通过阅读微信开发者文档会发现——>access_token是公众号的全局唯一接口...access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取access_token失效。 在获取access_token时使用的是get请求,那么也
  • 微信公众号开发时获取access_token

    千次阅读 2018-09-21 20:19:44
    今天整了好长时间一直报 code=40001 原因是:获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口 唉!心累 原来官方在...
  • 服务器(122.191.254.34)部署了微信获取access_token,但是无法获取access_token,发现返回的是122.191.254.18 不在白名单,错误信息:"errcode":40164,"errmsg":"invalid ip 122.191.254.18, not in whitelist ...
  • 获取access_token access_token 作为微信接口全局访问的唯一调用凭据 ,公众号调用各个接口时候都需要使用access_tokenaccess_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时...
  • 企业微信API-https请求模板-获取access_token-Java

    千次阅读 多人点赞 2021-02-18 13:54:59
    本文主要介绍,如何使用Java代码,发起企业微信API支持的HTTPS请求,获取access_token
  • oauth2获取access_token的几种方式: 简化模式(implicit):在redirect_url中传递access_token,oauth客户端运行在浏览器中。 密码模式(password):将用户名和密码传过去,直接获取access_token。 客户端模式...
  • java 微信公众平台之获取access_token

    千次阅读 2017-11-10 15:24:36
    获取access_token: 公众号可以使用AppID和AppSecret调用接口来获取access_token http请求方式: GET ..._type/** * 获取access_token * access_token_url = "https://api.weixin.
  • 获取 access_token获取 openid 方式一样具体如下: 小程序实现 本地不需要传递任何参数 wx.request({ var serverUrl = 'getAccessToken.php'; url: serverUrl, method: 'GET', dataType: 'json'...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 127,330
精华内容 50,932
关键字:

如何获取access_token