企業微信第三方應用(四)基於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

上面圖是獲取三種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<>();
            //以ww或wx開頭應用id
            map.put("suite_id", WeChatConstants.SUITE_ID);
            //應用secret
            map.put("suite_secret", WeChatConstants.SUITE_SECRET);
            //企業微信后台推送的ticket
            map.put("suite_ticket", CacheData.get(WeChatConstants.SUITE_TICKET));
            log.debug("getSuiteToken獲取第三方應用憑證url入參:"+ JSONUtil.toJsonStr(map));
            String body = HttpRequest.post(suiteTokenUrl).body(JSONUtil.toJsonStr(map), ContentType.JSON.getValue()).execute().body();
            log.debug("getSuiteToken獲取第三方應用憑證出參:"+JSONUtil.toJsonStr(body));
            WeChatSuiteReturn weChat = JSONUtil.toBean(body, WeChatSuiteReturn.class);
            log.debug("getSuiteToken獲取第三方應用憑證出參轉換成bea:"+JSONUtil.toJsonStr(weChat));
            if(weChat.getErrcode() == null || weChat.getErrcode() == 0){
                suiteToken = weChat.getSuite_access_token();
                CacheData.put(WeChatConstants.SUITE_TOKEN, suiteToken);
            }
            // 打印消息
            log.debug("獲取suite token成功:"+suiteToken);
        } catch (Exception e) {
            log.debug("獲取suite token失敗errcode:"+suiteToken);
            throw new RuntimeException();
        }
    }

    /**
     * 服務商的token
     */
    @Override
    public void getProviderToken() {
        // 服務商的secret,在服務商管理后台可見
        String providerSecret = WeChatConstants.PROVIDER_SECRET;
        // 服務商的corpid
        String corpId = WeChatConstants.CORP_ID;
        // 獲取服務商的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入參:"+ JSONUtils.toJSONString(map));
            String body = HttpRequest.post(providerTokenUrl).body(JSONUtil.toJsonStr(map), ContentType.JSON.getValue()).execute().body();
            log.debug("getProviderToken出參"+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);
            }
            // 打印消息
            log.debug("獲取providerAccessTokenn成功:"+ providerAccessToken);
        } catch (Exception e) {
            log.error("獲取providerAccessToken失敗:"+ providerAccessToken);
            throw new RuntimeException();
        }
    }

    /**
     * 如果企業憑證到期后
     * 根據授權方corpid,企業永久碼獲取獲取企業憑證
     */
    @Override
    public void getCorpToken() {
        log.debug("獲取企業憑證getCorpToken==========start============");
        //永久碼
        String permanentCode =  (String)CacheData.get(WeChatConstants.PERMANENT_CODE);
        //第三方應用access_token
        String suiteAccessToken = (String) CacheData.get(WeChatConstants.SUITE_TOKEN);
        //應用企業corpid
        String authCorpId = (String)CacheData.get(WeChatConstants.AUTH_CORPID);
        //獲取企業憑證
        String corpTokenUrl = WeChatUtils.THIRD_BUS_WECHAT_GET_CORP_TOKEN;
        corpTokenUrl = corpTokenUrl.replace("SUITE_ACCESS_TOKEN", suiteAccessToken);
        //授權方(企業)access_token
        String accessToken = null;
        try {
            Map<String, Object> map = new HashMap<>();
            //授權方corpid
            map.put("auth_corpid", authCorpId);
            //永久授權碼
            map.put("permanent_code", permanentCode);
            log.debug("獲取企業憑證 getCorpToken 入參:"+suiteAccessToken+"==map:"+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("獲取企業憑證 getCorpToken 出參轉換成bean=="+JSONUtil.toJsonStr(weChat));
            accessToken = weChat.getAccess_token();
            CacheData.put(WeChatConstants.ACCESS_TOKEN,accessToken);
            CacheData.put(WeChatConstants.AUTH_CORPID,authCorpId);
            //打印消息
            log.debug("獲取accessToken成功:" + accessToken);
        } catch (Exception e) {
            log.debug("獲取paccessToken失敗:" + accessToken);
            throw new RuntimeException();
        }
        log.debug("獲取企業憑證getCorpToken==========end============");
    }
}

驗證:
getSuiteToken:

getProviderToken:

getCorpToken:

總結
企業微信三方開發的三個重要token已經成功獲取!

下一章節,我們實現企業微信的兩種登錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM