package com.qianwen.core.social.request;
|
|
import com.alibaba.fastjson.JSONObject;
|
import java.util.Date;
|
import java.util.Optional;
|
import java.util.UUID;
|
import me.zhyd.oauth.cache.AuthStateCache;
|
import me.zhyd.oauth.config.AuthConfig;
|
import me.zhyd.oauth.enums.AuthResponseStatus;
|
import me.zhyd.oauth.enums.AuthUserGender;
|
import me.zhyd.oauth.exception.AuthException;
|
import me.zhyd.oauth.model.AuthCallback;
|
import me.zhyd.oauth.model.AuthToken;
|
import me.zhyd.oauth.model.AuthUser;
|
import me.zhyd.oauth.request.AbstractAuthWeChatEnterpriseRequest;
|
import me.zhyd.oauth.utils.HttpUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import com.qianwen.core.social.props.BladeAuthSource;
|
import com.qianwen.core.tool.utils.DigestUtil;
|
|
/* loaded from: blade-starter-social-9.3.2.0-SNAPSHOT.jar:org/springblade/core/social/request/CustomAuthWeChatEntWebRequest.class */
|
public class CustomAuthWeChatEntWebRequest extends AbstractAuthWeChatEnterpriseRequest {
|
private static final Logger log = LoggerFactory.getLogger(CustomAuthWeChatEntWebRequest.class);
|
public static final String DAILY_DING_ACCESS_TOKEN = "weChatEnterprise:accessToken:";
|
public static final String ENTERPRISE_TICKET_CACHE = "ticket:";
|
public static final String APP_TICKET_CACHE = "ticket:app:";
|
public static final String JSAPI_SIGIN_URL = "jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s";
|
public static final String ENTERPRISE_TICKET = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=%s";
|
public static final String APP_TICKET_URL = "https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=%s&type=agent_config";
|
public static final String GET_USER_DETAIL = "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=%s";
|
|
public CustomAuthWeChatEntWebRequest(AuthConfig config, AuthStateCache authStateCache) {
|
super(config, BladeAuthSource.WECHAT_ENTERPRISE_WEB, authStateCache);
|
}
|
|
public String getAccessToken() {
|
String appTokenRedisKey = DAILY_DING_ACCESS_TOKEN.concat(this.config.getClientId()).concat(":").concat(this.config.getClientSecret()).concat(":");
|
String accessToken = this.authStateCache.get(appTokenRedisKey);
|
if (accessToken != null) {
|
return accessToken;
|
}
|
AuthToken authToken = super.getAccessToken(AuthCallback.builder().code((String) null).build());
|
if (authToken != null) {
|
accessToken = authToken.getAccessToken();
|
this.authStateCache.cache(appTokenRedisKey, authToken.getAccessToken(), authToken.getExpireIn() * 1000);
|
}
|
log.info("getAccessToken={}", accessToken);
|
return accessToken;
|
}
|
|
private String getTicket(boolean isAgentTicket) {
|
String concat;
|
if (isAgentTicket) {
|
concat = APP_TICKET_CACHE.concat(this.config.getClientId()).concat(":").concat(this.config.getClientSecret()).concat(":");
|
} else {
|
concat = ENTERPRISE_TICKET_CACHE.concat(this.config.getClientId()).concat(":");
|
}
|
String cacheKey = concat;
|
String cacheTicket = this.authStateCache.get(cacheKey);
|
return (String) Optional.ofNullable(cacheTicket).orElseGet(() -> {
|
String token = getAccessToken();
|
String ticketURL = String.format(isAgentTicket ? APP_TICKET_URL : ENTERPRISE_TICKET, token);
|
String result = new HttpUtils(this.config.getHttpConfig()).get(ticketURL).getBody();
|
JSONObject jsonObject = JSONObject.parseObject(result);
|
return (String) Optional.ofNullable(jsonObject.getString("ticket")).map(ticket -> {
|
this.authStateCache.cache(cacheKey, ticket, jsonObject.getIntValue("expires_in") * 1000);
|
return ticket;
|
}).orElseThrow(() -> {
|
return new AuthException("获取Ticket失败");
|
});
|
});
|
}
|
|
public SignatureResult signatureURL(final String url, final boolean isAgentTicket) {
|
String jsapi_ticket = getTicket(isAgentTicket);
|
String nonceStr = UUID.randomUUID().toString();
|
long timestamp = new Date().getTime() / 1000;
|
String data = String.format(JSAPI_SIGIN_URL, jsapi_ticket, nonceStr, Long.valueOf(timestamp), url);
|
return SignatureResult.builder().nonceStr(nonceStr).timestamp(timestamp).signature(DigestUtil.sha1Hex(data)).appId(this.config.getClientId()).jsapi_ticket(jsapi_ticket).build();
|
}
|
|
protected AuthUser getUserInfo(AuthToken authToken) {
|
String response = doGetUserInfo(authToken);
|
log.info("getUserInfo={}", response);
|
JSONObject object = checkResponse(response);
|
if (!object.containsKey("userid")) {
|
throw new AuthException(AuthResponseStatus.UNIDENTIFIED_PLATFORM, this.source);
|
}
|
String userId = object.getString("userid");
|
AuthUser.AuthUserBuilder builder = AuthUser.builder().uuid(userId).token(authToken).source(this.source.toString());
|
Optional.ofNullable(object.getString("user_ticket")).map(this::getUserDetail).map(this::checkResponse).ifPresent(detail -> {
|
builder.rawUserInfo(detail).avatar(detail.getString("avatar")).location(detail.getString("address")).email(detail.getString("email")).uuid(userId).gender(AuthUserGender.getWechatRealGender(detail.getString("gender")));
|
});
|
return builder.build();
|
}
|
|
public String getUserDetail(final String userTicket) {
|
String accessToken = getAccessToken();
|
String url = String.format(GET_USER_DETAIL, accessToken);
|
JSONObject data = new JSONObject();
|
data.put("user_ticket", userTicket);
|
String response = new HttpUtils(this.config.getHttpConfig()).post(url, data.toJSONString()).getBody();
|
log.info("getUserDetail={}", response);
|
return response;
|
}
|
|
private JSONObject checkResponse(String response) {
|
JSONObject object = JSONObject.parseObject(response);
|
if (object.containsKey("errcode") && object.getIntValue("errcode") != 0) {
|
throw new AuthException(object.getString("errmsg"), this.source);
|
}
|
return object;
|
}
|
|
/* loaded from: blade-starter-social-9.3.2.0-SNAPSHOT.jar:org/springblade/core/social/request/CustomAuthWeChatEntWebRequest$SignatureResult.class */
|
public static class SignatureResult {
|
private String nonceStr;
|
private long timestamp;
|
private String signature;
|
private String appId;
|
private String jsapi_ticket;
|
|
/* loaded from: blade-starter-social-9.3.2.0-SNAPSHOT.jar:org/springblade/core/social/request/CustomAuthWeChatEntWebRequest$SignatureResult$SignatureResultBuilder.class */
|
public static class SignatureResultBuilder {
|
private String nonceStr;
|
private long timestamp;
|
private String signature;
|
private String appId;
|
private String jsapi_ticket;
|
|
SignatureResultBuilder() {
|
}
|
|
public SignatureResultBuilder nonceStr(final String nonceStr) {
|
this.nonceStr = nonceStr;
|
return this;
|
}
|
|
public SignatureResultBuilder timestamp(final long timestamp) {
|
this.timestamp = timestamp;
|
return this;
|
}
|
|
public SignatureResultBuilder signature(final String signature) {
|
this.signature = signature;
|
return this;
|
}
|
|
public SignatureResultBuilder appId(final String appId) {
|
this.appId = appId;
|
return this;
|
}
|
|
public SignatureResultBuilder jsapi_ticket(final String jsapi_ticket) {
|
this.jsapi_ticket = jsapi_ticket;
|
return this;
|
}
|
|
public SignatureResult build() {
|
return new SignatureResult(this.nonceStr, this.timestamp, this.signature, this.appId, this.jsapi_ticket);
|
}
|
|
public String toString() {
|
return "CustomAuthWeChatEntWebRequest.SignatureResult.SignatureResultBuilder(nonceStr=" + this.nonceStr + ", timestamp=" + this.timestamp + ", signature=" + this.signature + ", appId=" + this.appId + ", jsapi_ticket=" + this.jsapi_ticket + ")";
|
}
|
}
|
|
public void setNonceStr(final String nonceStr) {
|
this.nonceStr = nonceStr;
|
}
|
|
public void setTimestamp(final long timestamp) {
|
this.timestamp = timestamp;
|
}
|
|
public void setSignature(final String signature) {
|
this.signature = signature;
|
}
|
|
public void setAppId(final String appId) {
|
this.appId = appId;
|
}
|
|
public void setJsapi_ticket(final String jsapi_ticket) {
|
this.jsapi_ticket = jsapi_ticket;
|
}
|
|
public boolean equals(final Object o) {
|
if (o == this) {
|
return true;
|
}
|
if (o instanceof SignatureResult) {
|
SignatureResult other = (SignatureResult) o;
|
if (other.canEqual(this) && getTimestamp() == other.getTimestamp()) {
|
Object this$nonceStr = getNonceStr();
|
Object other$nonceStr = other.getNonceStr();
|
if (this$nonceStr == null) {
|
if (other$nonceStr != null) {
|
return false;
|
}
|
} else if (!this$nonceStr.equals(other$nonceStr)) {
|
return false;
|
}
|
Object this$signature = getSignature();
|
Object other$signature = other.getSignature();
|
if (this$signature == null) {
|
if (other$signature != null) {
|
return false;
|
}
|
} else if (!this$signature.equals(other$signature)) {
|
return false;
|
}
|
Object this$appId = getAppId();
|
Object other$appId = other.getAppId();
|
if (this$appId == null) {
|
if (other$appId != null) {
|
return false;
|
}
|
} else if (!this$appId.equals(other$appId)) {
|
return false;
|
}
|
Object this$jsapi_ticket = getJsapi_ticket();
|
Object other$jsapi_ticket = other.getJsapi_ticket();
|
return this$jsapi_ticket == null ? other$jsapi_ticket == null : this$jsapi_ticket.equals(other$jsapi_ticket);
|
}
|
return false;
|
}
|
return false;
|
}
|
|
protected boolean canEqual(final Object other) {
|
return other instanceof SignatureResult;
|
}
|
|
public int hashCode() {
|
long $timestamp = getTimestamp();
|
int result = (1 * 59) + ((int) (($timestamp >>> 32) ^ $timestamp));
|
Object $nonceStr = getNonceStr();
|
int result2 = (result * 59) + ($nonceStr == null ? 43 : $nonceStr.hashCode());
|
Object $signature = getSignature();
|
int result3 = (result2 * 59) + ($signature == null ? 43 : $signature.hashCode());
|
Object $appId = getAppId();
|
int result4 = (result3 * 59) + ($appId == null ? 43 : $appId.hashCode());
|
Object $jsapi_ticket = getJsapi_ticket();
|
return (result4 * 59) + ($jsapi_ticket == null ? 43 : $jsapi_ticket.hashCode());
|
}
|
|
public String toString() {
|
return "CustomAuthWeChatEntWebRequest.SignatureResult(nonceStr=" + getNonceStr() + ", timestamp=" + getTimestamp() + ", signature=" + getSignature() + ", appId=" + getAppId() + ", jsapi_ticket=" + getJsapi_ticket() + ")";
|
}
|
|
SignatureResult(final String nonceStr, final long timestamp, final String signature, final String appId, final String jsapi_ticket) {
|
this.nonceStr = nonceStr;
|
this.timestamp = timestamp;
|
this.signature = signature;
|
this.appId = appId;
|
this.jsapi_ticket = jsapi_ticket;
|
}
|
|
public static SignatureResultBuilder builder() {
|
return new SignatureResultBuilder();
|
}
|
|
public String getNonceStr() {
|
return this.nonceStr;
|
}
|
|
public long getTimestamp() {
|
return this.timestamp;
|
}
|
|
public String getSignature() {
|
return this.signature;
|
}
|
|
public String getAppId() {
|
return this.appId;
|
}
|
|
public String getJsapi_ticket() {
|
return this.jsapi_ticket;
|
}
|
}
|
}
|