java微信扫描公众号二维码实现登陆功能
发布时间 - 2026-01-11 02:19:26 点击率:次本文实例为大家分享了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二维码进行学习
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# java
# 微信
# 二维码
# 登陆
# java实现一个扫描包的工具类实例代码
# java实现电脑端扫描二维码
# Java实现的生成二维码统计扫描次数并转发到某个地址功能详解
# Java网络编程实现的简单端口扫描器示例
# Java扫描文件夹下所有文件名
# 详解Java 包扫描实现和应用(Jar篇)
# 几个
# 自定义
# 大家分享
# 可做
# 绑定
# 具体内容
# 时将
# 大家多多
# 重试
# 前提条件
# 判断是否
# 实现了
# 文档
# containsKey
# int
# null
# result
# ticket
# return
# WX_SCENCE_LOGON
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何用PHP快速搭建CMS系统?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
jQuery 常见小例汇总
如何将凡科建站内容保存为本地文件?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
网站建设要注意的标准 促进网站用户好感度!
如何快速搭建高效简练网站?
Python文件异常处理策略_健壮性说明【指导】
Laravel中的Facade(门面)到底是什么原理
电商网站制作价格怎么算,网上拍卖流程以及规则?
Laravel如何使用Collections进行数据处理?(实用方法示例)
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Laravel distinct去重查询_Laravel Eloquent去重方法
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何快速选择适合个人网站的云服务器配置?
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
Laravel怎么在Controller之外的地方验证数据
Bootstrap整体框架之CSS12栅格系统
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
html5的keygen标签为什么废弃_替代方案说明【解答】
昵图网官网入口 昵图网素材平台官方入口
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何用IIS7快速搭建并优化网站站点?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
网站建设整体流程解析,建站其实很容易!
Python制作简易注册登录系统
,怎么在广州志愿者网站注册?
如何确保FTP站点访问权限与数据传输安全?
如何为不同团队 ID 动态生成多个“认领值班”按钮
Swift中switch语句区间和元组模式匹配
Laravel怎么清理缓存_Laravel optimize clear命令详解
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
香港服务器WordPress建站指南:SEO优化与高效部署策略
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
微信小程序 canvas开发实例及注意事项
音乐网站服务器如何优化API响应速度?
如何在阿里云ECS服务器部署织梦CMS网站?
如何用虚拟主机快速搭建网站?详细步骤解析
,网页ppt怎么弄成自己的ppt?
Laravel API资源类怎么用_Laravel API Resource数据转换
如何为不同团队 ID 动态生成多个非值班状态按钮

