diff --git a/weixin4j-mp/README.md b/weixin4j-mp/README.md
index 5cdeb3fa..92944097 100644
--- a/weixin4j-mp/README.md
+++ b/weixin4j-mp/README.md
@@ -33,6 +33,8 @@ weixin4j-mp
+ Pay3Api `V3支付API`
+ DataApi `数据统计API`
+
+ + OauthApi `oauth授权API`
* **weixin4j-mp-server**
@@ -46,14 +48,15 @@ weixin4j-mp
2.API的成功调用依赖于正确的appid等数据,创建(或者copy项目里面的)一个名为**weixin.properties**的资源文件放在自己工程中的classpath下.
-| 属性名 | 说明 |
-| :---------- | :-------------- |
-| account | 微信公众号信息 `json格式` |
-| token_path | 使用FileTokenHolder时token保存的物理路径 |
-| qr_path | 调用二维码接口时保存二维码图片的物理路径 |
-| media_path | 调用媒体接口时保存媒体文件的物理路径 |
-| bill_path | 调用下载对账单接口保存excel文件的物理路径 |
-| ca_file | 调用某些接口(支付相关)强制需要auth的ca授权文件 |
+| 属性名 | 说明 |
+| :---------- | :-------------- |
+| account | 微信公众号信息 `json格式` |
+| token_path | 使用FileTokenHolder时token保存的物理路径 |
+| qr_path | 调用二维码接口时保存二维码图片的物理路径 |
+| media_path | 调用媒体接口时保存媒体文件的物理路径 |
+| bill_path | 调用下载对账单接口保存excel文件的物理路径 |
+| ca_file | 调用某些接口(支付相关)强制需要auth的ca授权文件 |
+| redirect_uri | 调用OauthApi接口时需要填写的重定向路径 |
示例(properties中换行用右斜杆\\)
@@ -73,6 +76,9 @@ weixin4j-mp
# ca证书存放的完整路径 (V2版本后缀为*.pfx,V3版本后缀为*.p12)
ca_file=/tmp/weixin/xxxxx.p12
#classpath路径下:ca_file=classpath:xxxxx.p12
+
+ #微信登陆授权的重定向路径
+ redirect_uri=http://xxx
3.在项目根目录下执行`mvn package -Prelease`命令后得到jar包,将`weixin4j-mp-full`包或者`weixin4j-base`和`weixin4j-mp-api`两个包引入到自己的工程.
diff --git a/weixin4j-mp/weixin4j-mp-api/README.md b/weixin4j-mp/weixin4j-mp-api/README.md
index a2f1c03d..9263dc9a 100644
--- a/weixin4j-mp/weixin4j-mp-api/README.md
+++ b/weixin4j-mp/weixin4j-mp-api/README.md
@@ -70,6 +70,7 @@ weixin.properties说明
ca_file=/tmp/weixin/xxxxx.p12
#classpath路径下:ca_file=classpath:xxxxx.p12
+ #微信登陆授权的重定向路径
redirect_uri=http://xxx
2.实例化一个`WeixinProxy`对象,调用API,需要强调的是如果只传入appid,appsecret两个参数将无法调用支付相关接口
diff --git a/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java
new file mode 100644
index 00000000..df6716ae
--- /dev/null
+++ b/weixin4j-mp/weixin4j-mp-api/src/main/java/com/foxinmy/weixin4j/mp/api/OauthApi.java
@@ -0,0 +1,173 @@
+package com.foxinmy.weixin4j.mp.api;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+import com.alibaba.fastjson.TypeReference;
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.http.Response;
+import com.foxinmy.weixin4j.model.Consts;
+import com.foxinmy.weixin4j.model.WeixinMpAccount;
+import com.foxinmy.weixin4j.mp.model.OauthToken;
+import com.foxinmy.weixin4j.mp.model.User;
+import com.foxinmy.weixin4j.util.ConfigUtil;
+
+/**
+ * oauth授权
+ *
+ * @className OauthApi
+ * @author jy
+ * @date 2015年3月6日
+ * @since JDK 1.7
+ * @see 微信登陆
+ */
+public class OauthApi extends MpApi {
+ /**
+ * @see {@link com.foxinmy.weixin4j.mp.api.OauthApi#getAuthorizeURL(String, String,String)}
+ *
+ * @return
+ */
+ 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.getWeixinMpAccount().getId();
+ String redirectUri = ConfigUtil.getValue("redirect_uri");
+ return getAuthorizeURL(appId, redirectUri, state);
+ }
+
+ /**
+ * 请求CODE
+ *
+ * @param appId
+ * 应用ID
+ * @param redirectUri
+ * 重定向地址
+ * @param state
+ * 用于保持请求和回调的状态,授权请求后原样带回给第三方
+ * @return 请求的URL
+ */
+ public String getAuthorizeURL(String appId, String redirectUri, String state) {
+ 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()),
+ "snsapi_login", state);
+ } catch (UnsupportedEncodingException e) {
+ ;
+ }
+ return "";
+ }
+
+ /**
+ * @see {@link com.foxinmy.weixin4j.mp.api.OauthApi#getOauthToken(String, String,String)}
+ *
+ * @return
+ */
+ public OauthToken getOauthToken(String code) throws WeixinException {
+ WeixinMpAccount account = ConfigUtil.getWeixinMpAccount();
+ 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");
+ Response response = request.get(String.format(user_token_uri, appid,
+ appsecret, code));
+
+ return response.getAsObject(new TypeReference() {
+ });
+ }
+
+ /**
+ * @see {@link com.foxinmy.weixin4j.mp.api.OauthApi#getOauthToken(String, String,String)}
+ *
+ * @return
+ */
+ public OauthToken refreshToken(String refreshToken) throws WeixinException {
+ WeixinMpAccount account = ConfigUtil.getWeixinMpAccount();
+ return refreshToken(account.getId(), refreshToken);
+ }
+
+ /**
+ * 刷新token
+ *
+ * @param appId
+ * 应用ID
+ * @param refreshToken
+ * 填写通过access_token获取到的refresh_token参数
+ * @return token对象
+ * @throws WeixinException
+ */
+ public OauthToken refreshToken(String appId, String refreshToken)
+ throws WeixinException {
+ String sns_token_refresh_uri = getRequestUri("sns_token_refresh_uri");
+ Response response = request.get(String.format(sns_token_refresh_uri,
+ appId, refreshToken));
+
+ return response.getAsObject(new TypeReference() {
+ });
+ }
+
+ /**
+ * 验证access_token是否正确
+ *
+ * @param accessToken
+ * 接口调用凭证
+ * @param openId
+ * 用户标识
+ * @return 验证结果
+ */
+ public boolean authAccessToken(String accessToken, String openId) {
+ String sns_auth_token_uri = getRequestUri("sns_auth_token_uri");
+ try {
+ request.get(String.format(sns_auth_token_uri, accessToken, openId));
+ return true;
+ } catch (WeixinException e) {
+ ;
+ }
+ return false;
+ }
+
+ /**
+ * oauth获取用户信息
+ *
+ * @param token
+ * 授权票据
+ * @return 用户对象
+ * @throws WeixinException
+ * @see 拉取用户信息
+ * @see com.foxinmy.weixin4j.mp.model.User
+ * @see com.foxinmy.weixin4j.mp.model.OauthToken
+ * @see {@link com.foxinmy.weixin4j.mp.api.UserApi#getOauthToken(String)}
+ */
+ public User getUser(OauthToken token) throws WeixinException {
+ String user_info_uri = getRequestUri("sns_user_info_uri");
+ Response response = request.get(String.format(user_info_uri,
+ token.getAccessToken(), token.getOpenid()));
+
+ return response.getAsObject(new TypeReference() {
+ });
+ }
+}