优化TokenCreator相关类

This commit is contained in:
jinyu 2015-06-12 00:31:26 +08:00
parent d1ede56860
commit 76ae9d58e3
14 changed files with 107 additions and 47 deletions

View File

@ -36,6 +36,10 @@ public final class Consts {
* 企业号获取token的url * 企业号获取token的url
*/ */
public static final String QY_ASSESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s"; public static final String QY_ASSESS_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
/**
* 企业号提供商获取token的url
*/
public static final String QY_PROVIDER_TOKEN_URL = "https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token";
/** /**
* 公众平台jssdk获取token的url * 公众平台jssdk获取token的url
*/ */

View File

@ -8,7 +8,7 @@ import com.alibaba.fastjson.JSON;
import com.foxinmy.weixin4j.model.WeixinAccount; import com.foxinmy.weixin4j.model.WeixinAccount;
/** /**
* 公众号配置 * 公众号配置信息 class路径下weixin4j.properties文件
* *
* @className ConfigUtil * @className ConfigUtil
* @author jy * @author jy
@ -40,7 +40,7 @@ public class ConfigUtil {
} }
/** /**
* 获取weixin.properties文件中的key值 * 获取weixin4j.properties文件中的key值
* *
* @param key * @param key
* @return * @return

View File

@ -11,6 +11,7 @@ import com.foxinmy.weixin4j.model.WeixinAccount;
import com.foxinmy.weixin4j.mp.model.OauthToken; import com.foxinmy.weixin4j.mp.model.OauthToken;
import com.foxinmy.weixin4j.mp.model.User; import com.foxinmy.weixin4j.mp.model.User;
import com.foxinmy.weixin4j.util.ConfigUtil; import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.StringUtil;
/** /**
* oauth授权 * oauth授权
@ -26,21 +27,12 @@ public class OauthApi extends MpApi {
/** /**
* @see {@link com.foxinmy.weixin4j.mp.api.OauthApi#getAuthorizeURL(String, String,String)} * @see {@link com.foxinmy.weixin4j.mp.api.OauthApi#getAuthorizeURL(String, String,String)}
* *
* @return * @return 请求授权的URL
*/ */
public String getAuthorizeURL() { public String getAuthorizeURL() {
return getAuthorizeURL("state");
}
/**
* @see {@link com.foxinmy.weixin4j.mp.api.OauthApi#getAuthorizeURL(String, String,String)}
*
* @return
*/
public String getAuthorizeURL(String state) {
String appId = ConfigUtil.getWeixinAccount().getId(); String appId = ConfigUtil.getWeixinAccount().getId();
String redirectUri = ConfigUtil.getValue("redirect_uri"); String redirectUri = ConfigUtil.getValue("redirect_uri");
return getAuthorizeURL(appId, redirectUri, state); return getAuthorizeURL(appId, redirectUri, "state", "snsapi_login");
} }
/** /**
@ -52,14 +44,15 @@ public class OauthApi extends MpApi {
* 重定向地址 * 重定向地址
* @param state * @param state
* 用于保持请求和回调的状态授权请求后原样带回给第三方 * 用于保持请求和回调的状态授权请求后原样带回给第三方
* @return 请求的URL * @return 请求授权的URL
*/ */
public String getAuthorizeURL(String appId, String redirectUri, String state) { public String getAuthorizeURL(String appId, String redirectUri,
String state, String... scopes) {
String sns_user_auth_uri = getRequestUri("sns_user_auth_uri"); String sns_user_auth_uri = getRequestUri("sns_user_auth_uri");
try { try {
return String.format(sns_user_auth_uri, appId, return String.format(sns_user_auth_uri, appId,
URLEncoder.encode(redirectUri, Consts.UTF_8.name()), URLEncoder.encode(redirectUri, Consts.UTF_8.name()),
"snsapi_login", state); StringUtil.join(scopes, ','), state);
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
; ;
} }
@ -92,8 +85,8 @@ public class OauthApi extends MpApi {
public OauthToken getOauthToken(String code, String appid, String appsecret) public OauthToken getOauthToken(String code, String appid, String appsecret)
throws WeixinException { throws WeixinException {
String user_token_uri = getRequestUri("sns_user_token_uri"); String user_token_uri = getRequestUri("sns_user_token_uri");
WeixinResponse response = weixinClient.get(String.format(user_token_uri, appid, WeixinResponse response = weixinClient.get(String.format(
appsecret, code)); user_token_uri, appid, appsecret, code));
return response.getAsObject(new TypeReference<OauthToken>() { return response.getAsObject(new TypeReference<OauthToken>() {
}); });
@ -122,8 +115,8 @@ public class OauthApi extends MpApi {
public OauthToken refreshToken(String appId, String refreshToken) public OauthToken refreshToken(String appId, String refreshToken)
throws WeixinException { throws WeixinException {
String sns_token_refresh_uri = getRequestUri("sns_token_refresh_uri"); String sns_token_refresh_uri = getRequestUri("sns_token_refresh_uri");
WeixinResponse response = weixinClient.get(String.format(sns_token_refresh_uri, WeixinResponse response = weixinClient.get(String.format(
appId, refreshToken)); sns_token_refresh_uri, appId, refreshToken));
return response.getAsObject(new TypeReference<OauthToken>() { return response.getAsObject(new TypeReference<OauthToken>() {
}); });
@ -141,7 +134,8 @@ public class OauthApi extends MpApi {
public boolean authAccessToken(String accessToken, String openId) { public boolean authAccessToken(String accessToken, String openId) {
String sns_auth_token_uri = getRequestUri("sns_auth_token_uri"); String sns_auth_token_uri = getRequestUri("sns_auth_token_uri");
try { try {
weixinClient.get(String.format(sns_auth_token_uri, accessToken, openId)); weixinClient.get(String.format(sns_auth_token_uri, accessToken,
openId));
return true; return true;
} catch (WeixinException e) { } catch (WeixinException e) {
; ;

View File

@ -8,6 +8,7 @@ import com.foxinmy.weixin4j.model.Consts;
import com.foxinmy.weixin4j.model.Token; import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.token.TokenCreator; import com.foxinmy.weixin4j.token.TokenCreator;
import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.util.ConfigUtil;
/** /**
* 微信公众平台JSTICKET创建者 * 微信公众平台JSTICKET创建者
@ -26,6 +27,16 @@ public class WeixinJSTicketCreator implements TokenCreator {
private final TokenHolder weixinTokenHolder; private final TokenHolder weixinTokenHolder;
private final WeixinHttpClient httpClient; private final WeixinHttpClient httpClient;
/**
* jssdk
*
* @param weixinTokenHolder
* <font color="red">公众平台的access_token</font>
*/
public WeixinJSTicketCreator(TokenHolder weixinTokenHolder) {
this(ConfigUtil.getWeixinAccount().getId(), weixinTokenHolder);
}
/** /**
* jssdk * jssdk
* *
@ -47,8 +58,9 @@ public class WeixinJSTicketCreator implements TokenCreator {
@Override @Override
public Token createToken() throws WeixinException { public Token createToken() throws WeixinException {
WeixinResponse response = httpClient.get(String.format(Consts.MP_JS_TICKET_URL, WeixinResponse response = httpClient.get(String.format(
weixinTokenHolder.getToken().getAccessToken())); Consts.MP_JS_TICKET_URL, weixinTokenHolder.getToken()
.getAccessToken()));
JSONObject result = response.getAsJson(); JSONObject result = response.getAsJson();
Token token = new Token(result.getString("ticket")); Token token = new Token(result.getString("ticket"));
token.setExpiresIn(result.getIntValue("expires_in")); token.setExpiresIn(result.getIntValue("expires_in"));

View File

@ -28,10 +28,11 @@ public class WeixinTokenCreator implements TokenCreator {
private final String secret; private final String secret;
public WeixinTokenCreator() { public WeixinTokenCreator() {
WeixinAccount weixinAccount = ConfigUtil.getWeixinAccount(); this(ConfigUtil.getWeixinAccount());
this.appid = weixinAccount.getId(); }
this.secret = weixinAccount.getSecret();
this.httpClient = new WeixinHttpClient(); public WeixinTokenCreator(WeixinAccount weixinAccount) {
this(weixinAccount.getId(), weixinAccount.getSecret());
} }
public WeixinTokenCreator(String appid, String secret) { public WeixinTokenCreator(String appid, String secret) {

View File

@ -20,4 +20,7 @@ bill_path=/tmp/weixin4j/bill
# ca\u8bc1\u4e66\u5b58\u653e\u7684\u5b8c\u6574\u8def\u5f84 (V2\u7248\u672c\u540e\u7f00\u4e3a*.pfx,V3\u7248\u672c\u540e\u7f00\u4e3a*.p12) # ca\u8bc1\u4e66\u5b58\u653e\u7684\u5b8c\u6574\u8def\u5f84 (V2\u7248\u672c\u540e\u7f00\u4e3a*.pfx,V3\u7248\u672c\u540e\u7f00\u4e3a*.p12)
ca_file=/tmp/weixin4j/xxxxx.p12 ca_file=/tmp/weixin4j/xxxxx.p12
# classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199 # classpath\u8def\u5f84\u4e0b\u53ef\u4ee5\u8fd9\u4e48\u5199
# ca_file=classpath:xxxxx.pfx # ca_file=classpath:xxxxx.pfx
# oauth\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url
redirect_uri=

View File

@ -41,15 +41,20 @@ weixin4j.properties说明
| account | 微信企业号信息 `json格式` | | account | 微信企业号信息 `json格式` |
| token_path | 使用FileTokenHolder时token保存的物理路径 | | token_path | 使用FileTokenHolder时token保存的物理路径 |
| media_path | 调用媒体接口时保存媒体文件的物理路径 | | media_path | 调用媒体接口时保存媒体文件的物理路径 |
| redirect_uri | 调用OauthApi接口时需要填写的重定向路径 |
示例(properties中换行用右斜杆\\) 示例(properties中换行用右斜杆\\)
account={"id":"corpid","secret":"corpsecret",\ account={"id":"corpid","secret":"corpsecret",\
"token":"企业号中应用在回调模式下的token",\ "token":"企业号中应用在回调模式下的token",\
"encodingAesKey":"企业号中应用在回调模式下AES加密密钥"} "encodingAesKey":"企业号中应用在回调模式下AES加密密钥",\
"providerSecret:"提供商的secret"}
token_path=/tmp/weixin4j/token token_path=/tmp/weixin4j/token
media_path=/tmp/weixin4j/media media_path=/tmp/weixin4j/media
#微信登陆授权的重定向路径(使用OauthApi时需要填写)
redirect_uri=http://xxx
2.实例化一个`WeixinProxy`对象,调用API 2.实例化一个`WeixinProxy`对象,调用API

View File

@ -62,7 +62,7 @@ public class WeixinProxy {
} }
/** /**
* appid,appsecret * corpid,corpsecret
* *
* @param corpid * @param corpid
* @param corpsecret * @param corpsecret

View File

@ -78,4 +78,9 @@ batch_replaceuser_uri={api_base_url}/batch/replaceuser?access_token=%s
batch_replaceparty_uri={api_base_url}/batch/replaceparty?access_token=%s batch_replaceparty_uri={api_base_url}/batch/replaceparty?access_token=%s
batch_replaceparty.cvs={"header":"\u90e8\u95e8\u540d\u79f0,\u90e8\u95e8ID,\u7236\u90e8\u95e8ID,\u6392\u5e8f","column":["name","id","parentid","order"]} batch_replaceparty.cvs={"header":"\u90e8\u95e8\u540d\u79f0,\u90e8\u95e8ID,\u7236\u90e8\u95e8ID,\u6392\u5e8f","column":["name","id","parentid","order"]}
# \u83b7\u53d6\u5f02\u6b65\u4efb\u52a1\u6267\u884c\u7ed3\u679c # \u83b7\u53d6\u5f02\u6b65\u4efb\u52a1\u6267\u884c\u7ed3\u679c
batch_getresult_uri={api_base_url}/batch/getresult?access_token=%s&jobid=%s batch_getresult_uri={api_base_url}/batch/getresult?access_token=%s&jobid=%s
# \u63d0\u4f9b\u5546oauth\u6388\u6743
provider_oauth_uri=https://qy.weixin.qq.com/cgi-bin/loginpage?corp_id=%s&redirect_uri=%s&state=%s
# \u4f01\u4e1a\u53f7\u7ba1\u7406\u5458\u767b\u5f55\u4fe1\u606f
oauth_logininfo_uri={api_base_url}/service/get_login_info?provider_access_token=%s

View File

@ -30,8 +30,22 @@ public class WeixinQyAccount extends WeixinAccount {
super(corpid, corpsecret); super(corpid, corpsecret);
} }
/**
* 提供商的secret
*/
private String providerSecret;
public String getProviderSecret() {
return providerSecret;
}
public void setProviderSecret(String providerSecret) {
this.providerSecret = providerSecret;
}
@Override @Override
public String toString() { public String toString() {
return "WeixinQyAccount [" + super.toString() + "]"; return "WeixinQyAccount [" + super.toString() + ", providerSecret="
+ providerSecret + "]";
} }
} }

View File

@ -8,9 +8,10 @@ import com.foxinmy.weixin4j.model.Consts;
import com.foxinmy.weixin4j.model.Token; import com.foxinmy.weixin4j.model.Token;
import com.foxinmy.weixin4j.token.TokenCreator; import com.foxinmy.weixin4j.token.TokenCreator;
import com.foxinmy.weixin4j.token.TokenHolder; import com.foxinmy.weixin4j.token.TokenHolder;
import com.foxinmy.weixin4j.util.ConfigUtil;
/** /**
* 微信企业号JSTICKET创建 * 微信企业号JSTICKET创建
* *
* @className WeixinJSTicketCreator * @className WeixinJSTicketCreator
* @author jy * @author jy
@ -22,30 +23,41 @@ import com.foxinmy.weixin4j.token.TokenHolder;
*/ */
public class WeixinJSTicketCreator implements TokenCreator { public class WeixinJSTicketCreator implements TokenCreator {
private final String appid; private final String corpid;
private final TokenHolder weixinTokenHolder; private final TokenHolder weixinTokenHolder;
private final WeixinHttpClient httpClient; private final WeixinHttpClient httpClient;
/**
* jssdk
*
* @param weixinTokenHolder
* <font color="red">公众平台的access_token</font>
*/
public WeixinJSTicketCreator(TokenHolder weixinTokenHolder) {
this(ConfigUtil.getWeixinAccount().getId(), weixinTokenHolder);
}
/** /**
* <font color="red">企业号的的access_token</font> * <font color="red">企业号的的access_token</font>
* *
* @param weixinTokenHolder * @param weixinTokenHolder
*/ */
public WeixinJSTicketCreator(String appid, TokenHolder weixinTokenHolder) { public WeixinJSTicketCreator(String corpid, TokenHolder weixinTokenHolder) {
this.appid = appid; this.corpid = corpid;
this.weixinTokenHolder = weixinTokenHolder; this.weixinTokenHolder = weixinTokenHolder;
this.httpClient = new WeixinHttpClient(); this.httpClient = new WeixinHttpClient();
} }
@Override @Override
public String getCacheKey() { public String getCacheKey() {
return String.format("qy_jsticket_%s", appid); return String.format("qy_jsticket_%s", corpid);
} }
@Override @Override
public Token createToken() throws WeixinException { public Token createToken() throws WeixinException {
WeixinResponse response = httpClient.get(String.format(Consts.QY_JS_TICKET_URL, WeixinResponse response = httpClient.get(String.format(
weixinTokenHolder.getToken().getAccessToken())); Consts.QY_JS_TICKET_URL, weixinTokenHolder.getToken()
.getAccessToken()));
JSONObject result = response.getAsJson(); JSONObject result = response.getAsJson();
Token token = new Token(result.getString("ticket")); Token token = new Token(result.getString("ticket"));
token.setExpiresIn(result.getIntValue("expires_in")); token.setExpiresIn(result.getIntValue("expires_in"));

View File

@ -11,7 +11,7 @@ import com.foxinmy.weixin4j.token.TokenCreator;
import com.foxinmy.weixin4j.util.ConfigUtil; import com.foxinmy.weixin4j.util.ConfigUtil;
/** /**
* 微信企业号TOKEN创建 * 微信企业号TOKEN创建
* *
* @className WeixinTokenCreator * @className WeixinTokenCreator
* @author jy * @author jy
@ -28,10 +28,11 @@ public class WeixinTokenCreator implements TokenCreator {
private final String corpsecret; private final String corpsecret;
public WeixinTokenCreator() { public WeixinTokenCreator() {
WeixinAccount weixinAccount = ConfigUtil.getWeixinAccount(); this(ConfigUtil.getWeixinAccount());
this.corpid = weixinAccount.getId(); }
this.corpsecret = weixinAccount.getSecret();
this.httpClient = new WeixinHttpClient(); public WeixinTokenCreator(WeixinAccount weixinAccount) {
this(weixinAccount.getId(), weixinAccount.getSecret());
} }
public WeixinTokenCreator(String corpid, String corpsecret) { public WeixinTokenCreator(String corpid, String corpsecret) {

View File

@ -2,9 +2,13 @@
# \u4f01\u4e1a\u53f7\u4fe1\u606f # \u4f01\u4e1a\u53f7\u4fe1\u606f
account={"id":"wxf10bce209c91d0e2","secret":"cW0OtP7-7YJ7jHKFZaJW2skJHE9bLHadxOswBdVdI2walRBSPfTSA6QqD_QXw8JZ",\ account={"id":"wxf10bce209c91d0e2","secret":"cW0OtP7-7YJ7jHKFZaJW2skJHE9bLHadxOswBdVdI2walRBSPfTSA6QqD_QXw8JZ",\
"token":"gp2eGT5mIpngr",\ "token":"gp2eGT5mIpngr",\
"encodingAesKey":"BRYfV4zPFUJb3v3MySNBg1ERKE3vyyMRoScu76vFySv"} "encodingAesKey":"BRYfV4zPFUJb3v3MySNBg1ERKE3vyyMRoScu76vFySv",\
"providerSecret":"\u63d0\u4f9b\u5546\u7684secret"}
# \u4f7f\u7528FileTokenHolder\u65f6token\u7684\u5b58\u653e\u8def\u5f84 # \u4f7f\u7528FileTokenHolder\u65f6token\u7684\u5b58\u653e\u8def\u5f84
token_path=/tmp/weixin4j/token token_path=/tmp/weixin4j/token
# \u5a92\u4f53\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84 # \u5a92\u4f53\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84
media_path=/tmp/weixin4j/media media_path=/tmp/weixin4j/media
# oauth\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684url
redirect_uri=

View File

@ -2,6 +2,8 @@ package com.foxinmy.weixin4j.server.test;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import java.math.BigDecimal;
import com.foxinmy.weixin4j.exception.WeixinException; import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.handler.BlankMessageHandler; import com.foxinmy.weixin4j.handler.BlankMessageHandler;
import com.foxinmy.weixin4j.handler.DebugMessageHandler; import com.foxinmy.weixin4j.handler.DebugMessageHandler;
@ -112,6 +114,9 @@ public class MessageServerStartup {
} }
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
new MessageServerStartup().test1();
System.err.println(new BigDecimal(new Long(14212345l)).divide(
new BigDecimal("100000"))
.toString());
} }
} }