java开发Demo~微信扫码登录demo

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/han_xiaoxue/article/details/78933595

首先声明,此demo不是直接可以跑通的,请把代码放到自己项目里,然后服务器端部署启动。
这一切的前提,请将微信公众平台 全部配好。(这个公众平台配明白,不容易的)

开发所需15个工具类

这里写图片描述
可以在我的资源中下载
详细代码不写
说明下WeiXinUtil.java中的参数
这里写图片描述

Ip白名单页数需要设置的,否则会连接失败。
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
浏览器打开这个路径,报错提示的ip,就是你需要设置进去的ip,不要写端口号。
这里写图片描述

下面说下代码:
Controller

@Controller
@RequestMapping(value = "/index")
public class wxloginController {
    int type = 0;
    String type2 = "";
    //返回微信二维码,可供扫描登录
        @RequestMapping(value = "weixin")
        @ResponseBody
        public Map<String,Object> weixin(HttpServletRequest request) throws IOException{
            Map<String,Object> map = new HashMap<String,Object>();
            WeiXinUtil wxU = new WeiXinUtil();
//此路径需要注意,http://www.shuke.com是你需要配置到微信平台里的域名,必须是真实域名。
//index/WeixinTest,就是你扫码成功后,自动执行的方法(在我代码里是当前方法的下一个方法。)
            String url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx586b2g53468&redirect_uri=http://www.shuke.com/index/WeiXinTest&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect";
            //将url转换成短链接,提高扫码速度跟成功率
            String shorturl=wxU.shortURL(url, wxU.appid, wxU.appSecret);
            map.put("shorturl", shorturl);
            return map;
        }

        //微信获取用户信息
        @RequestMapping(value = "WeiXinTest")
        public ModelAndView WeiXinTest(ModelMap map,HttpServletRequest request,HttpServletResponse response){
            ModelAndView mav = new ModelAndView();
            response.setCharacterEncoding("utf-8");
            String code = request.getParameter("code");
         // 通过code获取access_token
            WeixinOauth2Token oauth2Token;
                oauth2Token = WeiXinUtil.getOauth2AccessToken(WeiXinUtil.appid, WeiXinUtil.appSecret, code);
            System.out.println(oauth2Token.toString());
               String accessToken=oauth2Token.getAccessToken();
               String openId=oauth2Token.getOpenId();
               //获取到用户的基本信息
               SNSUserInfo snsUserInfo=null;
               if(type==0){
                  snsUserInfo = WeiXinUtil.getSNSUserInfo(accessToken, openId); 
               }
//             aa(map,request);
               if(snsUserInfo!=null){
                   type=1;
               String id = snsUserInfo.getOpenId();//微信用户id
               String name = snsUserInfo.getNickname();//微信用户Name
               String logo = snsUserInfo.getHeadImgUrl();//微信用户头像
               type2=id;
/*--------------------登录逻辑请写这-------------------*/
//             查询库中是否有user

               mav.setViewName("info");
            }else{
                mav.setViewName("info2");
            }
            return mav;
        }

        //扫码登录成功后,将用户信息放入session中,并且跳转页面
        @RequestMapping(value = "fangSession")
        public ModelAndView fangSession(HttpServletRequest request,String userId,String h,String chapterId){
            ModelAndView mav = new ModelAndView();
            HttpSession session = request.getSession();
               User sessionuser=new User();
               sessionuser.setId(userId);
/*----------建议存完整的user,此时session中的user只有Id---------------*/
               session.setAttribute("login_user", sessionuser);
               User uu = (User)session.getAttribute("login_user");
               mav.setViewName("/front/personalCenter");  
               return mav;
        }

        //判断用户是否扫码登录成功,以便于前台页面跳转
        @RequestMapping(value = "successDL")
        @ResponseBody
        public Map<String,Object> successDL(String a){
            Map<String,Object> map = new HashMap<String,Object>();
            try
            {
                Thread.sleep(500);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            if("ok".equals(a)){
                type=1;
            }
            if(type==1){
                map.put("userId", type2);
            }
            map.put("type", type);
            return map;
        }

        @RequestMapping(value = "type")
        public void type(int a){
                type=a;
        }
}

这里写图片描述

展现二维码的页面

jsp代码

<div class="mtb20 h250 boc" id="ma"></div>

js代码

$(function(){
$.post("${pageContext.request.contextPath}/index/weixin",function(data){
         var ma = data.shorturl;
         var srcMa = "http://qr.topscan.com/api.php?text="+ma;
        var imgg = "<img class='h-img' alt='' src="+srcMa+">";
        $("#ma").empty().append(imgg);
        });
   });

哈哈 主要是推荐我们家在线学习平台
www.shibeike.com.cn,这里做的微信登录,已经成功了。大家可以看一下啊
这里写图片描述

登录成功后PC端页面跳转逻辑

主要是js对Controller的不停访问,就是个轮回,看什么时候登录成功了,就停止轮回。
后台采用的是全局变量,登录成功了改变这个变量的值,后台轮回到了,哎,小家伙变了,成功了。那我就得访问Controller里 ,让pc端页面跳转的方法了。
Js代码(用于轮回),这里面访问的COntroller里的方法 上面都写了。

<script>
var test = 0;
    $(function(){
/* --------------------------展示微信登录二维码----------hxx--------------- */
        $.post("${pageContext.request.contextPath}/index/weixin",function(data){
         var ma = data.shorturl;
         var srcMa = "http://qr.topscan.com/api.php?text="+ma;
        var imgg = "<img class='h-img' alt='' src="+srcMa+">";
        $("#ma").empty().append(imgg);
        });
        $.post("<%=basePath%>index/type",{"a":0});
        panduan();
/* -------------展示微信登录二维码----------hxx------------ */
    })
/*-------------- 微信扫码是否成功的判断--------hxx---------- */
    function panduan(){
    $.post("<%=basePath%>index/successDL",function(data){
        if(data.type==1){
            var userId = data.userId;
            var h = $("#h").val();
            var chapterId = $("#chapterId").val();
            var chapterId = $("#chapterId").val();
            $.post("<%=basePath%>index/type",{"a":0});
            window.location.href='<%=basePath%>index/fangSession?userId='+userId+'&h='+h;
        <%--    window.location.href='<%=basePath%>index/showIndex'; --%>

        }else if(data.type==2){
            $.post("<%=basePath%>index/type",{"a":0});
        }else if(data.type==0 && test!=200){
            /* setInterval("panduan()",8000); */
            test = test+1;
            panduan();
        }else if(test==300){
            alert("登录码已失效,请刷新页面更新验证码!");
            $.post("<%=basePath%>index/type",{"a":5});
        } 
    });

}
    /*------------------------ 微信扫码是否成功的判断-------------hxx---------- */
</script>

然后,就成功了呢。
代码下载地址
https://github.com/weiaiwan/weixinsaomalogin
另外,微信扫码“支付”代码地址
http://blog.csdn.net/han_xiaoxue/article/details/78954749

PS

有位小伙伴用了我博文代码后,发现代码调不通。
后来发现他是这个问题,在公众平台配置回调域名了,单未将此MP_verify…….txt文件放到项目的webapp下。
这里写图片描述
放入后,重启项目。浏览器可以访问成功此txt文件
这里写图片描述
再到公众平台是看,回调域名就配置成功了。

展开阅读全文

没有更多推荐了,返回首页