前言
上一篇“企業微信第三方應用(三)基於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已經成功獲取!
下一章節,我們實現企業微信的兩種登錄
