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

本文实例为大家分享了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

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

(0)

相关推荐

  • 微信支付java版本之JSAPI支付+发送模板消息

    本文为大家分享了java版本之JSAPI支付+发送模板消息的相关资料,供大家参考,具体内容如下 1.工具类 工具类见:微信支付JAVA版本之Native付款 2.公众账号设置 3.代码实现 openId:openId为用户与该公众账号之间代表用户的唯一标示  以下类中涉及到生成token,关闭订单接口调用,获取配置文件信息,和工具类,在其他文章中有具体代码实现 package com.zhrd.bussinss.platform.controller.rest; import java.io.F

  • JAVA实现 springMVC方式的微信接入、实现消息自动回复实例

    前段时间小忙了一阵,微信公众号的开发,从零开始看文档,踩了不少坑,也算是熬过来了,最近考虑做一些总结,方便以后再开发的时候回顾,也给正在做相关项目的同学做个参考. 1.思路 微信接入:用户消息和开发者需要的事件推送都会通过微信方服务器发起一个请求,转发到你在公众平台配置的服务器url地址,微信方将带上signature,timestamp,nonce,echostr四个参数,我们自己服务器通过拼接公众平台配置的token,以及传上来的timestamp,nonce进行SHA1加密后匹配signa

  • Java开发微信公众号接收和被动回复普通消息

    上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本消息 2.图片消息 3.语音消息 4.视频消息 5.小视频消息 6.地理位置消息 7.链接消息(被动回复的消息) 被动回复的普通消息包括: 1.回复文本消息 2.回复图片消息 3.回复语音消息 4.回复视频消息 5.回复音乐消息 6.回复图文消息 其实接收消息和被动回复消息这两个动作是不分家的,这本

  • 微信java开发之实现微信主动推送消息

    1.拉取access_token2.拉取用户信息3.主动推送消息4.接口貌似要申请权限5.依赖httpclient4.2.3 和jackson 2.2.1 复制代码 代码如下: public class WeixinAPIHelper { /**  * 获取token接口  */ private String getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=

  • Java编程调用微信分享功能示例

    本文实例讲述了Java编程调用微信分享功能.分享给大家供大家参考,具体如下: 这篇文章介绍如何使用java开发微信分享功能,因为工作,已经开发完成,可使用. 如果想要自定义微信的分享功能,首先在自己的页面内首先使用AJAX.下面我具体举例. 首先是在页面内写入请求后台的AJAX /** * 调用微信分享接口 * */ public void WXConfig(){ String url = getPara("href"); WXConfigController scan = new W

  • Java编程调用微信支付功能的方法详解

    本文实例讲述了Java编程调用微信支付功能的方法.分享给大家供大家参考,具体如下: 微信开发文档地址:https://mp.weixin.qq.com/wiki/home/ 从调用处开始 我的流程: 1.点击"支付"按钮,去后台 --> 2.后台生成支付所需数据返回页面 --> 3.页面点击"确认支付"调用微信支付js.完成支付功能. 支付按钮 <div class="button" id="pay" onc

  • Java编程调用微信接口实现图文信息推送功能

    本文实例讲述了Java编程调用微信接口实现图文信息等推送功能.分享给大家供大家参考,具体如下: Java调用微信接口工具类,包含素材上传.获取素材列表.上传图文消息内的图片获取URL.图文信息推送. 微信图文信息推送因注意html代码字符串中将双引号(")替换成单引号('),不然信息页面中包含图片将无法显示且图片后面的内容也不会显示 官方文档:http://mp.weixin.qq.com/wiki/home/ StringBuilder sb=new StringBuilder(); sb.a

  • java微信开发第二步 获取消息和回复消息

    接着上一篇java微信开发API第一步 服务器接入进行学习,下面介绍java微信开发第二步:获取消息和回复消息,具体内容如下 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet

  • Java微信公众号开发之通过微信公众号获取用户信息

    最近由于公司业务,就开始研究微信开发的流程,说实话,这东西刚开始看到时候和看天书的一样,总算,看了一天的文档,测试代码终于出来了. 1.首先需要到微信网站去设置一下,我是直接用的微信测试号. 接口配置信息必须要填写的,所以说必须能将自己的服务发布出去 到此微信配置完毕,接下来就是直接上代码了 2.获取用户信息的方式一共是两种,前提都是用户关注微信公众号,一种是静默获取(snsapi_base,这种方式只能获取openid),另一种是授权获取(snsapi_userinfo,可以获取用户的详细信息

  • java 实现微信服务器下载图片到自己服务器

     java 实现微信服务器下载图片到自己服务器 此功能的实现需要注意java 中IO流的操作及网路开发, 实现代码: /** * @author why * */ public class PicDownload { /** * * 根据文件id下载文件 * * * * @param mediaId * * 媒体id * * @throws Exception */ public static InputStream getInputStream(String accessToken, Stri

  • java微信企业号开发之发送消息(文本、图片、语音)

    上篇文章介绍了开启回调模式,开始回调模式后我们就要实现聊天功能了.平时使用微信聊天可以发送文本消息.语音.图片.视频等,这里只实现了其中的一些功能和大家分享. 一.与微信企业号建立连接 1.企业应用调用企业号提供的接口,管理或查询企业号后台所管理的资源.或给成员发送消息等,以下称主动调用模式. 2.企业号把用户发送的消息或用户触发的事件推送给企业应用,由企业应用处理,以下称回调模式. 3.用户在微信中阅读企业应用下发的H5页面,该页面可以调用微信提供的原生接口,使用微信开放的终端能力,以下称JS

随机推荐