企业微信第三方应用(四)基于springboot开发(获取provider_access_token,suite_access_token,access_token)

前言
上一篇”企业微信第三方应用(三)基于springboot开发(获取Ticket,auth_code)”我们讲到了如何获取 suite_ticket和auth_code两个重要参数。

下面将讲解如何获取企业微信第三方应用的 三种token方式

类型 描述 使用场景 获取服务商凭证
provider_access_token

服务商的corpid,服务商的secret,在服务商管理后台可见,获取服务商凭证provider_access_token 用于登录授权等 第三方应用
suite_access_token

suite_id(第三方应用ID,以ww或wx开头应用id)、suite_secret(应用secret)、suite_ticket(企业微信后台推送的ticket)来获取 suite_access_token,第三方应用access_token 用于获取第三方应用的预授权码等信息 授权方(企业)
access_token

企业安装第三方应用后通过授权方corpid,永久授权码permanent_code获取 用于获取通讯录信息等

获取TOKEN

企业微信第三方应用(四)基于springboot开发(获取provider_access_token,suite_access_token,access_token)
上面图是获取三种token所需要的参数

1、获取服务商凭证 provider_access_token

WeChatThirdTokenController:

package com.wechat.controller;

import com.wechat.service.IWeChatThirdTokenService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 第三方应用操作
 *
 * @author: wx
 * @date: 2022/4/1
 */
@Slf4j
@RestController
@RequestMapping(value = "wechatToken")
public class WeChatThirdTokenController {

    @Autowired
    private IWeChatThirdTokenService weChatThirdTokenService;

    /**
     * 获取第三方应用凭证
     */
    @ApiOperation(value = "获取第三方应用凭证")
    @PostMapping(value = "getSuiteToken")
    public void getSuiteToken(){
        //获取第三方应用凭证
        weChatThirdTokenService.getSuiteToken();
    }

    /**
     * 服务商的token
     */
    @ApiOperation(value = "服务商的token")
    @PostMapping(value = "getProviderToken")
    public void getProviderToken(){
        //服务商的token
        weChatThirdTokenService.getProviderToken();
    }

    /**
     * 获取企业凭证
     */
    @ApiOperation(value = "获取企业凭证")
    @PostMapping(value = "getCorpToken")
    public void getCorpToken(){
        weChatThirdTokenService.getCorpToken();
    }
}

IWeChatThirdTokenService:

package com.wechat.service;

/**
 * 获取token
 */
public interface IWeChatThirdTokenService {

    /**
     * 获取第三方应用凭证
     */
    void getSuiteToken();

    /**
     * 服务商的token
     */
    void getProviderToken();

    /**
     * 获取企业凭证
     */
    void getCorpToken();
}

接口实现类 WeChatThirdTokenServiceImpl:

package com.wechat.service.impl;

import cn.hutool.http.ContentType;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.alibaba.druid.support.json.JSONUtils;
import com.wechat.common.StringUtils;
import com.wechat.common.WeChatConstants;
import com.wechat.common.WeChatUtils;
import com.wechat.common.cache.CacheData;
import com.wechat.entity.wechat.WeChatProviderAccessToken;
import com.wechat.entity.wechat.WeChatReturn;
import com.wechat.entity.wechat.WeChatSuiteReturn;
import com.wechat.service.IWeChatThirdTokenService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 获取token
 */
@Slf4j
@Service
public class WeChatThirdTokenServiceImpl implements IWeChatThirdTokenService {

    /**
     * 获取第三方应用凭证
     */
    @Override
    public void getSuiteToken() {
        // 获取第三方应用凭证url
        String suiteTokenUrl = WeChatUtils.THIRD_BUS_WECHAT_SUITE_TOKEN;
        //  第三方应用access_token
        String suiteToken = "";
        try {
            Map<string,object> map = new HashMap<>();
            //&#x4EE5;ww&#x6216;wx&#x5F00;&#x5934;&#x5E94;&#x7528;id
            map.put("suite_id", WeChatConstants.SUITE_ID);
            //&#x5E94;&#x7528;secret
            map.put("suite_secret", WeChatConstants.SUITE_SECRET);
            //&#x4F01;&#x4E1A;&#x5FAE;&#x4FE1;&#x540E;&#x53F0;&#x63A8;&#x9001;&#x7684;ticket
            map.put("suite_ticket", CacheData.get(WeChatConstants.SUITE_TICKET));
            log.debug("getSuiteToken&#x83B7;&#x53D6;&#x7B2C;&#x4E09;&#x65B9;&#x5E94;&#x7528;&#x51ED;&#x8BC1;url&#x5165;&#x53C2;:"+ JSONUtil.toJsonStr(map));
            String body = HttpRequest.post(suiteTokenUrl).body(JSONUtil.toJsonStr(map), ContentType.JSON.getValue()).execute().body();
            log.debug("getSuiteToken&#x83B7;&#x53D6;&#x7B2C;&#x4E09;&#x65B9;&#x5E94;&#x7528;&#x51ED;&#x8BC1;&#x51FA;&#x53C2;:"+JSONUtil.toJsonStr(body));
            WeChatSuiteReturn weChat = JSONUtil.toBean(body, WeChatSuiteReturn.class);
            log.debug("getSuiteToken&#x83B7;&#x53D6;&#x7B2C;&#x4E09;&#x65B9;&#x5E94;&#x7528;&#x51ED;&#x8BC1;&#x51FA;&#x53C2;&#x8F6C;&#x6362;&#x6210;bea:"+JSONUtil.toJsonStr(weChat));
            if(weChat.getErrcode() == null || weChat.getErrcode() == 0){
                suiteToken = weChat.getSuite_access_token();
                CacheData.put(WeChatConstants.SUITE_TOKEN, suiteToken);
            }
            // &#x6253;&#x5370;&#x6D88;&#x606F;
            log.debug("&#x83B7;&#x53D6;suite token&#x6210;&#x529F;:"+suiteToken);
        } catch (Exception e) {
            log.debug("&#x83B7;&#x53D6;suite token&#x5931;&#x8D25;errcode:"+suiteToken);
            throw new RuntimeException();
        }
    }

    /**
     * &#x670D;&#x52A1;&#x5546;&#x7684;token
     */
    @Override
    public void getProviderToken() {
        // &#x670D;&#x52A1;&#x5546;&#x7684;secret&#xFF0C;&#x5728;&#x670D;&#x52A1;&#x5546;&#x7BA1;&#x7406;&#x540E;&#x53F0;&#x53EF;&#x89C1;
        String providerSecret = WeChatConstants.PROVIDER_SECRET;
        // &#x670D;&#x52A1;&#x5546;&#x7684;corpid
        String corpId = WeChatConstants.CORP_ID;
        // &#x83B7;&#x53D6;&#x670D;&#x52A1;&#x5546;&#x7684;tokenurl
        String providerTokenUrl = WeChatUtils.THIRD_BUS_WECHAT_GET_PROVIDER_TOKEN;
        String providerAccessToken = null;
        try {
            Map<string, object> map = new HashMap<>();
            map.put("corpid", corpId);
            map.put("provider_secret", providerSecret);
            log.debug("getProviderToken&#x5165;&#x53C2;:"+ JSONUtils.toJSONString(map));
            String body = HttpRequest.post(providerTokenUrl).body(JSONUtil.toJsonStr(map), ContentType.JSON.getValue()).execute().body();
            log.debug("getProviderToken&#x51FA;&#x53C2;"+body);
            WeChatProviderAccessToken weChat = JSONUtil.toBean(body, WeChatProviderAccessToken.class);
            if(weChat.getErrcode() == null || weChat.getErrcode() == 0){
                providerAccessToken = weChat.getProvider_access_token();
                CacheData.put("PROVIDER_ACCESS_TOKEN",providerAccessToken);
            }
            // &#x6253;&#x5370;&#x6D88;&#x606F;
            log.debug("&#x83B7;&#x53D6;providerAccessTokenn&#x6210;&#x529F;:"+ providerAccessToken);
        } catch (Exception e) {
            log.error("&#x83B7;&#x53D6;providerAccessToken&#x5931;&#x8D25;:"+ providerAccessToken);
            throw new RuntimeException();
        }
    }

    /**
     * &#x5982;&#x679C;&#x4F01;&#x4E1A;&#x51ED;&#x8BC1;&#x5230;&#x671F;&#x540E;
     * &#x6839;&#x636E;&#x6388;&#x6743;&#x65B9;corpid&#xFF0C;&#x4F01;&#x4E1A;&#x6C38;&#x4E45;&#x7801;&#x83B7;&#x53D6;&#x83B7;&#x53D6;&#x4F01;&#x4E1A;&#x51ED;&#x8BC1;
     */
    @Override
    public void getCorpToken() {
        log.debug("&#x83B7;&#x53D6;&#x4F01;&#x4E1A;&#x51ED;&#x8BC1;getCorpToken==========start============");
        //&#x6C38;&#x4E45;&#x7801;
        String permanentCode =  (String)CacheData.get(WeChatConstants.PERMANENT_CODE);
        //&#x7B2C;&#x4E09;&#x65B9;&#x5E94;&#x7528;access_token
        String suiteAccessToken = (String) CacheData.get(WeChatConstants.SUITE_TOKEN);
        //&#x5E94;&#x7528;&#x4F01;&#x4E1A;corpid
        String authCorpId = (String)CacheData.get(WeChatConstants.AUTH_CORPID);
        //&#x83B7;&#x53D6;&#x4F01;&#x4E1A;&#x51ED;&#x8BC1;
        String corpTokenUrl = WeChatUtils.THIRD_BUS_WECHAT_GET_CORP_TOKEN;
        corpTokenUrl = corpTokenUrl.replace("SUITE_ACCESS_TOKEN", suiteAccessToken);
        //&#x6388;&#x6743;&#x65B9;&#xFF08;&#x4F01;&#x4E1A;&#xFF09;access_token
        String accessToken = null;
        try {
            Map<string, object> map = new HashMap<>();
            //&#x6388;&#x6743;&#x65B9;corpid
            map.put("auth_corpid", authCorpId);
            //&#x6C38;&#x4E45;&#x6388;&#x6743;&#x7801;
            map.put("permanent_code", permanentCode);
            log.debug("&#x83B7;&#x53D6;&#x4F01;&#x4E1A;&#x51ED;&#x8BC1; getCorpToken &#x5165;&#x53C2;&#xFF1A;"+suiteAccessToken+"==map&#xFF1A;"+JSONUtils.toJSONString(map));
            String body = HttpRequest.post(corpTokenUrl).body(JSONUtil.toJsonStr(map), ContentType.JSON.getValue()).execute().body();
            WeChatReturn weChat = JSONUtil.toBean(body, WeChatReturn.class);
            log.debug("&#x83B7;&#x53D6;&#x4F01;&#x4E1A;&#x51ED;&#x8BC1; getCorpToken &#x51FA;&#x53C2;&#x8F6C;&#x6362;&#x6210;bean=="+JSONUtil.toJsonStr(weChat));
            accessToken = weChat.getAccess_token();
            CacheData.put(WeChatConstants.ACCESS_TOKEN,accessToken);
            CacheData.put(WeChatConstants.AUTH_CORPID,authCorpId);
            //&#x6253;&#x5370;&#x6D88;&#x606F;
            log.debug("&#x83B7;&#x53D6;accessToken&#x6210;&#x529F;:" + accessToken);
        } catch (Exception e) {
            log.debug("&#x83B7;&#x53D6;paccessToken&#x5931;&#x8D25;:" + accessToken);
            throw new RuntimeException();
        }
        log.debug("&#x83B7;&#x53D6;&#x4F01;&#x4E1A;&#x51ED;&#x8BC1;getCorpToken==========end============");
    }
}

</string,></string,></string,object>

验证:
getSuiteToken:

企业微信第三方应用(四)基于springboot开发(获取provider_access_token,suite_access_token,access_token)
getProviderToken:
企业微信第三方应用(四)基于springboot开发(获取provider_access_token,suite_access_token,access_token)
getCorpToken:
企业微信第三方应用(四)基于springboot开发(获取provider_access_token,suite_access_token,access_token)

总结
企业微信三方开发的三个重要token已经成功获取!

下一章节,我们实现企业微信的两种登录

Original: https://www.cnblogs.com/why0703/p/16086204.html
Author: why0703
Title: 企业微信第三方应用(四)基于springboot开发(获取provider_access_token,suite_access_token,access_token)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580926/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • IdWorker.java

    import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.ne…

    Java 2023年6月13日
    063
  • SpringSecurity 新版2.7以上 快速入门

    SpringSecurity 快速入门 1、导入依赖 org.springframework.boot spring-boot-starter-security 2、测试三种权限 …

    Java 2023年6月16日
    064
  • 二级运算及其性质

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月5日
    070
  • Spring ProtocolResolver接口

    Spring ProtocolResolver接口 ProtocolResolver是一个策略接口,可以用于自定义协议解析, 比如spring就有一个 “classpa…

    Java 2023年6月7日
    046
  • ElasticSearch(三)SpringBoot 整合ES

    ElasticSearch(三)SpringBoot 整合ES 使用Java API 这种方式,官方已经明确表示在ES 7.0 版本中弃用 TransportClient 客户端,…

    Java 2023年6月5日
    0104
  • 全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自动化部署项目(TableGo v8.0.0)

    TableGo_20220801 v8.0.0 正式版发布,此次版本累计更新如下:1、生成项目功能新增支持若依框架,可同时生成若依框架代码和所有业务表的前后端基础CRUD代码,一键…

    Java 2023年6月9日
    082
  • nacos 快速入门

    外表可是具有欺骗性的。 No victory comes without a price. 凡是成功就要付出代价。 这个快速开始手册是帮忙您快速在您的电脑上,下载、安装并使用 na…

    Java 2023年6月9日
    0130
  • JAVA Stream在jdk17下的例子

    最近因为某些原因,又要用stream,所以耗费了一些时间,做了一些例子,以便自己后续参考。 环境: Article类代码: package study.base.lambda.st…

    Java 2023年6月9日
    087
  • Java连载150-NIO详解(一)

    一、IO原理 1.底层原理 操作系统在进行IO的时候,实际上并不是即时操作,它们是通过缓冲区的,也就是说,我们读写文件都是通过一个中介来进行的。读系统就是把内核缓存区的内容复制到进…

    Java 2023年6月13日
    070
  • Java基础–线程池

    1. 为什么要使用线程池? 我们知道,操作系统创建线程、切换线程状态、终结线程都要进行CPU调度–这是一个耗费时间和系统资源的事情。服务端应用程序例如web应用中,比较…

    Java 2023年6月5日
    096
  • Java如何使用实时流式计算处理?

    我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为职业八股文选手 最近如果拉过 austin项目代码的同学,可能就会发现多了一个 austin-stre…

    Java 2023年6月9日
    064
  • 编码中的Adapter,不仅是一种设计模式,更是一种架构理念与解决方案

    大家好,又见面了。 不知道下面这玩意大家有没有见过或者使用过?这是一个 插座转换器。我们都知道日常使用的是 220v的交流电,而国外不同国家使用的电流电压是不一样的(比如日本使用的…

    Java 2023年6月7日
    077
  • Docker制作能够ssh连接的镜像

    本类文章只作为记录使用 命令操作: #拉取Centos 7 docker pull centos:7 #运行一个镜像 docker run -tdi –privileged ce…

    Java 2023年6月5日
    071
  • 免申请直接用上 IDEA 新 UI,只需要这三步配置

    早上给大家介绍了IDEA官方宣布正在开发一套全新的UI,但目前是预览版需要申请才能体验。 随后马上就有网友分享了,不需要申请直接就能激活体验的方法。 本期视频:https://ww…

    Java 2023年6月9日
    099
  • SpringCloud 在Feign上使用Hystrix(断路由)

    SpringCloud 在Feign上使用Hystrix(断路由) 第一步:由于Feign的起步依赖中已经引入了Hystrix的依赖,所以只需要开启Hystrix的功能,在prop…

    Java 2023年5月30日
    046
  • SpringCloud入门简述

    1、微服务简述 ​ 微服务,是一个小型的服务,也是一种设计理念,将一个大型繁杂的系统拆分为多个小型的服务,进行独立部署,这些服务在独立进程中运行,通过特定的协议进行通信 ​ 优点:…

    Java 2023年6月13日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球