diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java
index f1a0e369..9720792d 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java
@@ -11,12 +11,11 @@ import com.foxinmy.weixin4j.model.WeixinAccount;
import com.foxinmy.weixin4j.mp.model.OauthToken;
import com.foxinmy.weixin4j.mp.model.User;
import com.foxinmy.weixin4j.mp.type.Lang;
-import com.foxinmy.weixin4j.util.StringUtil;
import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
/**
* oauth授权
- *
+ *
* @className OauthApi
* @author jinyu(foxinmy@gmail.com)
* @date 2015年3月6日
@@ -28,44 +27,70 @@ public class OauthApi extends MpApi {
private final WeixinAccount account;
+ /**
+ * 默认使用weixin4j.properties里面的appid、appsecret信息
+ */
public OauthApi() {
this(Weixin4jConfigUtil.getWeixinAccount());
}
+ /**
+ * 传入appid、appsecret信息
+ *
+ * @param account
+ */
public OauthApi(WeixinAccount account) {
this.account = account;
}
/**
+ * base静默授权:重定向URL使用weixin4j.properties#user.oauth.redirect.uri
+ *
* @see {@link #getAuthorizeURL(String, String,String)}
- *
+ *
* @return 请求授权的URL
*/
public String getAuthorizeURL() {
- String appId = account.getId();
String redirectUri = Weixin4jConfigUtil
.getValue("user.oauth.redirect.uri");
- return getAuthorizeURL(appId, redirectUri, "state", "snsapi_base");
+ return getAuthorizeURL(redirectUri, "state", "snsapi_base");
}
/**
* 请求CODE
- *
- * @param appId
- * 应用ID
+ *
* @param redirectUri
- * 重定向地址
+ * 重定向地址
+ * 1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名。请注意,
+ * 这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
+ * 2、授权回调域名配置规范为全域名,比如需要网页授权的域名为
+ * :www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、
+ * http://www.qq.com/login.html
+ * 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、
+ * http://qq.com无法进行OAuth2.0鉴权
+ * 3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可
* @param state
* 用于保持请求和回调的状态,授权请求后原样带回给第三方
+ * @param scope
+ * 应用授权作用域,snsapi_base
+ * (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo
+ * (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
+ * 1、 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,
+ * 并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
+ * 2、以snsapi_userinfo为scope发起的网页授权
+ * ,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过
+ * ,所以无须关注,就可在授权后获取该用户的基本信息。
+ * 3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后
+ * ,才能根据用户OpenID来获取用户基本信息
+ * ,这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
* @return 请求授权的URL
*/
- public String getAuthorizeURL(String appId, String redirectUri,
- String state, String... scopes) {
+ public String getAuthorizeURL(String redirectUri, String state, String scope) {
String sns_user_auth_uri = getRequestUri("sns_user_auth_uri");
try {
- return String.format(sns_user_auth_uri, appId,
- URLEncoder.encode(redirectUri, Consts.UTF_8.name()),
- StringUtil.join(scopes, ','), state);
+ return String.format(sns_user_auth_uri, account.getId(),
+ URLEncoder.encode(redirectUri, Consts.UTF_8.name()), scope,
+ state);
} catch (UnsupportedEncodingException e) {
;
}
@@ -73,61 +98,38 @@ public class OauthApi extends MpApi {
}
/**
- * @see {@link #getOauthToken(String, String,String)}
- *
- * @return
+ * code换取token
+ *
+ * @param code
+ * 用户同意授权获取的code,
+ * code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次
+ * ,5分钟未被使用自动过期。
+ * @return oauthtoken信息
*/
public OauthToken getOauthToken(String code) throws WeixinException {
- return getOauthToken(code, account.getId(), account.getSecret());
- }
-
- /**
- * oauth授权code获取token
- *
- * @param code
- * 用户授权后返回的code
- * @param appid
- * 应用ID
- * @param appsecret
- * 应用密钥
- * @return token对象
- * @throws WeixinException
- * @see com.foxinmy.weixin4j.mp.model.OauthToken
- */
- public OauthToken getOauthToken(String code, String appid, String appsecret)
- throws WeixinException {
String user_token_uri = getRequestUri("sns_user_token_uri");
WeixinResponse response = weixinExecutor.get(String.format(
- user_token_uri, appid, appsecret, code));
+ user_token_uri, account.getId(), account.getSecret(), code));
return response.getAsObject(new TypeReference() {
});
}
/**
- * @see {@link #getOauthToken(String, String,String)}
- *
- * @return
- */
- public OauthToken refreshToken(String refreshToken) throws WeixinException {
- return refreshToken(account.getId(), refreshToken);
- }
-
- /**
- * 刷新token
- *
- * @param appId
- * 应用ID
+ * 刷新token:由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,
+ * refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
+ *
+ *
* @param refreshToken
* 填写通过access_token获取到的refresh_token参数
- * @return token对象
- * @throws WeixinException
+ * {@link #getOauthToken(String)}
+ * @see com.foxinmy.weixin4j.mp.model.OauthToken
+ * @return oauthtoken信息
*/
- public OauthToken refreshToken(String appId, String refreshToken)
- throws WeixinException {
+ public OauthToken refreshToken(String refreshToken) throws WeixinException {
String sns_token_refresh_uri = getRequestUri("sns_token_refresh_uri");
WeixinResponse response = weixinExecutor.get(String.format(
- sns_token_refresh_uri, appId, refreshToken));
+ sns_token_refresh_uri, account.getId(), refreshToken));
return response.getAsObject(new TypeReference() {
});
@@ -135,7 +137,7 @@ public class OauthApi extends MpApi {
/**
* 验证access_token是否正确
- *
+ *
* @param oauthToken
* 接口调用凭证
* @param openId
@@ -156,7 +158,7 @@ public class OauthApi extends MpApi {
/**
* oauth获取用户信息(需scope为 snsapi_userinfo)
- *
+ *
* @param token
* 授权信息(token&openid)
* @return 用户对象
@@ -174,7 +176,7 @@ public class OauthApi extends MpApi {
/**
* oauth获取用户信息(需scope为 snsapi_userinfo)
- *
+ *
* @param oauthToken
* 授权票据
* @param openid
@@ -185,6 +187,7 @@ public class OauthApi extends MpApi {
* @throws WeixinException
* @see 授权获取用户信息
+ * @see com.foxinmy.weixin4j.mp.model.OauthToken
* @see com.foxinmy.weixin4j.mp.model.User
*/
public User getUser(String oauthToken, String openid, Lang lang)
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java
index 32011cbc..4a021320 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/WeixinSuiteProxy.java
@@ -23,7 +23,7 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
/**
* 微信第三方应用接口实现
- *
+ *
* @className WeixinSuiteProxy
* @author jinyu(foxinmy@gmail.com)
* @date 2015年6月22日
@@ -37,7 +37,7 @@ public class WeixinSuiteProxy {
/**
* 每个套件授权不一样 suiteId - suiteApi
- */
+ */
private Map suiteMap;
/**
* 供应商API:如登陆URL
@@ -53,7 +53,7 @@ public class WeixinSuiteProxy {
}
/**
- *
+ *
* @param suiteSettings
* 套件信息配置
*/
@@ -61,27 +61,32 @@ public class WeixinSuiteProxy {
this.suiteSettings = suiteSettings;
if (suiteSettings.getWeixinAccount().getSuiteAccounts() != null) {
this.suiteMap = new HashMap();
- for (WeixinAccount suite : suiteSettings.getWeixinAccount().getSuiteAccounts()) {
+ for (WeixinAccount suite : suiteSettings.getWeixinAccount()
+ .getSuiteAccounts()) {
this.suiteMap.put(suite.getId(), new SuiteApi(
- new SuiteTicketHolder(suite.getId(), suite.getSecret(), suiteSettings.getTokenStorager0())));
- this.suiteMap.put(null,
- suiteMap.get(suiteSettings.getWeixinAccount().getSuiteAccounts().get(0).getId()));
+ new SuiteTicketHolder(suite.getId(), suite.getSecret(),
+ suiteSettings.getTokenStorager0())));
+ this.suiteMap.put(
+ null,
+ suiteMap.get(suiteSettings.getWeixinAccount()
+ .getSuiteAccounts().get(0).getId()));
}
}
if (StringUtil.isNotBlank(suiteSettings.getWeixinAccount().getId())
- && StringUtil.isNotBlank(suiteSettings.getWeixinAccount().getProviderSecret())) {
- this.providerApi = new ProviderApi(
- new TokenHolder(
- new WeixinProviderTokenCreator(suiteSettings.getWeixinAccount().getId(),
- suiteSettings.getWeixinAccount().getProviderSecret()),
- suiteSettings.getTokenStorager0()),
+ && StringUtil.isNotBlank(suiteSettings.getWeixinAccount()
+ .getProviderSecret())) {
+ this.providerApi = new ProviderApi(new TokenHolder(
+ new WeixinProviderTokenCreator(suiteSettings
+ .getWeixinAccount().getId(), suiteSettings
+ .getWeixinAccount().getProviderSecret()),
+ suiteSettings.getTokenStorager0()),
suiteSettings.getTokenStorager0());
}
}
/**
* 企业号信息
- *
+ *
* @return
*/
public WeixinQyAccount getWeixinAccount() {
@@ -90,7 +95,7 @@ public class WeixinSuiteProxy {
/**
* 获取套件接口对象(只关注第一个套件
- *
+ *
* @see com.foxinmy.weixin4j.qy.api.SuiteApi
* @return API实例
*/
@@ -100,7 +105,7 @@ public class WeixinSuiteProxy {
/**
* 获取套件接口对象(多个套件
- *
+ *
* @see com.foxinmy.weixin4j.qy.api.SuiteApi
* @param suiteId
* 套件ID
@@ -112,7 +117,7 @@ public class WeixinSuiteProxy {
/**
* 缓存套件ticket(多个套件
- *
+ *
* @param suiteId
* 套件ID
* @param suiteTicket
@@ -122,13 +127,14 @@ public class WeixinSuiteProxy {
* 推送suite_ticket协议
* @throws WeixinException
*/
- public void cacheTicket(String suiteId, String suiteTicket) throws WeixinException {
+ public void cacheTicket(String suiteId, String suiteTicket)
+ throws WeixinException {
suite(suiteId).getTicketHolder().cachingTicket(suiteTicket);
}
/**
* 应用套件授权 需先缓存ticket
- *
+ *
* @see {@link #getSuiteAuthorizeURL(String, String,String)}
* @param suiteId
* 套件ID
@@ -137,13 +143,14 @@ public class WeixinSuiteProxy {
* @throws WeixinException
*/
public String getSuiteAuthorizeURL(String suiteId) throws WeixinException {
- String redirectUri = Weixin4jConfigUtil.getValue("suite.oauth.redirect.uri");
+ String redirectUri = Weixin4jConfigUtil
+ .getValue("suite.oauth.redirect.uri");
return getSuiteAuthorizeURL(suiteId, redirectUri, "state");
}
/**
* 应用套件授权 需先缓存ticket
- *
+ *
* @param suiteId
* 套件ID
* @param redirectUri
@@ -157,9 +164,11 @@ public class WeixinSuiteProxy {
* @return 请求授权的URL
* @throws WeixinException
*/
- public String getSuiteAuthorizeURL(String suiteId, String redirectUri, String state) throws WeixinException {
+ public String getSuiteAuthorizeURL(String suiteId, String redirectUri,
+ String state) throws WeixinException {
try {
- return String.format(URLConsts.SUITE_OAUTH_URL, suiteId, suite(suiteId).getTicketHolder().getTicket(),
+ return String.format(URLConsts.SUITE_OAUTH_URL, suiteId,
+ suite(suiteId).getTicketHolder().getTicket(),
URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state);
} catch (UnsupportedEncodingException e) {
;
@@ -169,9 +178,10 @@ public class WeixinSuiteProxy {
/**
* 第三方套件获取企业号管理员登录信息
- *
+ *
* @param authCode
- * oauth2.0授权企业号管理员登录产生的code
+ * oauth2.0授权企业号管理员登录产生的code:通过成员授权获取到的code,每次成员授权带上的code将不一样,
+ * code只能使用一次,5分钟未被使用自动过期
* @return 登陆信息
* @see com.foxinmy.weixin4j.qy.api.ProviderApi
* @see oauth授权的corpid
* @param targetType
@@ -200,13 +210,14 @@ public class WeixinSuiteProxy {
* 获取登录企业号官网的url
* @throws WeixinException
*/
- public String getLoginUrl(String corpId, LoginTargetType targetType, int agentId) throws WeixinException {
+ public String getLoginUrl(String corpId, LoginTargetType targetType,
+ int agentId) throws WeixinException {
return providerApi.getLoginUrl(corpId, targetType, agentId);
}
/**
* 创建WeixinProxy对象
- *
+ *
* @param suiteId
* 套件ID
* @param authCorpId
@@ -215,7 +226,8 @@ public class WeixinSuiteProxy {
* @return
*/
public WeixinProxy getWeixinProxy(String suiteId, String authCorpId) {
- return new WeixinProxy(suite(suiteId).getPerCodeHolder(authCorpId), suite(suiteId).getSuiteTokenHolder());
+ return new WeixinProxy(suite(suiteId).getPerCodeHolder(authCorpId),
+ suite(suiteId).getSuiteTokenHolder());
}
public final static String VERSION = "1.6.9";
diff --git a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java
index 733ce27a..1c65094d 100644
--- a/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java
+++ b/weixin4j-qy/src/main/java/com/foxinmy/weixin4j/qy/api/OauthApi.java
@@ -9,7 +9,7 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
/**
* 企业号oauth授权
- *
+ *
* @className OauthApi
* @author jinyu(foxinmy@gmail.com)
* @date 2015年6月11日
@@ -27,45 +27,54 @@ import com.foxinmy.weixin4j.util.Weixin4jConfigUtil;
public class OauthApi extends QyApi {
private final WeixinAccount account;
+ /**
+ * 默认使用weixin4j.properties里面的corpid、corpsecret信息
+ */
public OauthApi() {
this(Weixin4jConfigUtil.getWeixinAccount());
}
+ /**
+ * 传入corpid、appsecret信息
+ *
+ * @param account
+ */
public OauthApi(WeixinAccount account) {
this.account = account;
}
/**
- * 企业号用户身份授权
- *
- * @see {@link #getUserAuthorizeURL(String, String,String)}
- *
+ * 企业号用户身份授权:重定向URL使用weixin4j.properties#user.oauth.redirect.uri
+ *
+ * @see {@link #getUserAuthorizeURL(String,String)}
+ *
* @return 请求授权的URL
*/
public String getUserAuthorizeURL() {
- String corpId = account.getId();
- String redirectUri = Weixin4jConfigUtil.getValue("user.oauth.redirect.uri");
- return getUserAuthorizeURL(corpId, redirectUri, "state");
+ String redirectUri = Weixin4jConfigUtil
+ .getValue("user.oauth.redirect.uri");
+ return getUserAuthorizeURL(redirectUri, "state");
}
/**
* 企业号用户身份授权
- *
- * @param corpId
- * 企业号的corpid
+ *
* @param redirectUri
* 重定向地址
* @param state
* 用于保持请求和回调的状态
* @return 请求授权的URL
+ * @see UserApi
+ * @see {@link com.foxinmy.weixin4j.qy.WeixinProxy#getUserByCode(String)}
* @see
+ * "http://qydev.weixin.qq.com/wiki/index.php?title=%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81">
* 企业号用户身份授权
*/
- public String getUserAuthorizeURL(String corpId, String redirectUri, String state) {
+ public String getUserAuthorizeURL(String redirectUri, String state) {
String oauth_uri = getRequestUri("user_oauth_uri");
try {
- return String.format(oauth_uri, corpId, URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state);
+ return String.format(oauth_uri, account.getId(),
+ URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state);
} catch (UnsupportedEncodingException e) {
;
}
@@ -73,21 +82,21 @@ public class OauthApi extends QyApi {
}
/**
- * 企业号第三方提供商授权
- *
- * @see {@link #getThirdAuthorizeURL(String, String,String)}
- *
+ * 企业号第三方提供商授权:重定向URL使用weixin4j.properties#third.oauth.redirect.uri
+ *
+ * @see {@link #getThirdAuthorizeURL(String,String)}
+ *
* @return 请求授权的URL
*/
public String getThirdAuthorizeURL() {
- String corpId = account.getId();
- String redirectUri = Weixin4jConfigUtil.getValue("third.oauth.redirect.uri");
- return getThirdAuthorizeURL(corpId, redirectUri, "state");
+ String redirectUri = Weixin4jConfigUtil
+ .getValue("third.oauth.redirect.uri");
+ return getThirdAuthorizeURL(redirectUri, "state");
}
/**
* 企业号登陆授权
- *
+ *
* @param corpId
* 企业号(提供商)的corpid
* @param redirectUri
@@ -98,13 +107,14 @@ public class OauthApi extends QyApi {
* @see ProviderApi
* @see {@link com.foxinmy.weixin4j.qy.WeixinSuiteProxy#getOUserInfoByCode(String)}
* @see
+ * "http://qydev.weixin.qq.com/wiki/index.php?title=%E6%88%90%E5%91%98%E7%99%BB%E5%BD%95%E6%8E%88%E6%9D%83">
* 企业号第三方提供商授权
*/
- public String getThirdAuthorizeURL(String corpId, String redirectUri, String state) {
+ public String getThirdAuthorizeURL(String redirectUri, String state) {
String oauth_uri = getRequestUri("provider_oauth_uri");
try {
- return String.format(oauth_uri, corpId, URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state);
+ return String.format(oauth_uri, account.getId(),
+ URLEncoder.encode(redirectUri, Consts.UTF_8.name()), state);
} catch (UnsupportedEncodingException e) {
;
}