All Downloads are FREE. Search and download functionalities are using the official Maven repository.

me.chanjar.weixin.cp.tp.service.impl.BaseWxCpTpServiceImpl Maven / Gradle / Ivy

There is a newer version: 4.6.7.B
Show newest version
package me.chanjar.weixin.cp.tp.service.impl;

import com.google.common.base.Joiner;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.bean.WxAccessToken;
import me.chanjar.weixin.common.bean.WxJsapiSignature;
import me.chanjar.weixin.common.enums.WxType;
import me.chanjar.weixin.common.error.WxCpErrorMsgEnum;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.error.WxRuntimeException;
import me.chanjar.weixin.common.session.StandardSessionManager;
import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.common.util.DataUtils;
import me.chanjar.weixin.common.util.RandomUtils;
import me.chanjar.weixin.common.util.crypto.SHA1;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.cp.bean.*;
import me.chanjar.weixin.cp.config.WxCpTpConfigStorage;
import me.chanjar.weixin.cp.tp.service.*;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static me.chanjar.weixin.cp.constant.WxCpApiPathConsts.Tp.*;

/**
 * .
 *
 * @param  the type parameter
 * @param 

the type parameter * @author zhenjun cai */ @Slf4j public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, RequestHttp { private WxCpTpContactService wxCpTpContactService = new WxCpTpContactServiceImpl(this); private WxCpTpDepartmentService wxCpTpDepartmentService = new WxCpTpDepartmentServiceImpl(this); private WxCpTpMediaService wxCpTpMediaService = new WxCpTpMediaServiceImpl(this); private WxCpTpOAService wxCpTpOAService = new WxCpTpOAServiceImpl(this); private WxCpTpUserService wxCpTpUserService = new WxCpTpUserServiceImpl(this); private WxCpTpOrderService wxCpTpOrderService = new WxCpTpOrderServiceImpl(this); private WxCpTpEditionService wxCpTpEditionService = new WxCpTpEditionServiceImpl(this); private WxCpTpLicenseService wxCpTpLicenseService = new WxCpTpLicenseServiceImpl(this); private WxCpTpIdConvertService wxCpTpIdConvertService = new WxCpTpIdConvertServiceImpl(this); private WxCpTpOAuth2Service wxCpTpOAuth2Service = new WxCpTpOAuth2ServiceImpl(this); /** * 全局的是否正在刷新access token的锁. */ protected final Object globalSuiteAccessTokenRefreshLock = new Object(); /** * 全局刷新suite ticket的锁 */ protected final Object globalSuiteTicketRefreshLock = new Object(); /** * 全局的是否正在刷新jsapi_ticket的锁. */ protected final Object globalJsApiTicketRefreshLock = new Object(); /** * 全局的是否正在刷新auth_corp_jsapi_ticket的锁. */ protected final Object globalAuthCorpJsApiTicketRefreshLock = new Object(); /** * The Global provider token refresh lock. */ protected final Object globalProviderTokenRefreshLock = new Object(); /** * The Config storage. */ protected WxCpTpConfigStorage configStorage; private final WxSessionManager sessionManager = new StandardSessionManager(); /** * 临时文件目录. */ private File tmpDirFile; private int retrySleepMillis = 1000; private int maxRetryTimes = 5; @Override public boolean checkSignature(String msgSignature, String timestamp, String nonce, String data) { try { return SHA1.gen(this.configStorage.getToken(), timestamp, nonce, data) .equals(msgSignature); } catch (Exception e) { log.error("Checking signature failed, and the reason is :" + e.getMessage()); return false; } } @Override public String getSuiteAccessToken() throws WxErrorException { return getSuiteAccessToken(false); } @Override public WxAccessToken getSuiteAccessTokenEntity() throws WxErrorException { return this.getSuiteAccessTokenEntity(false); } @Override public WxAccessToken getSuiteAccessTokenEntity(boolean forceRefresh) throws WxErrorException { getSuiteAccessToken(forceRefresh); return this.configStorage.getSuiteAccessTokenEntity(); } @Override public String getSuiteTicket() throws WxErrorException { if (this.configStorage.isSuiteTicketExpired()) { // 本地suite ticket 不存在或者过期 WxError wxError = WxError.fromJson("{\"errcode\":40085, \"errmsg\":\"invalid suite ticket\"}", WxType.CP); throw new WxErrorException(wxError); } return this.configStorage.getSuiteTicket(); } @Override public String getSuiteTicket(boolean forceRefresh) throws WxErrorException { // suite ticket由微信服务器推送,不能强制刷新 // if (forceRefresh) { // this.configStorage.expireSuiteTicket(); // } return getSuiteTicket(); } @Override public void setSuiteTicket(String suiteTicket) { setSuiteTicket(suiteTicket, 28 * 60); } @Override public void setSuiteTicket(String suiteTicket, int expiresInSeconds) { synchronized (globalSuiteTicketRefreshLock) { this.configStorage.updateSuiteTicket(suiteTicket, expiresInSeconds); } } @Override public String getSuiteJsApiTicket(String authCorpId) throws WxErrorException { if (this.configStorage.isAuthSuiteJsApiTicketExpired(authCorpId)) { String resp = get(configStorage.getApiUrl(GET_SUITE_JSAPI_TICKET), "type=agent_config&access_token=" + this.configStorage.getAccessToken(authCorpId), true); JsonObject jsonObject = GsonParser.parse(resp); if (jsonObject.get(WxConsts.ERR_CODE).getAsInt() == 0) { String jsApiTicket = jsonObject.get("ticket").getAsString(); int expiredInSeconds = jsonObject.get("expires_in").getAsInt(); synchronized (globalJsApiTicketRefreshLock) { configStorage.updateAuthSuiteJsApiTicket(authCorpId, jsApiTicket, expiredInSeconds); } } else { throw new WxErrorException(WxError.fromJson(resp)); } } return configStorage.getAuthSuiteJsApiTicket(authCorpId); } @Override public String getSuiteJsApiTicket(String authCorpId, boolean forceRefresh) throws WxErrorException { if (forceRefresh) { this.configStorage.expireAuthSuiteJsApiTicket(authCorpId); } return this.getSuiteJsApiTicket(authCorpId); } @Override public String getAuthCorpJsApiTicket(String authCorpId) throws WxErrorException { if (this.configStorage.isAuthCorpJsApiTicketExpired(authCorpId)) { String resp = get(configStorage.getApiUrl(GET_AUTH_CORP_JSAPI_TICKET), "access_token=" + this.configStorage.getAccessToken(authCorpId), true); JsonObject jsonObject = GsonParser.parse(resp); if (jsonObject.get(WxConsts.ERR_CODE).getAsInt() == 0) { String jsApiTicket = jsonObject.get("ticket").getAsString(); int expiredInSeconds = jsonObject.get("expires_in").getAsInt(); synchronized (globalAuthCorpJsApiTicketRefreshLock) { configStorage.updateAuthCorpJsApiTicket(authCorpId, jsApiTicket, expiredInSeconds); } } else { throw new WxErrorException(WxError.fromJson(resp)); } } return configStorage.getAuthCorpJsApiTicket(authCorpId); } @Override public String getAuthCorpJsApiTicket(String authCorpId, boolean forceRefresh) throws WxErrorException { if (forceRefresh) { this.configStorage.expireAuthCorpJsApiTicket(authCorpId); } return this.getAuthCorpJsApiTicket(authCorpId); } @Override public WxCpMaJsCode2SessionResult jsCode2Session(String jsCode) throws WxErrorException { Map params = new HashMap<>(2); params.put("js_code", jsCode); params.put("grant_type", "authorization_code"); final String url = configStorage.getApiUrl(JSCODE_TO_SESSION); return WxCpMaJsCode2SessionResult.fromJson(this.get(url, Joiner.on("&").withKeyValueSeparator("=").join(params))); } @Override public WxAccessToken getCorpToken(String authCorpId, String permanentCode) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("auth_corpid", authCorpId); jsonObject.addProperty("permanent_code", permanentCode); String result = post(configStorage.getApiUrl(GET_CORP_TOKEN), jsonObject.toString()); return WxAccessToken.fromJson(result); } @Override public WxAccessToken getCorpToken(String authCorpId, String permanentCode, boolean forceRefresh) throws WxErrorException { if (this.configStorage.isAccessTokenExpired(authCorpId) || forceRefresh) { WxAccessToken corpToken = this.getCorpToken(authCorpId, permanentCode); this.configStorage.updateAccessToken(authCorpId, corpToken.getAccessToken(), corpToken.getExpiresIn()); } return this.configStorage.getAccessTokenEntity(authCorpId); } @Override public WxCpTpCorp getPermanentCode(String authCode) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("auth_code", authCode); String result = post(configStorage.getApiUrl(GET_PERMANENT_CODE), jsonObject.toString()); jsonObject = GsonParser.parse(result); WxCpTpCorp wxCpTpCorp = WxCpTpCorp.fromJson(jsonObject.get("auth_corp_info").getAsJsonObject().toString()); wxCpTpCorp.setPermanentCode(jsonObject.get("permanent_code").getAsString()); return wxCpTpCorp; } @Override public WxCpTpPermanentCodeInfo getPermanentCodeInfo(String authCode) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("auth_code", authCode); String result = post(configStorage.getApiUrl(GET_PERMANENT_CODE), jsonObject.toString()); return WxCpTpPermanentCodeInfo.fromJson(result); } @Override @SneakyThrows public String getPreAuthUrl(String redirectUri, String state) throws WxErrorException { String result = get(configStorage.getApiUrl(GET_PREAUTH_CODE), null); WxCpTpPreauthCode preAuthCode = WxCpTpPreauthCode.fromJson(result); String preAuthUrl = "https://open.work.weixin.qq.com/3rdapp/install?suite_id=" + configStorage.getSuiteId() + "&pre_auth_code=" + preAuthCode.getPreAuthCode() + "&redirect_uri=" + URLEncoder.encode(redirectUri, "utf-8"); if (StringUtils.isNotBlank(state)) { preAuthUrl += "&state=" + state; } return preAuthUrl; } @Override @SneakyThrows public String getPreAuthUrl(String redirectUri, String state, int authType) throws WxErrorException { String result = get(configStorage.getApiUrl(GET_PREAUTH_CODE), null); WxCpTpPreauthCode preAuthCode = WxCpTpPreauthCode.fromJson(result); String setSessionUrl = "https://qyapi.weixin.qq.com/cgi-bin/service/set_session_info"; Map sessionInfo = new HashMap<>(1); sessionInfo.put("auth_type", authType); Map param = new HashMap<>(2); param.put("pre_auth_code", preAuthCode.getPreAuthCode()); param.put("session_info", sessionInfo); String postData = new Gson().toJson(param); post(setSessionUrl, postData); String preAuthUrl = "https://open.work.weixin.qq.com/3rdapp/install?suite_id=" + configStorage.getSuiteId() + "&pre_auth_code=" + preAuthCode.getPreAuthCode() + "&redirect_uri=" + URLEncoder.encode(redirectUri, "utf-8"); if (StringUtils.isNotBlank(state)) { preAuthUrl += "&state=" + state; } return preAuthUrl; } @Override public WxCpTpAuthInfo getAuthInfo(String authCorpId, String permanentCode) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("auth_corpid", authCorpId); jsonObject.addProperty("permanent_code", permanentCode); String result = post(configStorage.getApiUrl(GET_AUTH_INFO), jsonObject.toString()); return WxCpTpAuthInfo.fromJson(result); } @Override public String get(String url, String queryParam) throws WxErrorException { return execute(SimpleGetRequestExecutor.create(this), url, queryParam); } @Override public String get(String url, String queryParam, boolean withoutSuiteAccessToken) throws WxErrorException { return execute(SimpleGetRequestExecutor.create(this), url, queryParam, withoutSuiteAccessToken); } @Override public String post(String url, String postData) throws WxErrorException { return execute(SimplePostRequestExecutor.create(this), url, postData, false); } /** * Post string. * * @param url the url * @param postData the post data * @param withoutSuiteAccessToken the without suite access token * @return the string * @throws WxErrorException the wx error exception */ public String post(String url, String postData, boolean withoutSuiteAccessToken) throws WxErrorException { return execute(SimplePostRequestExecutor.create(this), url, postData, withoutSuiteAccessToken); } /** * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求. */ @Override public T execute(RequestExecutor executor, String uri, E data) throws WxErrorException { return execute(executor, uri, data, false); } /** * Execute t. * * @param the type parameter * @param the type parameter * @param executor the executor * @param uri the uri * @param data the data * @param withoutSuiteAccessToken the without suite access token * @return the t * @throws WxErrorException the wx error exception */ public T execute(RequestExecutor executor, String uri, E data, boolean withoutSuiteAccessToken) throws WxErrorException { int retryTimes = 0; do { try { return this.executeInternal(executor, uri, data, withoutSuiteAccessToken); } catch (WxErrorException e) { if (retryTimes + 1 > this.maxRetryTimes) { log.warn("重试达到最大次数【{}】", this.maxRetryTimes); //最后一次重试失败后,直接抛出异常,不再等待 throw new WxRuntimeException("微信服务端异常,超出重试次数"); } WxError error = e.getError(); /* * -1 系统繁忙, 1000ms后重试 */ if (error.getErrorCode() == -1) { int sleepMillis = this.retrySleepMillis * (1 << retryTimes); try { log.debug("微信系统繁忙,{} ms 后重试(第{}次)", sleepMillis, retryTimes + 1); Thread.sleep(sleepMillis); } catch (InterruptedException e1) { Thread.currentThread().interrupt(); } } else { throw e; } } } while (retryTimes++ < this.maxRetryTimes); log.warn("重试达到最大次数【{}】", this.maxRetryTimes); throw new WxRuntimeException("微信服务端异常,超出重试次数"); } /** * Execute internal t. * * @param the type parameter * @param the type parameter * @param executor the executor * @param uri the uri * @param data the data * @return the t * @throws WxErrorException the wx error exception */ protected T executeInternal(RequestExecutor executor, String uri, E data) throws WxErrorException { return executeInternal(executor, uri, data, false); } /** * Execute internal t. * * @param the type parameter * @param the type parameter * @param executor the executor * @param uri the uri * @param data the data * @param withoutSuiteAccessToken the without suite access token * @return the t * @throws WxErrorException the wx error exception */ protected T executeInternal(RequestExecutor executor, String uri, E data, boolean withoutSuiteAccessToken) throws WxErrorException { E dataForLog = DataUtils.handleDataWithSecret(data); if (uri.contains("suite_access_token=")) { throw new IllegalArgumentException("uri参数中不允许有suite_access_token: " + uri); } String uriWithAccessToken; if (!withoutSuiteAccessToken) { String suiteAccessToken = getSuiteAccessToken(false); uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "suite_access_token=" + suiteAccessToken; } else { uriWithAccessToken = uri; } try { T result = executor.execute(uriWithAccessToken, data, WxType.CP); log.debug("\n【请求地址】: {}\n【请求参数】:{}\n【响应数据】:{}", uriWithAccessToken, dataForLog, result); return result; } catch (WxErrorException e) { WxError error = e.getError(); /* * 发生以下情况时尝试刷新suite_access_token * 42009 suite_access_token已过期 */ if (error.getErrorCode() == WxCpErrorMsgEnum.CODE_42009.getCode()) { // 强制设置wxCpTpConfigStorage它的suite access token过期了,这样在下一次请求里就会刷新suite access token this.configStorage.expireSuiteAccessToken(); if (this.getWxCpTpConfigStorage().autoRefreshToken()) { log.warn("即将重新获取新的access_token,错误代码:{},错误信息:{}", error.getErrorCode(), error.getErrorMsg()); return this.execute(executor, uri, data); } } if (error.getErrorCode() != 0) { log.error("\n【请求地址】: {}\n【请求参数】:{}\n【错误信息】:{}", uriWithAccessToken, dataForLog, error); throw new WxErrorException(error, e); } return null; } catch (IOException e) { log.error("\n【请求地址】: {}\n【请求参数】:{}\n【异常信息】:{}", uriWithAccessToken, dataForLog, e.getMessage()); throw new WxRuntimeException(e); } } @Override public void setWxCpTpConfigStorage(WxCpTpConfigStorage wxConfigProvider) { this.configStorage = wxConfigProvider; this.initHttp(); } @Override public void setRetrySleepMillis(int retrySleepMillis) { this.retrySleepMillis = retrySleepMillis; } @Override public void setMaxRetryTimes(int maxRetryTimes) { this.maxRetryTimes = maxRetryTimes; } /** * Gets tmp dir file. * * @return the tmp dir file */ public File getTmpDirFile() { return this.tmpDirFile; } /** * Sets tmp dir file. * * @param tmpDirFile the tmp dir file */ public void setTmpDirFile(File tmpDirFile) { this.tmpDirFile = tmpDirFile; } @Override public RequestHttp getRequestHttp() { return this; } @Override public WxSessionManager getSessionManager() { return this.sessionManager; } @Override public WxCpTpUserInfo getUserInfo3rd(String code) throws WxErrorException { String url = configStorage.getApiUrl(GET_USERINFO3RD); String result = get(url + "?code=" + code, null); return WxCpTpUserInfo.fromJson(result); } @Override public WxCpTpUserDetail getUserDetail3rd(String userTicket) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("user_ticket", userTicket); String result = post(configStorage.getApiUrl(GET_USERDETAIL3RD), jsonObject.toString()); return WxCpTpUserDetail.fromJson(result); } @Override public WxTpLoginInfo getLoginInfo(String authCode) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("auth_code", authCode); String access_token = getWxCpProviderToken(); String responseText = post(configStorage.getApiUrl(GET_LOGIN_INFO) + "?access_token=" + access_token, jsonObject.toString(), true); return WxTpLoginInfo.fromJson(responseText); } @Override public WxTpCustomizedAuthUrl getCustomizedAuthUrl(String state, List templateIdList) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("state", state); jsonObject.add("templateid_list", WxGsonBuilder.create().toJsonTree(templateIdList).getAsJsonArray()); String responseText = post(configStorage.getApiUrl(GET_CUSTOMIZED_AUTH_URL) + "?provider_access_token=" + getWxCpProviderToken(), jsonObject.toString(), true); return WxTpCustomizedAuthUrl.fromJson(responseText); } @Override public String getWxCpProviderToken() throws WxErrorException { if (this.configStorage.isProviderTokenExpired()) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("corpid", configStorage.getCorpId()); jsonObject.addProperty("provider_secret", configStorage.getProviderSecret()); //providerAccessToken 的获取不需要suiteAccessToken ,一不必要,二可以提高效率 WxCpProviderToken wxCpProviderToken = WxCpProviderToken.fromJson(this.post(this.configStorage.getApiUrl(GET_PROVIDER_TOKEN) , jsonObject.toString(), true)); String providerAccessToken = wxCpProviderToken.getProviderAccessToken(); Integer expiresIn = wxCpProviderToken.getExpiresIn(); synchronized (globalProviderTokenRefreshLock) { configStorage.updateProviderToken(providerAccessToken, expiresIn - 200); } } return configStorage.getProviderToken(); } @Override public WxCpProviderToken getWxCpProviderTokenEntity() throws WxErrorException { return this.getWxCpProviderTokenEntity(false); } @Override public WxCpProviderToken getWxCpProviderTokenEntity(boolean forceRefresh) throws WxErrorException { if (forceRefresh) { this.configStorage.expireProviderToken(); } this.getWxCpProviderToken(); return this.configStorage.getProviderTokenEntity(); } @Override public WxCpTpContactService getWxCpTpContactService() { return wxCpTpContactService; } @Override public WxCpTpDepartmentService getWxCpTpDepartmentService() { return wxCpTpDepartmentService; } @Override public WxCpTpMediaService getWxCpTpMediaService() { return wxCpTpMediaService; } @Override public WxCpTpOAService getWxCpTpOAService() { return wxCpTpOAService; } @Override public WxCpTpUserService getWxCpTpUserService() { return wxCpTpUserService; } @Override public void setWxCpTpContactService(WxCpTpContactService wxCpTpContactService) { this.wxCpTpContactService = wxCpTpContactService; } @Override public void setWxCpTpDepartmentService(WxCpTpDepartmentService wxCpTpDepartmentService) { this.wxCpTpDepartmentService = wxCpTpDepartmentService; } @Override public void setWxCpTpMediaService(WxCpTpMediaService wxCpTpMediaService) { this.wxCpTpMediaService = wxCpTpMediaService; } @Override public void setWxCpTpOAService(WxCpTpOAService wxCpTpOAService) { this.wxCpTpOAService = wxCpTpOAService; } @Override public WxCpTpLicenseService getWxCpTpLicenseService() { return wxCpTpLicenseService; } @Override public void setWxCpTpLicenseService(WxCpTpLicenseService wxCpTpLicenseService) { this.wxCpTpLicenseService = wxCpTpLicenseService; } @Override public void setWxCpTpUserService(WxCpTpUserService wxCpTpUserService) { this.wxCpTpUserService = wxCpTpUserService; } @Override public WxCpTpAdmin getAdminList(String authCorpId, Integer agentId) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("auth_corpid", authCorpId); jsonObject.addProperty("agentid", agentId); String result = post(configStorage.getApiUrl(GET_ADMIN_LIST), jsonObject.toString()); return WxCpTpAdmin.fromJson(result); } public WxCpTpAppQrcode getAppQrcode(String suiteId, String appId, String state, Integer style, Integer resultType) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("suite_id", suiteId); jsonObject.addProperty("appid", appId); jsonObject.addProperty("state", state); jsonObject.addProperty("style", style); jsonObject.addProperty("result_type", resultType); String result = post(configStorage.getApiUrl(GET_APP_QRCODE), jsonObject.toString()); return WxCpTpAppQrcode.fromJson(result); } public WxCpTpCorpId2OpenCorpId corpId2OpenCorpId(String corpId) throws WxErrorException { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("corpid", corpId); String result = post(configStorage.getApiUrl(CORPID_TO_OPENCORPID) +"?provider_access_token=" + getWxCpProviderToken(), jsonObject.toString()); return WxCpTpCorpId2OpenCorpId.fromJson(result); } @Override public WxJsapiSignature createAuthCorpJsApiTicketSignature(String url, String authCorpId) throws WxErrorException { return doCreateWxJsapiSignature(url, authCorpId, this.getAuthCorpJsApiTicket(authCorpId)); } @Override public WxJsapiSignature createSuiteJsApiTicketSignature(String url, String authCorpId) throws WxErrorException { return doCreateWxJsapiSignature(url, authCorpId, this.getSuiteJsApiTicket(authCorpId)); } @Override public void expireSuiteAccessToken() { this.configStorage.expireSuiteAccessToken(); } @Override public void expireAccessToken(String authCorpId) { this.configStorage.expireAccessToken(authCorpId); } @Override public void expireAuthCorpJsApiTicket(String authCorpId) { this.configStorage.expireAuthCorpJsApiTicket(authCorpId); } @Override public void expireAuthSuiteJsApiTicket(String authCorpId) { this.configStorage.expireAuthSuiteJsApiTicket(authCorpId); } @Override public void expireProviderToken() { this.configStorage.expireProviderToken(); } @Override public WxCpTpOrderService getWxCpTpOrderService() { return wxCpTpOrderService; } @Override public void setWxCpTpOrderService(WxCpTpOrderService wxCpTpOrderService) { this.wxCpTpOrderService = wxCpTpOrderService; } @Override public WxCpTpEditionService getWxCpTpEditionService() { return wxCpTpEditionService; } @Override public void setWxCpTpOrderService(WxCpTpEditionService wxCpTpEditionService) { this.wxCpTpEditionService = wxCpTpEditionService; } private WxJsapiSignature doCreateWxJsapiSignature(String url, String authCorpId, String jsapiTicket) { long timestamp = System.currentTimeMillis() / 1000; String noncestr = RandomUtils.getRandomStr(); String signature = SHA1 .genWithAmple("jsapi_ticket=" + jsapiTicket, "noncestr=" + noncestr, "timestamp=" + timestamp, "url=" + url); WxJsapiSignature jsapiSignature = new WxJsapiSignature(); jsapiSignature.setTimestamp(timestamp); jsapiSignature.setNonceStr(noncestr); jsapiSignature.setUrl(url); jsapiSignature.setSignature(signature); jsapiSignature.setAppId(authCorpId); return jsapiSignature; } @Override public WxCpTpIdConvertService getWxCpTpIdConverService() { return wxCpTpIdConvertService; } @Override public void setWxCpTpIdConverService(WxCpTpIdConvertService wxCpTpIdConvertService) { this.wxCpTpIdConvertService = wxCpTpIdConvertService; } @Override public WxCpTpOAuth2Service getWxCpTpOAuth2Service() { return wxCpTpOAuth2Service; } @Override public void setWxCpTpOAuth2Service(WxCpTpOAuth2Service wxCpTpOAuth2Service) { this.wxCpTpOAuth2Service = wxCpTpOAuth2Service; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy