微信公众号 -授权-登陆

/**
 * 微信授权-获取微信信息 控制层
 */
@Controller
@RequestMapping("/waxberry/wx")
public class WechatController {

    protected Logger log = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private CustomerService customerService;


    /**
     * 判断入口
     *
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value = "/judgmentEntry")
    public String judgmentEntry(HttpServletRequest request, HttpServletResponse response,String signs) {

        Subject subject = SecurityUtils.getSubject();
        if (subject.isAuthenticated()) {
            SecurityUtils.getSubject().logout();
        }
        //获取客户端浏览器和操作系统信息
        String ua = request.getHeader("User-Agent");
        log.info("请求登录:" + ua);
        // 开始判断登录渠道
        //判断用户是否通过浏览器登录
        if (!StringUtils.isEmpty(ua)) {
            if (ua.contains("MicroMessenger")) {
                // 微信访问, 开始通过静默微信授权进行登录
                log.info("微信访问, 开始通过静默微信授权进行登录");
                //return "redirect:/oauth2.wx"
            } else {
                log.info("非微信渠道");
            }
        }
        /*return "redirect:/pwlogin";*/
        try {
            request.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(request.getRequestURI());

        // 判断是从登录界面进入
        request.getSession().setAttribute("fromLogin", "1");

        Customer customer = new Customer();
        customer.setSigns(signs);
        Customer custo = customerService.selectOne(customer);

        if(custo!=null){
            // 直接微信自动化
            return "redirect:/waxberry/wx/oauth2.wx?signs="+signs;
        }

         return  null;

        //跳页面
        //return "bulk/index/index";
        //跳方法
      //  String signsa="TSYF";
      //  String openId="123456";
      //  return "redirect:/waxberry/wx/home?signs="+signsa+"&openId="+openId;
    }

    /**
     * <pre>
     * 功能: 开始获取微信授权
     * </pre>
     *
     * @param request
     * @return String
     */
    @RequestMapping(value = "/oauth2.wx")
    public String wxAuth(HttpServletRequest request, String signs) {
        try {
            log.info("275-----------");
            Customer customer = new Customer();
            customer.setSigns(signs);
            Customer custo = customerService.selectOne(customer);

            String WX_APPID = custo.getAppId();
            String WX_APPSECRET = custo.getAppSecret();

            log.info("281-----------");

            String backUri = "http://" + Constant.DOMAIN + "/waxberry/wx/wxoauth/handler?signs=" + signs + "&_d=" + new Date().getTime();
            //backUri = backUri+"?userId=b88001&orderNo=" + new Date().getTime() + "&describe=xx&money=1780";
            backUri = URLEncoder.encode(backUri);
            //scope 参数视各自需求而定,这里用scope=snsapi_base 不弹出授权页面直接授权目的只获取统一支付接口的openid
           //snsapi_userinfo
            String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
                    "appid=" + WX_APPID +
                    "&redirect_uri=" +
                    backUri +
                    "&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";

            log.info("开始微信认证:");
            log.info(url);

            return "redirect:" + url;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }

    }

    /**
     * 微信回调地址
     * @param request
     * @return
     */
    @RequestMapping("/wxoauth/handler")
    public String authHandler(HttpServletRequest request) {
        String signs = request.getParameter("signs");

        Customer customer = new Customer();
        customer.setSigns(signs);
        Customer custo = customerService.selectOne(customer);

        String WX_APPID = custo.getAppId();
        String WX_APPSECRET = custo.getAppSecret();

        String uid = request.getParameter("uid");

        String code = request.getParameter("code");
        log.info("----uid------" + uid);
        log.info("-----code-----" + code);
        String openId = "";
        //2016-10-14 新加字段
        //注意,CWY在测试的时候发现 微信服务器会向重定向地址发送两次url请求,第一次code为空  第二次code才有值  测试人员需要注意这个问题
        String access_token = "";
        if (code == null) {
            log.warn("验证失败:code为空");
           // return "redirect:/waxberry/wx/home";
        }
        //   String URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+WX_APPID+"&secret="+WX_APPSECRET+"&code="+code+"&grant_type=authorization_code";

        String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        requestUrl = requestUrl.replace("APPID", WX_APPID);
        requestUrl = requestUrl.replace("SECRET", WX_APPSECRET);
        requestUrl = requestUrl.replace("CODE", code);

        log.info("准备获取token了-->" + requestUrl);
        // 获取授权凭证
        String str = HttpUtil.httpRequest(requestUrl, "GET", null);

        JSONObject jsonObj = JSONObject.parseObject(str);
        if (jsonObj.containsKey("errcode")) {
          //  return "redirect:/waxberry/wx/home>";
        }
        System.out.println(jsonObj);
        openId = jsonObj.getString("openid");
        String unionid = null;
        if (jsonObj.containsKey("unionid")) unionid = jsonObj.getString("unionid");
        access_token = jsonObj.getString("access_token");
        log.info("openId : " + openId);
        log.info("unionid : " + unionid);
        log.info("--------获取access_token--------- : " + access_token);
        // 获得到OPENID后开始查找是否本地有此OPENID的用户,若有则直接进行内部登录,若没有则进入一键注册(只填写手机号和密码)。
        WxUserService us = SpringContextHolder.getBean(WxUserService.class);
        WxUser user = new WxUser();
        user.setOpenId(openId);
        WxUser u = us.selectOne(user);

        if (u == null) { //判断是否绑定
            // 没有历史用户,直接要求绑定
            log.info("没有历史用户,直接要求绑定!");
            //获取用户信息
            Map<String, String> map = getUserInfo(openId, access_token, request);

            if (map == null || map.containsKey("error")) {
                log.error("获取用户信息失败,map为空");
                System.out.println("获取用户信息失败,map为空");
               // return "redirect:/waxberry/wx/home";
                return null;
            }
            user.setAppId(WX_APPID);
            user.setNickName(map.get("nickname"));
            user.setSex(Integer.valueOf(map.get("sex")));
            user.setHeadimageUrl(map.get("headImgURL"));
            user.setCountry(map.get("country"));
            user.setProvince(map.get("province"));
            user.setCity(map.get("city"));

            us.insertSelective(user);

            request.getSession().setAttribute("openId", openId);
            request.getSession().setAttribute("nickName", map.get("nickname"));
            request.getSession().setAttribute("sex",map.get("sex"));
            request.getSession().setAttribute("headImgURL",map.get("headImgURL"));
            request.getSession().setAttribute("country", map.get("country"));
            request.getSession().setAttribute("province", map.get("province"));
            request.getSession().setAttribute("city", map.get("city"));
            request.getSession().setAttribute("type", "wx");

            return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId;

        } else {

            // 有历史用户,直接登录
            HttpSession session = request.getSession();
            if (session.getAttribute("isUpdate") == null || session.getAttribute("headImgURL") == null) //根据session判断是否需要更新数据
            {
                session.setAttribute("isUpdate", "no");
                session.setMaxInactiveInterval(60 * 60 * 2);
                //获取用户
                Map<String, String> map = getUserInfo(openId, access_token, request);
                if (map == null || map.containsKey("error")) {
                    System.out.println("获取用户信息失败,map为空");
                    return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId;
                }
                map.put("openId", openId);
                try {
                    Example example = new Example(WxUser.class);
                    example.createCriteria().andEqualTo("openId", openId);
                    WxUser users = new WxUser();
                    users.setNickName(map.get("nickname"));
                    users.setSex(Integer.valueOf(map.get("sex")));
                    users.setHeadimageUrl(map.get("headImgURL"));
                    users.setCountry(map.get("country"));
                    users.setProvince(map.get("province"));
                    users.setCity(map.get("city"));

                    int  i = us.updateByExampleSelective(users,example);

                    if (i>0) {
                        System.out.println("用户微信信息更新失败!");
                        return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId;
                    }
                } catch (Exception ex) {
                    log.error("更新微信信息失败!", ex);
                }

            } else // 测试用户头像链接是否过期
            {
                WxUser user_wx = us.selectByPrimaryKey(u.getId());
                String imgurl = user_wx.getHeadimageUrl();
                try {
                    URL url = new URL(imgurl);
                    URLConnection uc = url.openConnection();
                    InputStream is = uc.getInputStream();
                    if (is != null) {
                        is.close();
                    }
                } catch (Exception e) {
                    //更新用户信息 ...
                    Map<String, String> newmap = getUserInfo(openId, access_token, request);
                    log.info("----更新用户信息newmap-----" + newmap);

                    if (newmap == null || newmap.containsKey("error")) {
                        System.out.println("获取用户信息失败,map为空");
                        return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId;
                    }
                    try {
                        Example example = new Example(WxUser.class);
                        example.createCriteria().andEqualTo("openId", openId);
                        WxUser users = new WxUser();
                        users.setNickName(newmap.get("nickname"));
                        users.setSex(Integer.valueOf(newmap.get("sex")));
                        users.setHeadimageUrl(newmap.get("headImgURL"));
                        users.setCountry(newmap.get("country"));
                        users.setProvince(newmap.get("province"));
                        users.setCity(newmap.get("city"));

                        int  i = us.updateByExampleSelective(users,example);

                        if (i>0) {
                            System.out.println("用户微信信息更新失败!");
                            return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId;
                        }
                    } catch (Exception ex) {
                        log.error("更新微信信息失败!", ex);
                    }
                }
            }
            return "redirect:/waxberry/wx/home?signs="+signs+"&openId="+openId;
        }

    }


    /**
     * 获取用户的微信信息
     */
    public Map<String,String > getUserInfo(String openId,String access_token,HttpServletRequest request)
    {
        Map<String, String> map = new HashMap<String, String>();
        String nickname ="nickname";
        String sex ="sex";
        String headImgURL = "headImgURL";
        String country ="country";
        String province ="province";
        String city = "city";
        String error = "error";
        //2016-10-14新加内容
        
        log.info("access_token :"+access_token);
        String URL2 = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openId+"&lang=zh_CN";
        log.info("准备获取用户信息-->"+URL2);
        String infores="";
        try
        {
          //  infores = HttpConnect.getInstance().doGetStr(URL2);
             infores = HttpUtil.httpRequest(URL2, "GET", null);
        }catch(Exception e)
        {
            log.error("准备获取用户信息出现错误", e);
         //   map.put(error,"redirect:/index");
          //  return map;
        }
        String infoValue = "";
        if(StringUtils.isEmpty(infores))
        {
            log.error("出错!!!infores==null");
            map.put(error,"");
            return map;
        }
        else
        {
            try
            {

                JSONObject json = JSONObject.parseObject(infores);
                if(json.containsKey("errcode"))
                {
                    log.info(infoValue);
                    map.put(error,"");
                    return map;
                }
                log.info("json :"+json);
                map.put(nickname,json.getString("nickname") );
                map.put(sex, json.getString("sex"));
                map.put(headImgURL, json.getString("headimgurl"));
                map.put(country, json.getString("country"));
                map.put(province, json.getString("province"));
                map.put(city, json.getString("city"));
            }
            catch (ClassCastException e)
            {
                System.out.println("获取用户信息失败");
                log.error("获取用户信息失败", e);
                map.put(error,"");
               return map;
            }

            //用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
            log.info("map :"+map);
            return map;
        }


    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值