浅谈企业微信中AccessToken管理和API操作

企业微信 创建应用后如何构造网页授权 获取token 获取用户信息 第一次对接企业微信,上网找了各种方案。目的是在企业微信中,公司发给员工一个地址,员工点开后打开画面,在这个画面上可以获取到这个员工的userid(后续功能操作就是各自不同的功能了哈,就不详细说了)。然后根据官网内容,分析了一下,我需要连接官网的【构造网页授权】【获取token】【获取用户信息】。然后调查了别人怎么写,查来查去除了写内容,还需要一些配置。前端使用的vue的uniapp框架。后台使用Java。如果符合你现在的需求,可以参照下面的方法~ ^-^~ 阅读详情

前言

众所周知,在微信公众平台开发中,其实就是一系列的API请求和自身业务系统的集成,而在API请求中,AccessToken是优势一个必不可少的参数。

注:

  • 本文基于企业微信,故部分API请求可能和订阅号,服务号,小程序不太相同,但整体思路一致。
  • 本项目代码基于Java语言,SpringBoot框架。

在企业微信开发文档中有这样一段:

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

需要注意的点:

  • 在有效期内,重复获取不会返回新的AccessToken,并且不会延长有消息。(即使不在同一个程序内获取)
  • AccessToken可能会提前过期。(两个小时获取一次可能会出现提前过期的问题)

问题描述

原始方案:
V0.1 定时器(schedule)
描述:在SpringBoot项目中,使用@Scheduled注解,每一小时获取一次AccessToken。
问题:在运行一段时间后,因网络波动导致某次请求失败,程序出错,定时器没有继续执行。
影响:程序无法进行任何微信相关的API请求。
改进:V0.2 定时器+异常捕获
V0.2 定时器+异常捕获
描述:在上述版本的情况下,增加异常捕获。
问题:运行一段时间再次出现异常,程序在获取AccessToken过程中出现阻塞,后续代码均未执行,定时器也无法执行。

	影响:两次带来的影响都是致命的,犹如定时炸弹,完全不清楚下次会何时继续出现。

改进方案

这里写图片描述

总结:

此方案的优点在于,程序无需通过定时器或线程去处理AccessToken,通过Redis的缓存,并设置过期时间,实现动态的管理,并能和其他程序共享AccessToken(对于多个程序需要使用同一个应用时,会存在此需求)。在过期也能自动获取,并不影响程序正常运行。
即使某次请求出现问题,不会影响之后的请求。


代码展示

图中设计的几个类实现如下:

  • WorkWXAPI类:
    定义了企业微信相关的API请求的URL地址,以及其他企业微信相关的常量等。
/**
 * @Author: geekfly
 * @Description:  企业微信相关API及常量定义
 * @Date: 2017/10/12
 * @Modified By:
 */
public class WorkWXAPI {

    public static String CORPID = ""; //企业ID
    public static Integer AGENTID = 1000017; //应用ID
    public static String AUTH_APP_SECRET = ""; //应用1Secret
    public static String CONTACTS_SECRET = ""; //应用2Secret
    public static String TOKEN = ""; //API接收Token
    public static String EncodingAESKey = "";//API接收EncodingAESKey

    public static String GET_ACCESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
    public static String GET_USER_OPENID_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=%s&code=%s";
    public static String SEND_MESSAGE_URL = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s";
    public static String GET_USER_INFO = "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s";


    //标签相关
    public static String TAG_ADD_USERS_URL = "https://qyapi.weixin.qq.com/cgi-bin/tag/addtagusers?access_token=%s";
    public static String TAG_DELETE_USERS_URL = "https://qyapi.weixin.qq.com/cgi-bin/tag/deltagusers?access_token=%s";

    /*
       成员管理
     */
    //获取部门成员
    public static String CONTACTS_SIMPLE_LIST = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=%s&department_id=%s&fetch_child=%s";
    //获取部门成员详情
    public static String CONTACTS_LIST = "https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=%s&department_id=%s&fetch_child=%s";
    //更新成员
    public static String CONTACTS_UPDATE= "https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token=%s";
    //创建成员
    public static String CONTACTS_CREATE = "https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token=%s";
    //读取成员
    public static String CONTACTS_GET = "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s";


