jfinal-weixin 用户授权登录

来源:互联网 发布:春风沉醉的夜晚知乎 编辑:程序博客网 时间:2024/06/05 07:21

1:微信拦截器

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");        }    }}




原创粉丝点击