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() { + }); + } +}