java微信扫描公众号二维码实现登陆功能
本文实例为大家分享了java微信扫描公众号二维码实现登陆的具体代码,供大家参考,具体内容如下
前提条件:
1.微信公众平台为服务号,
2.服务号实现了账号绑定功能,即将open_id与业务系统中的用户名有对应关系
具体实现原理:
1.用户访问业务系统登陆页时,调用二维码接口,获得二维码的ticketid,同时将sessionid,ticketid和二维码的seceneid保存
2.返回登陆页时,根据ticketid获得微信二维码
3.页面通过ajax发送请求,判断是否已经扫描成功。
4.公众平台服务监测到扫描事件,更新seceneid中扫描二维码的业务系统用户名
5.当ajax监测到扫描成功,并返回有业务系统用户名,即可做模拟登陆!
具体代码:
根据sceneID获取,获取ticketId,sceneId可以为sessionID,或者自定义的其他任何值,但必须保证不重复
注意:这里请求的type可以为临时二维码或永久二维码,具体区别可以参看微信公众平台的开发者文档。
publicstaticStringgetSceneTicket(Stringtype,StringsceneId){
WxScenescene=newWxScene();
scene.setAction_name(type);
scene.setSceneId(Integer.parseInt(sceneId));
scene.setExpire_seconds(1800);
StringjsonScene=JSONObject.fromObject(scene).toString();
Stringurl=WeixinContents.qr_scene_ticket_url.replaceAll("ACCESS_TOKEN",getAccessToken(WeixinContents.appid,WeixinContents.appsecret).getToken());
System.out.println(jsonScene);
JSONObjectjsonObject=httpRequest(url,"POST",jsonScene);
intresult=0;
Stringticket="";
if(null!=jsonObject){
if(jsonObject.containsKey("errcode")){
result=jsonObject.getInt("errcode");
}else{
ticket=jsonObject.getString("ticket");
}
}
returnticket;
}
2.扫描二维码登陆的几个action
@ActionKey("/")
@ClearInterceptor(ClearLayer.ALL)
publicvoidindex(){
LoginUseru=(LoginUser)getSessionAttr("LoginUser");
setAttr("root",this.getRequest().getContextPath());
if(null==u){
setAttr("ticketId",wxTicket());
render("/WEB-INF/login.html");
}else{
redirect("/index");
}
}
privateStringwxTicket(){
intsceneId=Db.queryInt("selectSEQ_WX_SCENE.Nextvalfromdual");
StringticketId=WeixinHttpUtils.getSceneTicket("QR_SCENE",sceneId+"");
setSessionAttr("ticketId",ticketId);
setSessionAttr("sessionId",this.getRequest().getSession().getId());
Stringsql="insertintowx_scence_logon(id,sessionid,ticketid,SCENCE_ID)values(sys_guid(),?,?,?)";
Db.update(sql,this.getRequest().getSession().getId(),ticketId,sceneId);
returnticketId;
}
@ActionKey("/cxTicket")
@ClearInterceptor(ClearLayer.ALL)
publicvoidcxTicket(){
StringticketId=getPara("ticketId");
Stringsessionid=getPara("sessionId");
inti=0;
while(i<10){
Recordr=Db.findFirst("selectidfromwx_scence_logonl,wx_useruwhereu.open_id=l.open_idandl.ticketid=?andl.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(InterruptedExceptione){
e.printStackTrace();
}
}
}
render(newJsonRender().forIE());
}
@ActionKey("/ticketLogon")
@ClearInterceptor(ClearLayer.ALL)
publicvoidticketLogon(){
Stringid=getPara("ticketId");
Recordr=Db.findFirst("selectuser_idasusernamefromwx_scence_logonl,wx_useruwhereu.open_id=l.open_idandl.id=?",id);
if(r!=null&&StringUtils.isNotEmpty(r.getStr("username"))){
Stringusername=r.getStr("username");
LoginUseruser=LoginUser.dao.findFirst("selectuser_id,xm,department_id,departmentname,userpwfromgy_useruwhereu.username=?andu.userlockstate='1'",username);
StringpermSql="selectdistinctp.*fromhr_user_rolet,hr_roler,hr_role_permm,hr_permspwheret.role_id=r.idandm.role_id=r.idandm.perm_id=p.idanduser_id=?";
Listperms=Db.find(permSql,newObject[]{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.登陆页面
二维码显示
定时查询扫描状态
functionwxCxTikcet(){
$.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="externalnofollow"+data.logonId;
}
});
}
vart_int=window.setInterval("wxCxTikcet()",5000);
4.公众平台代码
}elseif(eventType.equalsIgnoreCase(MessageUtil.EVENT_TYPE_SCAN)){
Stringscene_id=eventKey;
if(Integer.parseInt(eventKey)==0){
respContent="扫描参数出错!请刷新重试!";
}else{
respContent=getSceneContent(scene_id,fromUserName);
}
}
privatestaticStringgetSceneContent(StringsceneId,StringfromUserName){
Stringsql="select*fromWX_SCENCE_LOGONwherescence_id=?";
Recordr=Db.findFirst(sql,sceneId);
if(r!=null){
StringupdateSql="updatewx_scence_logonsetopen_id=?whereid=?";
Db.update(updateSql,fromUserName,r.getStr("id"));
return"您已成功登陆***系统!";
}
}
说明,框架使用jfinal1.5
大家可以参考专题:java二维码进行学习
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。