当前位置: 首页 > 工具软件 > JFinal Weixin > 使用案例 >

jfinal-weixin 用户授权登录

谢财
2023-12-01

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




 类似资料: