2:微信授权登录
在AppConst.java定义一个常量
/*微信跳转页面 的session key*/ public static final String WX_REDIRECT_URL = "wx_redirect_url";
WechatConstants.java
public static final String AppId = "xxxx"; public static final String AppSecret = "xxxx"; public static final String token = "项目token换成自己的"; public static final Boolean encryptMessage = false; public static final String encodingAesKey="setting it in config file";
/** * 用户同意授权,获取code * * @param url * @return */ public static String buildUrl(String url) { try { return SnsAccessTokenApi.getAuthorizeURL(WechatConstants.AppId, URLEncoder.encode(url, "UTF-8"), "STATE", false); } catch (Exception e) { e.printStackTrace(); } return null; }
// ====================================== // Package Name:com.kingyee.interceptor // File Name:WechatInterceptor.java // Create Date:2017年08月18日 10:12 // ====================================== package com.kingyee.interceptor; import com.jfinal.aop.Interceptor; import com.jfinal.aop.Invocation; import com.jfinal.core.Controller; import com.kingyee.common.AppConst; import com.kingyee.common.BaseUrl; import com.kingyee.wechat.menu.WechatConstants; import org.apache.log4j.Logger; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; /** * 微信拦截器 * * @author 李芳 * @version 2017年08月18日 10:12 */ public class WechatInterceptor implements Interceptor { Logger log = Logger.getLogger(getClass()); @Override public void intercept(Invocation ai) { Controller controller = ai.getController(); HttpSession session = controller.getSession(); if (null != session && session.getAttribute(AppConst.WX_USER_SESSION_NAME) != null) { ai.invoke(); return; } else { try { //--------------- 保存微信跳转开始 ------------------------- if (!isAjax(controller.getRequest())) { //非Ajax请求 讲当前的url存入session,登录完成后,继续跳转到这个页面 String requestURI = controller.getRequest().getRequestURI(); //如果这个页面带参数咋办,取出参数 String queryString = controller.getRequest().getQueryString(); if (queryString != null) { if (!queryString.startsWith("?")) { queryString = "?" + queryString; } requestURI = requestURI + queryString; } session.setAttribute(AppConst.WX_REDIRECT_URL, requestURI); } else { //是ajax请求 就remove这个 ,在wxLogin 里面有默认的跳转地址,这里不做处理 session.removeAttribute(AppConst.WX_REDIRECT_URL); } //--------------- 保存微信跳转结束 ------------------------- String redirect_url = BaseUrl.BASE_URL + "wx/wxSnsAccess/wxLogin"; ai.getController().redirect(WechatConstants.buildUrl(redirect_url)); } catch (Exception e) { e.printStackTrace(); } } } public static boolean isAjax(HttpServletRequest request) { String requestType = request.getHeader("X-Requested-With"); return requestType != null; } }
// ====================================== // Package Name:com.kingyee.wechat.controller // File Name:WxCodeController.java // Create Date:2017年08月18日 10:18 // ====================================== import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.jfinal.aop.Clear; import com.jfinal.core.Controller; import com.jfinal.kit.JsonKit; import com.jfinal.kit.PropKit; import com.jfinal.log.Log; import com.jfinal.plugin.activerecord.Record; import com.jfinal.weixin.sdk.api.*; import com.kingyee.common.AppConst; import com.kingyee.common.BaseUrl; import com.kingyee.wechat.menu.WechatConstants; import com.kingyee.wechat.wx_user.WxUser; import org.apache.commons.lang3.StringUtils; import java.util.Date; /** * redirect_url 返回一个code * * @author * @version 2017年08月18日 10:18 */ public class WxCodeController extends Controller { static Log log = Log.getLog(WxCodeController.class); public ApiConfig getApiConfig() { ApiConfig ac = new ApiConfig(); ac.setAppId(WechatConstants.AppId); ac.setAppSecret(WechatConstants.AppSecret); ac.setToken(WechatConstants.token); ac.setEncryptMessage(WechatConstants.encryptMessage); ac.setEncodingAesKey(WechatConstants.encodingAesKey); return ac; } /** * 用户同意授权,获取code */ @Clear public void wxLogin() { int subscribe = 0; String code = super.getPara("code"); String state = getPara("state"); if (StringUtils.isNoneEmpty(code)) { ApiConfig config = getApiConfig(); ApiConfigKit.setThreadLocalApiConfig(config); String appId = ApiConfigKit.getApiConfig().getAppId(); String secret = ApiConfigKit.getApiConfig().getAppSecret(); SnsAccessToken accessToken = SnsAccessTokenApi.getSnsAccessToken(appId, secret, code); WxUser wxUser = WxUser.me.findByOpenId(accessToken.getOpenid()); if (wxUser != null) { WxUser token = getSessionAttr(AppConst.WX_USER_SESSION_NAME); if (token != null) { getSession().removeAttribute(AppConst.WX_USER_SESSION_NAME); } getSession().setAttribute(AppConst.WX_USER_SESSION_NAME, wxUser); } else { //通过access_token和openid拉取用户信息了。 ApiResult apiResult = SnsApi.getUserInfo(accessToken.getAccessToken(), accessToken.getOpenid()); log.warn("getUserInfo:" + apiResult.getJson()); if (apiResult.isSucceed()) { JSONObject jsonObject = JSON.parseObject(apiResult.getJson()); log.info(jsonObject.toJSONString()); //用户可能是通过朋友圈等并未关注公众号过来的 WxUser othersChanUser = new WxUser(); /*open_id*/ othersChanUser.set("open_id", accessToken.getOpenid()); /*access_token*/ othersChanUser.set("access_token", accessToken.getAccessToken()); /*昵称*/ othersChanUser.set("nickname", apiResult.getStr("nickname")); /*用户头像*/ othersChanUser.set("headimgurl", apiResult.getStr("headimgurl")); /*性别*/ othersChanUser.set("wx_sex", apiResult.getInt("sex")); /*城市*/ othersChanUser.set("wx_city_name", apiResult.getStr("city")); /*用户所在国家*/ othersChanUser.set("wx_country", apiResult.getStr("country")); /*省份*/ othersChanUser.set("wx_province_name", apiResult.getStr("province")); /*创建时间*/ othersChanUser.set("wx_create_time", new Date().getTime()); //获取用户信息判断是否关注 ApiResult userInfo = UserApi.getUserInfo(accessToken.getOpenid()); log.warn(JsonKit.toJson("is subsribe>>" + userInfo)); if (userInfo.isSucceed()) { String userStr = userInfo.toString(); subscribe = JSON.parseObject(userStr).getIntValue("subscribe"); othersChanUser.set("subscribe", subscribe); } othersChanUser.save(); WxUser token = getSessionAttr(AppConst.WX_USER_SESSION_NAME); if (token != null) { getSession().removeAttribute(AppConst.WX_USER_SESSION_NAME); } getSession().setAttribute(AppConst.WX_USER_SESSION_NAME, othersChanUser); } } //--------------- 微信跳转开始 ------------------------- String url = (String) getSession().getAttribute(AppConst.WX_REDIRECT_URL); System.out.println(url+"-------shadan"); log.info(url+"-------------------------ai------"); if (url == null) { url = BaseUrl.BASE_URL+"wx/index"; } if (url.startsWith("/")) { url = url.substring(1); } redirect(BaseUrl.BASE_URL + url); //--------------- 微信跳转结束 ------------------------- } else { renderText("code is null"); } } }