    /*
    部门管理
     */
    //创建部门
    public static String DEPARTMENT_CREATE = "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=%s";
    //更新部门
    public static  String DEPARTMENT_UPDATE = "https://qyapi.weixin.qq.com/cgi-bin/department/update?access_token=%s";
    //获取部门列表
    public static String DEPARTMENT_LIST = "https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=%s&id=%s";

    //js api
    public static String JS_API = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=%s";

    //认证通过
    public static String AUTH_SUCCESS = "https://qyapi.weixin.qq.com/cgi-bin/user/authsucc?access_token=%s&userid=%s";

    //不同身份人员所在部门ID
    public static Integer DEPARTMENT_JZG_ID_OTHER = 4658;    //教师(其他)
    public static Integer DEPARTMENT_JZG_ID = 2638;    //教师(新)

    public static Integer DEPARTMENT_NO_AUTH = 1889; //未认证用户部门
    public static Integer DEPARTMENT_ROOT = 1; //根部门ID

    //菜单ID
    public static String MENU_ID_USER_INFO = "user_info"; //个人信息
    public static String MENU_ID_USER_BIND = "user_bind"; //身份认证

}

注:代码使用String.format进行占位符替换,使用时需注意参数的顺序,以免因替换出错导致的传参错误。

  • WXAPIUtil类
    WXAPIUtil为封装的企业微信相关API操作的类,如:获取AccessToken获取,更新,删除用户信息,获取,创建,更新部门信息等。
/**
 * @Author geekfly
 * @Date 2018/1/17 9:28
 * @Desc 微信API帮助类
 */
public class WXAPIUtil {

    private final static Logger logger = LoggerFactory.getLogger(WXAPIUtil.class);

    private static String accessTokenAuth = "access_token:auth";

    private static String accessTokenContacts = "access_token:contacts";

    /**
     * 获取access token
     * @param key 根据此key获取
     * @return
     */
    public static Map<String, Object> getAccessToken(String key){
        String secret = "";
        if(key == accessTokenAuth){
            secret = WorkWXAPI.AUTH_APP_SECRET;
        }else if(key == accessTokenContacts){
            secret = WorkWXAPI.CONTACTS_SECRET;
        }
        String json = HttpClientUtil.get(String.format(WorkWXAPI.GET_ACCESS_TOKEN_URL, WorkWXAPI.CORPID, secret));
        Map<String, Object> data = JsonUtil.WXJsonToMap(json);
        if (Integer.parseInt(data.get("errcode").toString()) == 0) {
            return  data;
        } else {
            logger.info("{} get access error,msg:{}", key, data.toString());
        }
        return null;
    }

    /**
     * 根据code获取用户信息
     * @param code
     * @return
     */
    public static Map<String, Object> getOpenId(String code){

       return HttpClientUtil.wxRequest(accessTokenAuth, String.format(WorkWXAPI.GET_USER_OPENID_URL, accessTokenAuth, code)
                , null, HttpClientUtil.METHOD_GET);
    }

    /**
     * 根据UserId获取用户信息
     * @param userId
     * @return
     */
    public static Map<String, Object> getContact(String userId){

        return HttpClientUtil.wxRequest(accessTokenContacts, String.format(WorkWXAPI.CONTACTS_GET, accessTokenContacts, userId)
                , null, HttpClientUtil.METHOD_GET);
    }
 }

注:因代码过长,此处只引入部门函数。

  • HttpClientUti类
    包括Get,Post,wxRequest方法,可执行普通的http请求。
package cn.edu.zut.wechat.utils;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @Author: geekfly
 * @Description: HttpClient工具类,用于发送请求
 * @Date: 2017/10/12
 * @Modified By:
 */
@Component
public class HttpClientUtil {

    private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);

    public static String METHOD_GET = "Get";

    public static String METHOD_POST = "Post";

    private static StringRedisTemplate stringRedisTemplate;

    public static void setStringRedisTemplate(StringRedisTemplate template) {
        stringRedisTemplate = template;
    }

    /**
     * 执行企业微信接口方法
     * @param key AccessToken的key值
     * @param url 接口地址
     * @param json json数据
     * @param method 请求方式 Get or Post
     * @return
     */
    public static Map<String, Object> wxRequest(String key, String url, String json, String method){
        Map<String, Object> mapData = new HashMap<>();
        try{
            int num = 0;
            boolean flag = false;
            while(num < 3){
                num++;
                if(stringRedisTemplate.hasKey(key)){
                    url = url.replace(key, stringRedisTemplate.opsForValue().get(key));
                    String jsonData = null;
                    logger.info(stringRedisTemplate.opsForValue().get(key));
                    if(method.equals(METHOD_GET)){
                        jsonData = get(url);
                    }else if(method.equals(METHOD_POST)){
                        jsonData = post(url, json);
                    }
                    mapData = JsonUtil.toMap(jsonData);
                    int errCode = Integer.parseInt(mapData.get("errcode").toString());
                    if(errCode == 0){ //正常
                        return mapData;
                    }else if(errCode == 42001){ // access_token过期
                        stringRedisTemplate.delete(key); //删除key
                        logger.info("key:{},access token过期", key);
                    }else{
                        flag = true;
                        logger.info("key:{},url:{},json:{},method:{},msg:{}", key, url, json, method, jsonData);
                    }
                }
                if(flag == false){
                    mapData = WXAPIUtil.getAccessToken(key);
                    if(mapData != null){
                        stringRedisTemplate.opsForValue().set(key, mapData.get("access_token").toString(),
                                Integer.parseInt(mapData.get("expires_in").toString()), TimeUnit.SECONDS);
                    }
                }
            }
        }catch (Exception ex){
            ex.printStackTrace();
            logger.error("wxRequest error:{}", ex.getMessage());
        }
        mapData.put("errcode", -1000);
        mapData.put("errmsg", "未获取到信息");
        return mapData;
    }

    public static String get(String url){
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        HttpResponse response = null;
        try{
            response = httpClient.execute(httpGet);
        }catch (Exception e) {}
        String temp="";
        try{
            HttpEntity entity = response.getEntity();
            temp= EntityUtils.toString(entity,"UTF-8");
        }catch (Exception e) {}

        return temp;
    }

    public static String post(String url, String json){
        HttpClient httpClient = null;
        HttpPost httpPost = null;
        String result = null;
        try{
            httpClient = new DefaultHttpClient();
            httpPost = new HttpPost(url);

            StringEntity entity = new StringEntity(json,"utf-8");//解决中文乱码问题
            entity.setContentEncoding("UTF-8");
            entity.setContentType("application/json");
            httpPost.setEntity(entity);
            HttpResponse response = httpClient.execute(httpPost);
            if(response != null){
                HttpEntity resEntity = response.getEntity();
                if(resEntity != null){
                    result = EntityUtils.toString(resEntity);
                }
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return result;
    }
}

核心方法为:wxRequest

其中StringRedisTemplate在主函数中注入

	public static void main(String[] args) {
		ConfigurableApplicationContext applicationContext = SpringApplication.run(WechatApplication.class, args);

		HttpClientUtil.setStringRedisTemplate(applicationContext.getBean(StringRedisTemplate.class));
	}

	@Bean
	StringRedisTemplate template(RedisConnectionFactory connectionFactory){
		return new StringRedisTemplate(connectionFactory);
	}

Controller中调用如下:

Map<String, Object>  jsonMap = WXAPIUtil.updateContact(JsonUtil.toJson(wxUser));
package cn.edu.xxx.wechat.utils;

import com.alibaba.fastjson.JSON;

import java.util.List;
import java.util.Map;

/**
 * @Author: hanyunfei
 * @Description: Json 工具类
 * @Date: 2017/10/12
 * @Modified By:
 */
public class JsonUtil {
	/**
	 * 对象转Json
	 * @param object
	 * @return 转化后的Json字符串
	 */
	public static String toJson(Object object){
		String string = null;
		try {
			string = JSON.toJSONString(object);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return string;
	}
	
	/**
	 * 普通Json字符串转Map
	 * @param json
	 * @return 转化后的Map
	 */
	public static Map<String, Object> toMap(String json){
		return JSON.parseObject(json, Map.class);
	}

	/**
	 * 微信接口返回Json字符串转Map(考虑版本区别,需判断是否有errcode)
	 * @param json
	 * @return 转化后的Map
	 */
	public static Map<String, Object> WXJsonToMap(String json){
		Map<String, Object> map =  JSON.parseObject(json, Map.class);
		if(!map.containsKey("errcode")){ //如果不存在errcode键,则添加该键
			map.put("errcode", 0);
		}
		return map;
	}

	public static <T> T toBean(String text, Class<T> clazz) {
		return JSON.parseObject(text, clazz);
	}

	public static <T> List<T> toList(String text, Class<T> clazz) {
		return JSON.parseArray(text, clazz);
	}

	public static void main(String[] args) {
		String json = "{\"errcode\": 0,\"errmsg\": \"ok\",\"userid\": \"zhangsan\",\"name\": \"李四\",\"department\": [1, 2],\"order\": [1, 2],\"position\": \"后台工程师\",\"mobile\": \"15913215421\",\"gender\": \"1\",\"email\": \"zhangsan@gzdev.com\",\"isleader\": 1,\"avatar\": \"http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0\",\"telephone\": \"020-123456\",\"english_name\": \"jackzhang\",\"extattr\": {\"attrs\":[{\"name\":\"爱好\",\"value\":\"旅游\"},{\"name\":\"卡号\",\"value\":\"1234567234\"}]},\"status\": 1,\"qr_code\":\"https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx\"\"external_profile\": {\"external_attr\": [{\"type\": 0,\"name\": \"文本名称\",\"text\": { \"value\": \"文本\"}},{\"type\": 1,\"name\": \"网页名称\",\"web\": { \"url\": \"http://www.test.com\", \"title\": \"标题\"}},{\"type\": 2,\"name\": \"测试app\",\"miniprogram\": { \"appid\": \"wx8bd80126147df384\", \"pagepath\": \"/index\", \"title\": \"my miniprogram\"}}]}";
		System.out.println(JsonUtil.toMap(json));

	}
}

企微获取access_token、jsapi_ticket、JS-SDK-signature 本篇主要叙述Java对接企微必要信息等,后续接口根据各接口需求来获取企微必要信息(access_token、jsapi_ticket等),此处附上。 阅读详情

相关推荐

企业access_token,与用户access_token区别,获取方式,如何获取用户信息

用于调用企业级 API,通过企业 ID 和应用 Secret 获取。

C18298182575的博客 2142

微信企业号开发Access_token的生命周期测试以及Js_ticket生命周期的测试

Access_token 官方文档的描述是有效期2小时,其实如果在这个有效期内再次调用,其有效期延长至4小时。举例说明:8点钟系统第一次调用接口申请该参数得到A,如果在有效期8:00-10:00期间内再次调用接口,则返回的还是A,但是A的有效期向后延长2小时,为8:00-12:00期间A都有效,但是在10:00后再次调用接口就不会返回A了,会返回B,在10:00-12:00期间会存在两个有效的Ac...

New_Yao的博客 2914

企业微信三方开发(二):获取access_token及授权配置

前言 在上一篇文章中我们已经为企业安装好了应用并获取到了两个重要的参数:suite_ticket 和 auth_code。如果要通过应用获取授权企业的基本信息和使用企业微信的一些接口,我们需要先获得一些必要的 access_token。 access_token(访问凭证),顾名思义:是你访问企业微信后台的通行证。 微信的所有开发开发通常都是以获取token开始的。 企业微信三方开发要获取三种类型的access_token: 类型 说明 适用场景 服务商的token 以corpid(服务商C

YNEWA的博客 8720

微信小程序消息提醒服务

import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUt...

qq1234543219的博客 2550

BMS短路测试避坑指南:从炸管到稳定,我是如何搞定MOS管和TVS的

本文详细记录了BMS短路测试中MOS管和TVS的优化过程,从驱动电阻调整、PCB寄生参数控制到TVS选配策略,提供了一套实用的调试方法论。通过实战案例解析,帮助工程师避免常见陷阱,实现稳定可靠的短路测试性能。

weixin_30652897的博客 140

【三维重建】基于多视角图像的三维重建

基于多视角图像的三维重建》

m0_64446860的博客 8761

党费收缴管理系统(十) 企业微信AccessToken以及Ticket缓存的方法

不管是企业微信还是微信对于AccessToken还是Ticket都有有效期的概念, 7200秒,官方文档说得很清楚,要求开发者自行设计缓存的机制了.我的思路是将token组成json字符串。Token文件保存到服务器上指定的目录,我存在 c:\cacheFile ,注意发布到服务器上的时候需要给这个目录写入的权限, 不想折腾就给everyone读写权限了.5. 如果没有超时,那么就直接返回token了. 实际过程我是将时间差缩小到7000, 在没有到超时前就去接口拿最新的.

morsth的博客 544

uniapp无感刷新token实现过程

可以看到已经触发了刷新token接口,并且重新请求上次失败的列表接口,无感刷新token逻辑已经正常,但为什么列表接口请求成功,还一直loading没关闭捏,就是因为后续代码未执行,await接口的返回没有成功resolve。路漫漫其修远兮,前端道路逐渐迷茫,时隔好久好久终于想起了我还有一个小博客,最近在一直在弄uniapp,属实有被恶心到,但也至少会用了,最近实现了一个比较通用的功能,就是无感刷新token,但在过程中发现一个问题就是。3、排查await的列表接口为何没有成功resolve。

weixin_40618068的博客 3594

企业微信_获取access_token

文章目录1. 开发文档2. 管控台3. 接口文档4. 参数获取5. api调试 1. 开发文档 企业内部开发文档: https://developer.work.weixin.qq.com/document/path/91039 2. 管控台 企业微信管控台: https://work.weixin.qq.com/wework_admin/frame#apps 3. 接口文档 获取access_token接口文档 4. 参数获取 corpid->获取企业ID corpsecret->应用se

Gblfy_Blog 6839

具身智能四大技术路线:VLA、大小脑、世界模型与强化学习

具身智能是机器人实现感知-决策-执行闭环的核心范式,其本质在于物理世界中的具身化交互能力。技术演进围绕如何高效建模环境、理解指令并生成鲁棒动作展开,衍生出四大主流路径:视觉-语言-动作(VLA)端到端学习、大小脑分层控制、世界模型驱动预测,以及强化学习原生策略优化。VLA强调多模态对齐与泛化能力,适合语义理解优先场景;大小脑架构兼顾实时性与可解释性,是工业落地的高可靠选择;世界模型追求内在物理模拟,代表长期认知跃迁方向;强化学习则扎根仿真试错,在力控、抓取等连续控制任务中展现强鲁棒性。本文聚焦这四大路线的技

weixin_32181267的博客 296

rv1126 SDK编译【2020-0912版本SDK包】

rv1126 sdk 编译

学习记录 1万+

企业微信token有效期每次都是7200秒,难道不刷新么?困扰我很久了?

如题,企业微信的access_token获取结果不同于微信公众号。即:微信公众号每次获取后,之前的token就会自动失效。而企业微信不同,它获取之后,在有效期内(同微信公众号一样,也是7200秒),再次获取时还是这个token值。那么问题来了,如果每次过期前(比如7100秒时)就刷新一下,又延长了2个小时的有效期,这样的话这个token值就会永远不变么?显然又不是这样,有时获取的时还会随时变化。所以这和获取之后的“”值又相矛盾,求解惑。

C18298182575的博客 1446

标准论文参考文献添加方法——Zotero入门使用教程

第一篇论文投出去了,写一下最后一步的参考文献修饰润色吧! 论文的参考文献,即References,是论文的最后一步,相信不管是写毕设论文还是期刊论文都遇到过需要修改参考文献的情况,非常之麻烦。而且参考文献中经常会与生僻奇怪气体出现,一个一个修改非常浪费时间,这里介绍一下一个非常好用的软件Zetero。 第一步:软件的下载安装及绑定Word 尽量使用客户端吧,

MISAYAONE的博客 20万+

【企业微信对接】常用接口

【企业微信对接】常用接口,保姆级中的保姆级。有企业微信token获取、根据手机号码查询企业微信ID、企业微信消息推送

qq_37777316的博客 5564

Dify 第 13 篇 Dify 工作流 详解

工作流通过将复杂任务分解为节点降低复杂度,提升LLM应用的性能和稳定性。Dify工作流分为两类:Chatflow面向对话场景(如客服),支持多轮对话;Workflow面向批处理场景(如翻译),提供逻辑节点实现自动化。核心概念包括节点、变量(系统/会话/环境变量)及应用类型差异:Chatflow支持中间输出和对话历史,Workflow仅支持结束节点输出。系统变量以"sys"开头,用于全局数据传递,不同应用类型变量不同,如Chatflow的sys.query存储用户输入,Workflow的s

甘蓝的专栏 3248

dify安装ollama插件及OLLAMA模型添加失败问题完整解决方法

plugin_daemon-1 | 2025/05/10 17:37:36 stdio.go:160: [INFO]plugin langgenius/ollama:0.0.6: Installed model: ollama 提示ollama安装成功,再添加模型就不会有问题了。安装dify1.2.0和1.3.1均出现OLLAMA插件安装失败或插件安装后添加模型失败的问题,具体表现为一是添加ollama插件时没反应,需要二次添加才成功;二是添加模型时点保存报500错误或点保存后没反应,无法成功添加。

symstandsun的博客 9080

企业微信应用开发(API信息获取---access_token获取)

一:开发前提 进行企业微信的开发,首先需要是管理员身份,方便所需ID的获取 进入企业微信后台的方式有两种, 第一种:登录电脑版本的企业微信,如果是管理员身份,点击下图中图标,可以直接进入企业微信后台,并且已登录。 第二种: 官网地址:https://work.weixin.qq.com/ 登录地址:https://work.weixin.qq.com/wework_admin/...

席海斌的博客 8755

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

企业微信token及相关接口关联分析

用户级权限,只能访问授权用户的数据。access_token: 企业的 access_token,通过 corpid 和 corpsecret 获取。access_token: 企业的 access_token,通过 corpid 和 corpsecret 获取。如果用户是非企业成员(如外部联系人),返回 OpenId(用户在微信中的唯一标识)。8,企业 access_token 与用户 access_token 的区别。如果用户是企业成员,返回 UserId(用户在企业微信中的唯一标识)。

C18298182575的博客 876

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

token 登录途中自动延迟失效时间

token 登录途中自动延迟失效时间 方法一 refresh token 前端 所谓多请求,就是指在短时间内同时发生多个请求,如果此时token已经过期,那么这些请求都会出现token过期请求失败的情况。 为了避免反复刷新token,需要设置一个刷新token的开关isRefresh,当一个请求出现token过期的时候,这个时候会调用token刷新函数,与此同时关闭开关将isRefresh的值设置为false,避免后续请求去调用token刷新函数。 当发现token过期时,咱们将请求延缓到token刷新

liuhm的博客 7077

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

微信开发——如何保证access_token一直有效

1、微信开放文档对access_token的描述 access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。 1、建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自

wyzyysw的博客 9438

获取企业微信的 access_token

获取企业微信的 access_token

m0_65698359的博客 3378

token 微信access 过期_企业微信平台开发--解决access_token过期的问题

因为access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token改造一下。另外需要说明的是access_token是变化的,有自己的周期,官方解释为:"有效期为7200秒",这就要求我们把获得的access_token存入一个物理文件或者Application中,请求到过期后修改这些内容,需要用的时候读出来.有些人可能想到了,如果过期我就在获得...

weixin_39731623的博客 2391

微信服务号/企业号防止AccessToken过期的操作指南深入浅出

微信服务号/企业号防止AccessToken过期的操作指南深入浅出

Engineer-Jsp的专栏 7423

Java:获取企业微信Token

1、获取条件:企业ID、应用的凭证密钥 官方API:https://work.weixin.qq.com/api/doc/90000/90135/91039 代码: corpid:企业ID corpsecret:应用的凭证密钥 public static AccessToken getAccessToken(){ if(StringUtils.isEmpty(corpid)){...

XuJiangDong 2637

Java开发企业微信功能

Java使开发企业微信功能 1.自己注册企业微信公司和应用

qq_34960904的博客 1541

【企业微信】获取token & 发送应用消息

企业微信获取token存入redis设置时长2小时&&发送企业应用消息接口。

Dawns_1106的博客 2162
上一篇: Spring Boot项目配合Nginx发布(单IP,单域名,多项目,多端口)
下一篇: Spring Boot 在Mac平台下打包Docker镜像及Linux服务器部署与运行
geekfly
博客等级 码龄12年 149粉丝 101原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值