最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java微信掃描公眾號二維碼實現(xiàn)登陸功能

 更新時間:2017年07月13日 15:39:19   作者:zhengshuo  
這篇文章主要為大家詳細(xì)介紹了PHP微信掃描公眾號二維碼實現(xiàn)登陸功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java微信掃描公眾號二維碼實現(xiàn)登陸的具體代碼,供大家參考,具體內(nèi)容如下

前提條件:

1.微信公眾平臺為服務(wù)號,
2.服務(wù)號實現(xiàn)了賬號綁定功能,即將open_id 與業(yè)務(wù)系統(tǒng)中的用戶名有對應(yīng)關(guān)系

具體實現(xiàn)原理:

1.用戶訪問業(yè)務(wù)系統(tǒng)登陸頁時,調(diào)用二維碼接口,獲得二維碼的ticketid,同時將sessionid,ticketid和二維碼的seceneid保存
2.返回登陸頁時,根據(jù)ticketid獲得微信二維碼
3.頁面通過ajax發(fā)送請求,判斷是否已經(jīng)掃描成功。
4.公眾平臺服務(wù)監(jiān)測到掃描事件,更新seceneid中掃描二維碼的業(yè)務(wù)系統(tǒng)用戶名
5.當(dāng)ajax監(jiān)測到掃描成功,并返回有業(yè)務(wù)系統(tǒng)用戶名,即可做模擬登陸!

具體代碼:

根據(jù)sceneID獲取,獲取ticketId, sceneId可以為sessionID,或者自定義的其他任何值,但必須保證不重復(fù)

注意:這里請求的type可以為臨時二維碼或永久二維碼,具體區(qū)別可以參看微信公眾平臺的開發(fā)者文檔。

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"/> 

定時查詢掃描狀態(tài)

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 = "掃描參數(shù)出錯!請刷新重試!"; 
       }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 "您已成功登陸***系統(tǒng)!"; 
  } 
} 

說明,框架使用jfinal 1.5

大家可以參考專題:java二維碼進行學(xué)習(xí)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaWeb入門教程之分頁查詢功能的簡單實現(xiàn)

    JavaWeb入門教程之分頁查詢功能的簡單實現(xiàn)

    這篇文章主要介紹了JavaWeb入門教程之分頁查詢功能的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • javaweb配置jsp路徑映射操作

    javaweb配置jsp路徑映射操作

    這篇文章主要介紹了javaweb配置jsp路徑映射操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java常用的時間工具類實例

    Java常用的時間工具類實例

    這篇文章主要介紹了Java常用的時間工具類,結(jié)合具體實例形式分析了java日期時間的常用轉(zhuǎn)換、判斷、輸出相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • Java系統(tǒng)運行緩慢等問題的排查思路

    Java系統(tǒng)運行緩慢等問題的排查思路

    這篇文章主要介紹了Java系統(tǒng)運行緩慢等問題的排查思路,讀者可以根據(jù)具體情況具體分析,從而解決問題
    2021-04-04
  • Java Servlet簡單實例分享(文件上傳下載demo)

    Java Servlet簡單實例分享(文件上傳下載demo)

    下面小編就為大家?guī)硪黄狫ava Servlet簡單實例分享(文件上傳下載demo)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • SpringBoot2.6.x 與 Swagger3 兼容問題及解決方法

    SpringBoot2.6.x 與 Swagger3 兼容問題及解決方法

    文章介紹了Spring Boot 2.6.x與Swagger 3兼容性問題的解決方法,如果項目中未引入spring-boot-starter-actuator,則在yml文件中加入相關(guān)配置,反之,需要添加其他配置,感興趣的朋友一起看看吧
    2025-03-03
  • SpringBoot實現(xiàn)郵件發(fā)送的示例代碼

    SpringBoot實現(xiàn)郵件發(fā)送的示例代碼

    電子郵件是—種用電子手段提供信息交換的通信方式,是互聯(lián)網(wǎng)應(yīng)用最廣的服務(wù)。本文詳細(xì)為大家介紹了SpringBoot實現(xiàn)發(fā)送電子郵件功能的示例代碼,需要的可以參考一下
    2022-04-04
  • SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實現(xiàn)

    SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實現(xiàn)

    本文主要介紹了SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • mybatis?plus框架@TableField注解不生效問題及解決方案

    mybatis?plus框架@TableField注解不生效問題及解決方案

    最近遇到一個mybatis plus的問題,@TableField注解不生效,導(dǎo)致查出來的字段反序列化后為空,今天通過本文給大家介紹下mybatis?plus框架的@TableField注解不生效問題總結(jié),需要的朋友可以參考下
    2022-03-03
  • 基于Java中最常用的集合類框架之HashMap(詳解)

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

    下面小編就為大家?guī)硪黄贘ava中最常用的集合類框架之HashMap(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論

那坡县| 锡林郭勒盟| 西丰县| 渝北区| 海门市| 云安县| 百色市| 福鼎市| 临清市| 龙胜| 浦城县| 平遥县| 西宁市| 金沙县| 鹤山市| 昭通市| 曲沃县| 西峡县| 乳山市| 中方县| 宜春市| 永仁县| 榆林市| 泽普县| 宁蒗| 满洲里市| 泗水县| 洛南县| 南岸区| 舞钢市| 通化市| 图片| 辽源市| 广汉市| 德庆县| 长治县| 泊头市| 德江县| 东港市| 康马县| 中方县|