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

me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage Maven / Gradle / Ivy

The newest version!
package me.chanjar.weixin.open.api.impl;

import cn.binarywang.wx.miniapp.config.WxMaConfig;
import java.io.File;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import me.chanjar.weixin.common.bean.WxAccessToken;
import me.chanjar.weixin.common.enums.TicketType;
import me.chanjar.weixin.common.util.http.apache.ApacheHttpClientBuilder;
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.config.WxMpHostConfig;
import me.chanjar.weixin.open.api.WxOpenConfigStorage;
import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken;
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken;
import me.chanjar.weixin.open.util.json.WxOpenGsonBuilder;

/**
 * 基于内存的微信配置provider,在实际生产环境中应该将这些配置持久化
 *
 * @author 007
 */
@Data
public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage {
  private String componentAppId;
  private String componentAppSecret;
  private String componentToken;
  private String componentAesKey;
  private String componentVerifyTicket;
  private String componentAccessToken;
  private long componentExpiresTime;

  private String componentApiSignatureRsaPrivateKey;
  private String componentApiSignatureAesKey;
  private String componentApiSignatureRsaPrivateKeySn;
  private String componentApiSignatureAesKeySn;

  private String httpProxyHost;
  private int httpProxyPort;
  private String httpProxyUsername;
  private String httpProxyPassword;

  /**
   * http 请求重试间隔
   *
   * 
   *   {@link me.chanjar.weixin.mp.api.impl.BaseWxMpServiceImpl#setRetrySleepMillis(int)}
   *   {@link cn.binarywang.wx.miniapp.api.impl.BaseWxMaServiceImpl#setRetrySleepMillis(int)}
   * 
*/ private int retrySleepMillis = 1000; /** * http 请求最大重试次数 * *
   *   {@link me.chanjar.weixin.mp.api.impl.BaseWxMpServiceImpl#setMaxRetryTimes(int)}
   *   {@link cn.binarywang.wx.miniapp.api.impl.BaseWxMaServiceImpl#setMaxRetryTimes(int)}
   * 
*/ private int maxRetryTimes = 5; private ApacheHttpClientBuilder apacheHttpClientBuilder; private Map authorizerRefreshTokens = new ConcurrentHashMap<>(); private Map authorizerAccessTokens = new ConcurrentHashMap<>(); private Map jsapiTickets = new ConcurrentHashMap<>(); private Map cardApiTickets = new ConcurrentHashMap<>(); private Map locks = new ConcurrentHashMap<>(); @Override public boolean isComponentAccessTokenExpired() { return System.currentTimeMillis() > componentExpiresTime; } @Override public void expireComponentAccessToken() { this.componentExpiresTime = 0L; } @Override public void updateComponentAccessToken(WxOpenComponentAccessToken componentAccessToken) { updateComponentAccessToken( componentAccessToken.getComponentAccessToken(), componentAccessToken.getExpiresIn()); } private Lock accessTokenLockInstance; @Override public Lock getComponentAccessTokenLock() { if (this.accessTokenLockInstance == null) { synchronized (this) { if (this.accessTokenLockInstance == null) { this.accessTokenLockInstance = getLockByKey("componentAccessTokenLock"); } } } return this.accessTokenLockInstance; } @Override public Lock getLockByKey(String key) { Lock lock = locks.get(key); if (lock == null) { synchronized (this) { lock = locks.get(key); if (lock == null) { lock = new ReentrantLock(); locks.put(key, lock); } } } return lock; } @Override public WxMpConfigStorage getWxMpConfigStorage(String appId) { return new WxOpenInnerConfigStorage(this, appId); } @Override public WxMaConfig getWxMaConfig(String appId) { return new WxOpenInnerConfigStorage(this, appId); } @Override public void updateComponentAccessToken(String componentAccessToken, int expiresInSeconds) { this.componentAccessToken = componentAccessToken; this.componentExpiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L; } @Override public void setWxOpenInfo( String componentAppId, String componentAppSecret, String componentToken, String componentAesKey) { setComponentAppId(componentAppId); setComponentAppSecret(componentAppSecret); setComponentToken(componentToken); setComponentAesKey(componentAesKey); } @Override public boolean autoRefreshToken() { return true; } private String getTokenString(Map map, String key) { Token token = map.get(key); if (token == null || (token.expiresTime != null && System.currentTimeMillis() > token.expiresTime)) { return null; } return token.token; } private void expireToken(Map map, String key) { Token token = map.get(key); if (token != null) { token.expiresTime = 0L; } } private void updateToken( Map map, String key, String tokenString, Integer expiresInSeconds) { Token token = map.get(key); if (token == null) { token = new Token(); map.put(key, token); } token.token = tokenString; if (expiresInSeconds != null && expiresInSeconds != -1) { token.expiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000L; } } @Override public String getAuthorizerRefreshToken(String appId) { return getTokenString(authorizerRefreshTokens, appId); } @Override public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { updateToken(authorizerRefreshTokens, appId, authorizerRefreshToken, null); } @Override public void updateAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { this.setAuthorizerRefreshToken(appId, authorizerRefreshToken); } @Override public String getAuthorizerAccessToken(String appId) { return getTokenString(authorizerAccessTokens, appId); } @Override public boolean isAuthorizerAccessTokenExpired(String appId) { return getTokenString(authorizerAccessTokens, appId) == null; } @Override public void expireAuthorizerAccessToken(String appId) { expireToken(authorizerAccessTokens, appId); } @Override public void updateAuthorizerAccessToken( String appId, WxOpenAuthorizerAccessToken authorizerAccessToken) { updateAuthorizerAccessToken( appId, authorizerAccessToken.getAuthorizerAccessToken(), authorizerAccessToken.getExpiresIn()); } @Override public void updateAuthorizerAccessToken( String appId, String authorizerAccessToken, int expiresInSeconds) { updateToken(authorizerAccessTokens, appId, authorizerAccessToken, expiresInSeconds); } @Override public String getJsapiTicket(String appId) { return getTokenString(jsapiTickets, appId); } @Override public boolean isJsapiTicketExpired(String appId) { return getTokenString(jsapiTickets, appId) == null; } @Override public void expireJsapiTicket(String appId) { expireToken(jsapiTickets, appId); } @Override public void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds) { updateToken(jsapiTickets, appId, jsapiTicket, expiresInSeconds); } @Override public String getCardApiTicket(String appId) { return getTokenString(cardApiTickets, appId); } @Override public boolean isCardApiTicketExpired(String appId) { return getTokenString(cardApiTickets, appId) == null; } @Override public void expireCardApiTicket(String appId) { expireToken(cardApiTickets, appId); } @Override public void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds) { updateToken(cardApiTickets, appId, cardApiTicket, expiresInSeconds); } @Data private static class Token { private String token; private Long expiresTime; } @Data private static class WxOpenInnerConfigStorage implements WxMpConfigStorage, WxMaConfig { private final WxOpenConfigStorage wxOpenConfigStorage; private final String appId; private WxMpHostConfig hostConfig; private String apiHostUrl; private String accessTokenUrl; /** 是否使用稳定版获取accessToken接口 */ @Getter(value = AccessLevel.NONE) @Setter(value = AccessLevel.NONE) private boolean useStableAccessToken; /** 小程序原始ID */ private volatile String originalId; /** 云环境ID */ private volatile String cloudEnv; private final Lock accessTokenLock; private final Lock jsapiTicketLock; private final Lock cardApiTicketLock; private WxOpenInnerConfigStorage(WxOpenConfigStorage wxOpenConfigStorage, String appId) { this.wxOpenConfigStorage = wxOpenConfigStorage; this.appId = appId; this.accessTokenLock = wxOpenConfigStorage.getLockByKey(appId + ":accessTokenLock"); this.jsapiTicketLock = wxOpenConfigStorage.getLockByKey(appId + ":jsapiTicketLock"); this.cardApiTicketLock = wxOpenConfigStorage.getLockByKey(appId + ":cardApiTicketLock"); } @Override public String getAccessToken() { return wxOpenConfigStorage.getAuthorizerAccessToken(appId); } @Override public boolean isStableAccessToken() { return this.useStableAccessToken; } @Override public void useStableAccessToken(boolean useStableAccessToken) { this.useStableAccessToken = useStableAccessToken; } @Override public Lock getAccessTokenLock() { return this.accessTokenLock; } @Override public boolean isAccessTokenExpired() { return wxOpenConfigStorage.isAuthorizerAccessTokenExpired(appId); } @Override public synchronized void updateAccessToken(WxAccessToken accessToken) { updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); } @Override public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { wxOpenConfigStorage.updateAuthorizerAccessToken(appId, accessToken, expiresInSeconds); } @Override public String getTicket(TicketType type) { switch (type) { case JSAPI: { return wxOpenConfigStorage.getJsapiTicket(appId); } case WX_CARD: { return wxOpenConfigStorage.getCardApiTicket(appId); } default: { // do nothing } } return null; } @Override public Lock getTicketLock(TicketType type) { switch (type) { case JSAPI: { return this.jsapiTicketLock; } case WX_CARD: { return this.cardApiTicketLock; } default: { // do nothing } } return null; } @Override public boolean isTicketExpired(TicketType type) { switch (type) { case JSAPI: { return wxOpenConfigStorage.isJsapiTicketExpired(appId); } case WX_CARD: { return wxOpenConfigStorage.isCardApiTicketExpired(appId); } default: { // do nothing } } return false; } @Override public void expireTicket(TicketType type) { switch (type) { case JSAPI: { wxOpenConfigStorage.expireJsapiTicket(appId); break; } case WX_CARD: { wxOpenConfigStorage.expireCardApiTicket(appId); break; } default: { // do nothing } } } @Override public void updateTicket(TicketType type, String ticket, int expiresInSeconds) { switch (type) { case JSAPI: { wxOpenConfigStorage.updateJsapiTicket(appId, ticket, expiresInSeconds); break; } case WX_CARD: { wxOpenConfigStorage.updateCardApiTicket(appId, ticket, expiresInSeconds); break; } default: { // do nothing } } } @Override public String getAppid() { return this.appId; } @Override public String getOriginalId() { return originalId; } public void setOriginalId(String originalId) { this.originalId = originalId; } @Override public String getCloudEnv() { return this.cloudEnv; } public void setCloudEnv(String cloudEnv) { this.cloudEnv = cloudEnv; } @Override public void expireAccessToken() { wxOpenConfigStorage.expireAuthorizerAccessToken(appId); } @Override public String getJsapiTicket() { return wxOpenConfigStorage.getJsapiTicket(appId); } @Override public Lock getJsapiTicketLock() { return this.jsapiTicketLock; } @Override public boolean isJsapiTicketExpired() { return wxOpenConfigStorage.isJsapiTicketExpired(appId); } @Override public synchronized void updateJsapiTicket(String jsapiTicket, int expiresInSeconds) { wxOpenConfigStorage.updateJsapiTicket(appId, jsapiTicket, expiresInSeconds); } @Override public void expireJsapiTicket() { wxOpenConfigStorage.expireJsapiTicket(appId); } @Override public String getCardApiTicket() { return wxOpenConfigStorage.getCardApiTicket(appId); } @Override public Lock getCardApiTicketLock() { return this.cardApiTicketLock; } @Override public boolean isCardApiTicketExpired() { return wxOpenConfigStorage.isCardApiTicketExpired(appId); } @Override public synchronized void updateCardApiTicket(String cardApiTicket, int expiresInSeconds) { wxOpenConfigStorage.updateCardApiTicket(appId, cardApiTicket, expiresInSeconds); } @Override public void expireCardApiTicket() { wxOpenConfigStorage.expireCardApiTicket(appId); } @Override public String getAppId() { return this.appId; } @Override public String getSecret() { return null; } @Override public String getToken() { return wxOpenConfigStorage.getComponentToken(); } @Override public String getTemplateId() { return null; } @Override public long getExpiresTime() { return 0; } @Override public String getAesKey() { return wxOpenConfigStorage.getComponentAesKey(); } @Override public String getApiSignatureRsaPrivateKey() { return wxOpenConfigStorage.getComponentApiSignatureRsaPrivateKey(); } @Override public String getApiSignatureAesKey() { return wxOpenConfigStorage.getComponentApiSignatureAesKey(); } public String getApiSignatureRsaPrivateKeySn() { return wxOpenConfigStorage.getComponentApiSignatureRsaPrivateKeySn(); } @Override public String getApiSignatureAesKeySn() { return wxOpenConfigStorage.getComponentApiSignatureAesKeySn(); } @Override public String getWechatMpAppid() { return wxOpenConfigStorage.getComponentAppId(); } @Override public String getMsgDataFormat() { return null; } @Override public String getOauth2redirectUri() { return null; } @Override public String getHttpProxyHost() { return this.wxOpenConfigStorage.getHttpProxyHost(); } @Override public int getHttpProxyPort() { return this.wxOpenConfigStorage.getHttpProxyPort(); } @Override public String getHttpProxyUsername() { return this.wxOpenConfigStorage.getHttpProxyUsername(); } @Override public String getHttpProxyPassword() { return this.wxOpenConfigStorage.getHttpProxyPassword(); } @Override public int getRetrySleepMillis() { return this.wxOpenConfigStorage.getRetrySleepMillis(); } @Override public int getMaxRetryTimes() { return this.wxOpenConfigStorage.getMaxRetryTimes(); } @Override public String toString() { return WxOpenGsonBuilder.create().toJson(this); } @Override public File getTmpDirFile() { return null; } @Override public ApacheHttpClientBuilder getApacheHttpClientBuilder() { return wxOpenConfigStorage.getApacheHttpClientBuilder(); } @Override public boolean autoRefreshToken() { return wxOpenConfigStorage.autoRefreshToken(); } @Override public WxMpHostConfig getHostConfig() { return this.hostConfig; } @Override public void setHostConfig(WxMpHostConfig hostConfig) { this.hostConfig = hostConfig; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy