这里主要针对的是企业微敬佩务商代开辟模式 文档地点

可以看到内里大致有三种token,一个是服务商的token,一个是企业授权token,另有一个是应用的token
这内里主要有下面几个参数
首先是服务商的 corpid 和 provider_secret ,这个可以在 应用管理-通用开辟参数 内里查察

然后是企业的 corpid 和企业的永久授权码 permanent_code ,这两个是必要在企业授权的的时候通过回调获取的,具体请参考官方文档 获取永久授权码
最后就是应用的 suite_id 和 suite_secret 还必要一个 suite_ticket ,前面两个在应用信息内里就可以看到,suite_ticket 这个也是必要通过回调获取 ,具体参考官方文档 推送suite_ticket

拿到这些参数后就好说了,剩下的都是调接口
直接上代码
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import com.qyzj.common.base.exception.BusinessException;
- import com.qyzj.common.base.util.HttpsRequestUtil;
- import com.qyzj.common.redis.constant.CacheKey;
- import com.qyzj.common.redis.util.RedisUtil;
- import com.qyzj.service.task.constant.WeiXinProviderConst;
- import com.qyzj.service.task.constant.WeixinCorpKeyConst;
- import com.qyzj.service.task.constant.WeixinCorpUrlConst;
- import lombok.extern.java.Log;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- /**
- * @author Sakura
- * @date 2024/7/2 11:48
- */
- @Component
- @Log
- public class WxTokenUtil {
- @Autowired
- private RedisUtil redisUtil;
- // 获取服务商token
- // 这里有一个问题,企业微信本身可能会使token提前失效,所以有时需要强制重新获取token,详情见官方文档
- // https://developer.work.weixin.qq.com/document/path/91200
- // 所以此处加了一个cache用来判断是否需要走缓存拿token,正常情况默认走缓存即可
- public String getProviderAccessToken(Boolean cache) {
- try {
- // 如果Redis里面有则直接取Redis里面的
- if (cache &&redisUtil.hasKey(CacheKey.KEY_CORP_PROVIDER_ACCESS_TOKEN)) {
- return redisUtil.get(CacheKey.KEY_CORP_PROVIDER_ACCESS_TOKEN).toString();
- }
- // 封装请求参数
- JSONObject json = new JSONObject();
- json.put("corpid", WeiXinProviderConst.corpId);
- json.put("provider_secret", WeiXinProviderConst.providerSecret);
- // 请求微信接口
- String accessTokenStr = HttpsRequestUtil.sendPostRequest(WeixinCorpUrlConst.PROVIDER_ACCESS_TOKEN, json.toJSONString());
- log.info("get provider access token return :" + accessTokenStr);
- JSONObject accessTokenJson = JSON.parseObject(accessTokenStr);
- // 获取 access_token
- String accessToken = accessTokenJson.getString(WeixinCorpKeyConst.providerAccessToken);
- //官方 expires_in 为 2个小时, 这里设置100分钟
- redisUtil.set(CacheKey.KEY_CORP_PROVIDER_ACCESS_TOKEN, accessToken, CacheKey.expireTime100);
- return accessToken;
- } catch (Exception e) {
- log.info("get provider access token error");
- e.printStackTrace();
- throw new BusinessException("get provider access token error");
- }
- }
- // 获取企业授权token
- public String getCorpAccessToken(String corpId, String permanentCode) {
- try {
- // 如果Redis里面有则直接取Redis里面的
- if (redisUtil.hasKey(CacheKey.KEY_CORP_ACCESS_TOKEN + "_" + corpId)) {
- return redisUtil.get(CacheKey.KEY_CORP_ACCESS_TOKEN + "_" + corpId).toString();
- }
- String accessTokenUrl = WeixinCorpUrlConst.CORP_ACCESS_TOKEN
- .replace("#{CORP_ID}", corpId)
- .replace("#{CORP_SECRET}", permanentCode);
- String accessTokenStr = HttpsRequestUtil.sendGetRequest(accessTokenUrl);
- log.info("get corp access token return :" + accessTokenStr);
- JSONObject accessTokenJson = JSON.parseObject(accessTokenStr);
- // 获取 access_token
- String accessToken = accessTokenJson.getString(WeixinCorpKeyConst.accessToken);
- //官方 expires_in 为 2个小时, 这里设置 100 分钟
- redisUtil.set(CacheKey.KEY_CORP_ACCESS_TOKEN + "_" + corpId, accessToken, CacheKey.expireTime100);
- return accessToken;
- } catch (Exception e) {
- log.info("get corp access token error");
- e.printStackTrace();
- throw new BusinessException("get corp access token error");
- }
- }
- // SuiteTicket是通过回调获取的,企微每10分钟会推送一次
- // 如果没有可手动在服务商企业微信后台刷新
- public String getSuiteTicket() {
- // 如果Redis里面有则直接取Redis里面的
- if (redisUtil.hasKey(CacheKey.KEY_CORP_SUITE_TICKET)) {
- return redisUtil.get(CacheKey.KEY_CORP_SUITE_TICKET).toString();
- } else {
- log.info("get suite ticket error");
- throw new BusinessException("get suite ticket error");
- }
- }
- // 获取应用token
- // 注意suiteTicket是从回调接口获取的
- // 注意该token需要配置ip白名单
- public String getSuiteAccessToken() {
- try {
- // 如果Redis里面有则直接取Redis里面的
- if (redisUtil.hasKey(CacheKey.KEY_SUITE_ACCESS_TOKEN)) {
- return redisUtil.get(CacheKey.KEY_SUITE_ACCESS_TOKEN).toString();
- }
- // 封装请求参数
- JSONObject json = new JSONObject();
- json.put(WeixinCorpKeyConst.suiteId, WeiXinProviderConst.suiteId);
- json.put(WeixinCorpKeyConst.suiteSecret, WeiXinProviderConst.suiteSecret);
- json.put(WeixinCorpKeyConst.suiteTicket, getSuiteTicket());
- String accessTokenStr = HttpsRequestUtil.sendPostRequest(WeixinCorpUrlConst.SUITE_ACCESS_TOKEN, json.toJSONString());
- log.info("get suite access token return :" + accessTokenStr);
- JSONObject accessTokenJson = JSON.parseObject(accessTokenStr);
- //获取 accessToken
- String accessToken = accessTokenJson.getString(WeixinCorpKeyConst.suiteAccessToken);
- //官方 expires_in 为 2个小时, 这里设置 100分钟
- redisUtil.set(CacheKey.KEY_SUITE_ACCESS_TOKEN, accessToken, CacheKey.expireTime100);
- return accessToken;
- } catch (Exception e) {
- log.info("get suite access token error");
- e.printStackTrace();
- throw new BusinessException("get suite access token error");
- }
- }
- }
复制代码 这内里用到的 HttpsRequestUtil 工具类
- import java.io.*;
- import java.net.HttpURLConnection;
- import java.net.URL;
- /**
- * @author Sakura
- * @date 2024/6/24 17:07
- */
- public class HttpsRequestUtil {
- public static String sendPostRequest(String urlString, String jsonInputString) throws IOException {
- URL url = new URL(urlString);
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- // 设置请求方法为POST
- connection.setRequestMethod("POST");
- // 设置请求头
- connection.setRequestProperty("Content-Type", "application/json");
- connection.setRequestProperty("Accept", "application/json");
- // 启用输出流,用于发送请求数据
- connection.setDoOutput(true);
- try (OutputStream os = connection.getOutputStream()) {
- byte[] input = jsonInputString.getBytes("utf-8");
- os.write(input, 0, input.length);
- }
- // 获取响应
- try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) {
- StringBuilder response = new StringBuilder();
- String responseLine;
- while ((responseLine = br.readLine()) != null) {
- response.append(responseLine.trim());
- }
- return response.toString();
- } finally {
- // 关闭连接
- connection.disconnect();
- }
- }
- public static String sendGetRequest(String urlString) throws IOException {
- URL url = new URL(urlString);
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- // 设置请求方法为GET
- connection.setRequestMethod("GET");
- // 设置请求头
- connection.setRequestProperty("Accept", "application/json");
- // 获取响应
- try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) {
- StringBuilder response = new StringBuilder();
- String responseLine;
- while ((responseLine = br.readLine()) != null) {
- response.append(responseLine.trim());
- }
- return response.toString();
- } finally {
- // 关闭连接
- connection.disconnect();
- }
- }
- }
复制代码 另有企业微信的两个基本配置类
- public class WeixinCorpKeyConst {
- public static String errcode = "errcode";
- public static String errmsg = "errmsg";
- // 服务商相关
- public static String corpId = "corpid";
- public static String authCorpId = "auth_corpid";
- public static String corpName = "corp_name";
- public static String suiteId = "suite_id";
- public static String suiteSecret = "suite_secret";
- public static String providerSecret = "provider_secret";
- public static String corpSecret = "corpsecret";
- public static String suiteTicket = "suite_ticket";
- public static String suiteAccessToken = "suite_access_token";
- public static String providerAccessToken = "provider_access_token";
- public static String preAuthCode = "pre_auth_code";
- public static String authCode = "auth_code";
- public static String permanentCode = "permanent_code";
- public static String authCorpInfo = "auth_corp_info";
- public static String authInfo = "auth_info";
- public static String agent = "agent";
- public static String agentId = "agentid";
- public static String accessToken = "access_token";
- }
复制代码 WeiXinProviderConst 就不贴了,内里就是记载上面那几个参数的
到这里可以发现,其实对接企业微信并不难,麻烦的地方就在于各种配置各种参数,然后就是回调,回调这个反面有空我也会整理出来
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |