java微信扫描公众号二维码实现登陆功能

 更新时间:2017年07月13日 15:39:19   作者:zhengshuo  
这篇文章主要为大家详细介绍了PHP微信扫描公众号二维码实现登陆功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java微信扫描公众号二维码实现登陆的具体代码,供大家参考,具体内容如下

前提条件:

1.微信公众平台为服务号,
2.服务号实现了账号绑定功能,即将open_id 与业务系统中的用户名有对应关系

具体实现原理:

1.用户访问业务系统登陆页时,调用二维码接口,获得二维码的ticketid,同时将sessionid,ticketid和二维码的seceneid保存
2.返回登陆页时,根据ticketid获得微信二维码
3.页面通过ajax发送请求,判断是否已经扫描成功。
4.公众平台服务监测到扫描事件,更新seceneid中扫描二维码的业务系统用户名
5.当ajax监测到扫描成功,并返回有业务系统用户名,即可做模拟登陆!

具体代码:

根据sceneID获取,获取ticketId, sceneId可以为sessionID,或者自定义的其他任何值,但必须保证不重复

注意:这里请求的type可以为临时二维码或永久二维码,具体区别可以参看微信公众平台的开发者文档。

public static String getSceneTicket(String type,String sceneId){ 
  WxScene scene = new WxScene(); 
  scene.setAction_name(type); 
  scene.setSceneId(Integer.parseInt(sceneId)); 
  scene.setExpire_seconds(1800); 
  String jsonScene = JSONObject.fromObject(scene).toString(); 
  String url = WeixinContents.qr_scene_ticket_url.replaceAll("ACCESS_TOKEN", getAccessToken(WeixinContents.appid,WeixinContents.appsecret).getToken()); 
  System.out.println(jsonScene); 
  JSONObject jsonObject = httpRequest(url, "POST", jsonScene); 
  int result = 0; 
  String ticket = ""; 
  if (null != jsonObject) { 
   if (jsonObject.containsKey("errcode")) { 
    result = jsonObject.getInt("errcode"); 
   }else{ 
    ticket = jsonObject.getString("ticket"); 
   } 
  } 
  return ticket; 
 } 

2.扫描二维码登陆的几个action

@ActionKey("/") 
 @ClearInterceptor(ClearLayer.ALL) 
 public void index() { 
  LoginUser u = (LoginUser)getSessionAttr("LoginUser"); 
  setAttr("root", this.getRequest().getContextPath()); 
  if(null==u){ 
   setAttr("ticketId",wxTicket()); 
   render("/WEB-INF/login.html"); 
  }else{ 
   redirect("/index"); 
  } 
 } 
 private String wxTicket() { 
  int sceneId = Db.queryInt("select SEQ_WX_SCENE.Nextval from dual"); 
  String ticketId = WeixinHttpUtils.getSceneTicket("QR_SCENE", sceneId+""); 
  setSessionAttr("ticketId",ticketId); 
  setSessionAttr("sessionId",this.getRequest().getSession().getId()); 
  String sql = "insert into wx_scence_logon(id,sessionid,ticketid,SCENCE_ID) values(sys_guid(),?,?,?)"; 
  Db.update(sql,this.getRequest().getSession().getId(),ticketId,sceneId); 
  return ticketId; 
 } 
 @ActionKey("/cxTicket") 
 @ClearInterceptor(ClearLayer.ALL) 
 public void cxTicket(){ 
  String ticketId = getPara("ticketId"); 
  String sessionid = getPara("sessionId"); 
  int i=0; 
  while(i<10){ 
   Record r = Db.findFirst("select id from wx_scence_logon l,wx_user u where u.open_id = l.open_id and l.ticketid = ? and l.sessionId = ?",ticketId,sessionid); 
   if(r!=null&&StringUtils.isNotEmpty(r.getStr("id"))){ 
     setAttr("success","1"); 
     setAttr("logonId",r.getStr("id")); 
     break; 
   }else{ 
    setAttr("success","0"); 
    try { 
     Thread.sleep(5000); 
     i++; 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
   } 
  } 
  render(new JsonRender().forIE()); 
 } 
 @ActionKey("/ticketLogon") 
 @ClearInterceptor(ClearLayer.ALL) 
 public void ticketLogon(){ 
  String id = getPara("ticketId"); 
  Record r = Db.findFirst("select user_id as username from wx_scence_logon l,wx_user u where u.open_id = l.open_id and l.id = ?",id); 
  if(r!=null&&StringUtils.isNotEmpty(r.getStr("username"))){ 
   String username = r.getStr("username"); 
   LoginUser user = LoginUser.dao.findFirst("select user_id,xm,department_id,departmentname,userpw from gy_user u where u.username = ? and u.userlockstate = '1' ",username); 
   String permSql = "select distinct p.* from hr_user_role t,hr_role r,hr_role_perm m,hr_perms p where t.role_id = r.id and m.role_id = r.id and m.perm_id = p.id and user_id = ?"; 
   List<Record> perms = Db.find(permSql,new Object[]{user.getStr("user_id")}); 
   if(perms!=null&&perms.size()>0){ 
    this.getSession().removeAttribute("USER_PERMS"); 
    setSessionAttr("USER_PERMS",perms); 
    getRequest().getSession().setAttribute("LoginUser",user); 
   } 
  } 
  this.redirect("/main"); 
 } 

3. 登陆页面

二维码显示
<img src="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=${ticketId!}" width="250px"/> 

定时查询扫描状态

function wxCxTikcet(){ 
 $.getJSON("${root!}/cxTicket",{ticketId:"${ticketId}",sessionId:"${sessionId}"},function(data){ 
  //alert(data.success=="1"); 
  if(data.success=='1'){ 
   _logon(data.logonId); 
   //window.location.href="${root!}/ticketLogon/" rel="external nofollow" +data.logonId; 
  } 
 }); 
} 
var t_int = window.setInterval("wxCxTikcet()",5000); 

4.公众平台代码

}else if(eventType.equalsIgnoreCase(MessageUtil.EVENT_TYPE_SCAN)){ 
       String scene_id = eventKey; 
       if(Integer.parseInt(eventKey)==0){ 
        respContent = "扫描参数出错!请刷新重试!"; 
       }else{ 
        respContent = getSceneContent(scene_id,fromUserName); 
       } 
     } 

private static String getSceneContent(String sceneId,String fromUserName){ 
  String sql ="select * from WX_SCENCE_LOGON where scence_id = ?"; 
  Record r = Db.findFirst(sql,sceneId); 
  if(r!=null){ 
   String updateSql = "update wx_scence_logon set open_id = ? where id = ?"; 
   Db.update(updateSql,fromUserName,r.getStr("id")); 
   return "您已成功登陆***系统!"; 
  } 
} 

说明,框架使用jfinal 1.5

大家可以参考专题:java二维码进行学习

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JavaWeb入门教程之分页查询功能的简单实现

    JavaWeb入门教程之分页查询功能的简单实现

    这篇文章主要介绍了JavaWeb入门教程之分页查询功能的简单实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • javaweb配置jsp路径映射操作

    javaweb配置jsp路径映射操作

    这篇文章主要介绍了javaweb配置jsp路径映射操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java常用的时间工具类实例

    Java常用的时间工具类实例

    这篇文章主要介绍了Java常用的时间工具类,结合具体实例形式分析了java日期时间的常用转换、判断、输出相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • Java系统运行缓慢等问题的排查思路

    Java系统运行缓慢等问题的排查思路

    这篇文章主要介绍了Java系统运行缓慢等问题的排查思路,读者可以根据具体情况具体分析,从而解决问题
    2021-04-04
  • Java Servlet简单实例分享(文件上传下载demo)

    Java Servlet简单实例分享(文件上传下载demo)

    下面小编就为大家带来一篇Java Servlet简单实例分享(文件上传下载demo)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot2.6.x 与 Swagger3 兼容问题及解决方法

    SpringBoot2.6.x 与 Swagger3 兼容问题及解决方法

    文章介绍了Spring Boot 2.6.x与Swagger 3兼容性问题的解决方法,如果项目中未引入spring-boot-starter-actuator,则在yml文件中加入相关配置,反之,需要添加其他配置,感兴趣的朋友一起看看吧
    2025-03-03
  • SpringBoot实现邮件发送的示例代码

    SpringBoot实现邮件发送的示例代码

    电子邮件是—种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。本文详细为大家介绍了SpringBoot实现发送电子邮件功能的示例代码,需要的可以参考一下
    2022-04-04
  • SpringBoot定制JSON响应数据的实现

    SpringBoot定制JSON响应数据的实现

    本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • mybatis plus框架@TableField注解不生效问题及解决方案

    mybatis plus框架@TableField注解不生效问题及解决方案

    最近遇到一个mybatis plus的问题,@TableField注解不生效,导致查出来的字段反序列化后为空,今天通过本文给大家介绍下mybatis plus框架的@TableField注解不生效问题总结,需要的朋友可以参考下
    2022-03-03
  • 基于Java中最常用的集合类框架之HashMap(详解)

    基于Java中最常用的集合类框架之HashMap(详解)

    下面小编就为大家带来一篇基于Java中最常用的集合类框架之HashMap(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论