diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java index e7ae78eb4799290405765c8d13cf4807db3fd827..eec7c9959ab5a826f8a9a6e6bc569792efddb648 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java @@ -7,7 +7,11 @@ import me.zhyd.oauth.config.AuthConfig; import me.zhyd.oauth.config.AuthSource; import me.zhyd.oauth.exception.AuthException; import me.zhyd.oauth.model.*; -import me.zhyd.oauth.utils.UrlBuilder; +import me.zhyd.oauth.url.WechatUrlBuilder; +import me.zhyd.oauth.url.entity.AuthAccessTokenEntity; +import me.zhyd.oauth.url.entity.AuthAuthorizeEntity; +import me.zhyd.oauth.url.entity.AuthRefreshTokenEntity; +import me.zhyd.oauth.url.entity.AuthUserInfoEntity; /** * 微信登录 @@ -18,7 +22,7 @@ import me.zhyd.oauth.utils.UrlBuilder; */ public class AuthWeChatRequest extends BaseAuthRequest { public AuthWeChatRequest(AuthConfig config) { - super(config, AuthSource.WECHAT); + super(config, AuthSource.WECHAT, new WechatUrlBuilder()); } /** @@ -29,7 +33,10 @@ public class AuthWeChatRequest extends BaseAuthRequest { */ @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = UrlBuilder.getWeChatAccessTokenUrl(config.getClientId(), config.getClientSecret(), authCallback.getCode()); + String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(AuthAccessTokenEntity.builder() + .config(config) + .code(authCallback.getCode()) + .build()); return this.getToken(accessTokenUrl); } @@ -38,7 +45,10 @@ public class AuthWeChatRequest extends BaseAuthRequest { String accessToken = authToken.getAccessToken(); String openId = authToken.getOpenId(); - HttpResponse response = HttpRequest.get(UrlBuilder.getWeChatUserInfoUrl(accessToken, openId)).execute(); + HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() + .accessToken(accessToken) + .openId(openId) + .build())).execute(); JSONObject object = JSONObject.parseObject(response.body()); this.checkResponse(object); @@ -63,12 +73,17 @@ public class AuthWeChatRequest extends BaseAuthRequest { */ @Override public String authorize() { - return UrlBuilder.getWeChatAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState()); + return this.urlBuilder.getAuthorizeUrl(AuthAuthorizeEntity.builder() + .config(config) + .build()); } @Override public AuthResponse refresh(AuthToken oldToken) { - String refreshTokenUrl = UrlBuilder.getWeChatRefreshUrl(config.getClientId(), oldToken.getRefreshToken()); + String refreshTokenUrl = this.urlBuilder.getRefreshUrl(AuthRefreshTokenEntity.builder() + .clientId(config.getClientId()) + .refreshToken(oldToken.getRefreshToken()) + .build()); return AuthResponse.builder() .code(ResponseStatus.SUCCESS.getCode()) .data(this.getToken(refreshTokenUrl)) diff --git a/src/main/java/me/zhyd/oauth/url/WechatUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/WechatUrlBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..7204b4401294a1cc0cbfa9d4bba6243198cedce5 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/url/WechatUrlBuilder.java @@ -0,0 +1,49 @@ +package me.zhyd.oauth.url; + +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.url.entity.*; + +import java.text.MessageFormat; + +/** + * 微信相关的URL构建类 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @since 1.8 + */ +public class WechatUrlBuilder extends AbstractUrlBuilder { + + private static final String WECHAT_AUTHORIZE_PATTERN = "{0}?appid={1}&redirect_uri={2}&response_type=code&scope=snsapi_login&state={3}#wechat_redirect"; + private static final String WECHAT_ACCESS_TOKEN_PATTERN = "{0}?appid={1}&secret={2}&code={3}&grant_type=authorization_code"; + private static final String WECHAT_REFRESH_TOKEN_PATTERN = "{0}?appid={1}&grant_type=refresh_token&refresh_token={2}"; + private static final String WECHAT_USER_INFO_PATTERN = "{0}?access_token={1}&openid={2}&lang=zh_CN"; + + @Override + public String getAccessTokenUrl(AuthAccessTokenEntity accessTokenEntity) { + AuthConfig config = accessTokenEntity.getConfig(); + return MessageFormat.format(WECHAT_ACCESS_TOKEN_PATTERN, AuthSource.WECHAT.accessToken(), config.getClientId(), config.getClientSecret(), accessTokenEntity.getCode()); + } + + @Override + public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { + return MessageFormat.format(WECHAT_USER_INFO_PATTERN, AuthSource.WECHAT.userInfo(), userInfoEntity.getAccessToken(), userInfoEntity.getOpenId()); + } + + @Override + public String getAuthorizeUrl(AuthAuthorizeEntity authorizeEntity) { + AuthConfig config = authorizeEntity.getConfig(); + return MessageFormat.format(WECHAT_AUTHORIZE_PATTERN, AuthSource.WECHAT.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); + } + + @Override + public String getRefreshUrl(AuthRefreshTokenEntity refreshTokenEntity) { + return MessageFormat.format(WECHAT_REFRESH_TOKEN_PATTERN, AuthSource.WECHAT.refresh(), refreshTokenEntity.getClientId(), refreshTokenEntity.getRefreshToken()); + } + + @Override + public String getRevokeUrl(AuthRevokeEntity revokeEntity) { + return null; + } +} diff --git a/src/main/java/me/zhyd/oauth/url/entity/AuthRefreshTokenEntity.java b/src/main/java/me/zhyd/oauth/url/entity/AuthRefreshTokenEntity.java index 19d07a04aee3d993a51b5880df075c1518fb54e4..b80a754f8fa9dc4b5979d71a5c451e03346f871e 100644 --- a/src/main/java/me/zhyd/oauth/url/entity/AuthRefreshTokenEntity.java +++ b/src/main/java/me/zhyd/oauth/url/entity/AuthRefreshTokenEntity.java @@ -11,4 +11,7 @@ import lombok.Getter; @Getter @Builder public class AuthRefreshTokenEntity { + + private String clientId; + private String refreshToken; } diff --git a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java index 85187c85ce8ff5e40deed558758549b3a8cd433d..c8a325516fa34ee96720fd6ca196247d8611e09d 100644 --- a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java +++ b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java @@ -57,11 +57,6 @@ public class UrlBuilder { private static final String QQ_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}"; private static final String QQ_OPENID_PATTERN = "{0}?access_token={1}&unionid={2}"; - private static final String WECHAT_AUTHORIZE_PATTERN = "{0}?appid={1}&redirect_uri={2}&response_type=code&scope=snsapi_login&state={3}#wechat_redirect"; - private static final String WECHAT_ACCESS_TOKEN_PATTERN = "{0}?appid={1}&secret={2}&code={3}&grant_type=authorization_code"; - private static final String WECHAT_REFRESH_TOKEN_PATTERN = "{0}?appid={1}&grant_type=refresh_token&refresh_token={2}"; - private static final String WECHAT_USER_INFO_PATTERN = "{0}?access_token={1}&openid={2}&lang=zh_CN"; - private static final String TAOBAO_AUTHORIZE_PATTERN = "{0}?response_type=code&client_id={1}&redirect_uri={2}&state={3}&view=web"; private static final String TAOBAO_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code"; @@ -440,52 +435,6 @@ public class UrlBuilder { return MessageFormat.format(ALIPAY_AUTHORIZE_PATTERN, AuthSource.ALIPAY.authorize(), clientId, redirectUrl, getState(state)); } - /** - * 获取微信 授权地址 - * - * @param clientId 微信 应用的appid - * @param redirectUrl 微信 应用授权成功后的回调地址 - * @param state 随机字符串,用于保持会话状态,防止CSRF攻击 - * @return full url - */ - public static String getWeChatAuthorizeUrl(String clientId, String redirectUrl, String state) { - return MessageFormat.format(WECHAT_AUTHORIZE_PATTERN, AuthSource.WECHAT.authorize(), clientId, redirectUrl, getState(state)); - } - - /** - * 获取微信 token的接口地址 - * - * @param clientId 微信 应用的appid - * @param clientSecret 微信 应用的secret - * @param code 微信 授权前的code,用来换token - * @return full url - */ - public static String getWeChatAccessTokenUrl(String clientId, String clientSecret, String code) { - return MessageFormat.format(WECHAT_ACCESS_TOKEN_PATTERN, AuthSource.WECHAT.accessToken(), clientId, clientSecret, code); - } - - /** - * 获取微信 用户详情的接口地址 - * - * @param token 微信 应用返回的 access token - * @param openId 微信 应用返回的openId - * @return full url - */ - public static String getWeChatUserInfoUrl(String token, String openId) { - return MessageFormat.format(WECHAT_USER_INFO_PATTERN, AuthSource.WECHAT.userInfo(), token, openId); - } - - /** - * 获取微信 刷新令牌 地址 - * - * @param clientId 微信 应用的appid - * @param refreshToken 微信 应用返回的刷新token - * @return full url - */ - public static String getWeChatRefreshUrl(String clientId, String refreshToken) { - return MessageFormat.format(WECHAT_REFRESH_TOKEN_PATTERN, AuthSource.WECHAT.refresh(), clientId, refreshToken); - } - /** * 获取Taobao token的接口地址: 淘宝的授权登录,在这一步就会返回用户信息 *