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

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

具体实现原理:
1.用户访问业务系统登陆页时,调用二维码接口,获得二维码的ticketid,同时将sessionid,ticketid和二维码的seceneid保存
2.返回登陆页时,根据ticketid获得微信二维码
3.页面通过ajax发送请求,判断是否已经扫描成功。
4.公众平台服务监测到扫描事件,更新seceneid中扫描二维码的业务系统用户名
4.当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/"+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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微信公众号二维码导航大全网站源码是一个可以方便用户查找微信群和公众号的网站程序代码。它提供了一个集成了各种微信群和公众号二维码的导航页面,用户可以通过扫描二维码或者搜索关键字来查找自己感兴趣的微信群和公众号。 该网站源码还具备整站数据聚合的功能,可以从各个来源收集相关的微信群和公众号数据,展示在网站中。这样,用户就可以在一个平台上找到各种分类的微信群和公众号,方便他们快速准确地找到他们所需要的信息。 此外,该网站源码还提供了手机版,并且带有伪静态源码。手机版使得用户可以在手机上随时随地访问网站,并且能够自适应不同的移动设备。伪静态源码可以优化网站的搜索引擎优化(SEO)表现,使得网站在搜索引擎上更容易被检索到,提高流量和曝光率。 综上所述,微信公众号二维码导航大全网站源码是一个功能强大的网站程序,它能够帮助用户快速找到微信群和公众号,而且还具备整站数据聚合和手机版功能,以及带伪静态源码的SEO优化。这些功能使得该网站更具吸引力和竞争力,能够满足用户的需求,并且在互联网上取得更好的表现。 ### 回答2: 微信公众号二维码导航大全网站源码,是一个带有整站数据聚合SEO和手机版伪静态源码的网站项目。该源码旨在帮助用户方便地获取微信群和公众号的二维码信息,并提供导航功能。具体而言,该网站源码具备以下几个主要特点: 1. 整站数据聚合:该源码通过抓取和整理微信群和公众号的相关信息,将其聚合在一个网站上,方便用户一站式地获取所需信息,避免了用户需要多次搜索和浏览的问题。 2. SEO优化:针对搜索引擎优化(SEO)的需求,该网站源码进行了优化处理,使得网站在搜索引擎的排名更靠前,提高了用户的访问量和曝光度。 3. 手机版支持:为了适应手机终端的使用习惯,该网站源码提供了手机版界面,方便用户在移动设备上浏览和使用。无论是手机、平板还是电脑,用户都可以获得良好的浏览体验。 4. 伪静态源码:为了提升网站的访问速度和用户体验,该网站源码采用了伪静态技术,将动态生成的页面转化为静态页,减少了服务器资源的占用。 总而言之,微信公众号二维码导航大全网站源码提供了一个方便快捷的平台,让用户能够轻松获取微信群和公众号的相关信息。通过整站数据聚合、SEO优化、手机版支持和伪静态源码等特点,该网站源码提供了良好的用户体验和访问效果。用户无论是在电脑还是移动设备上都能够方便地访问和使用该网站,从而满足他们的需求。 ### 回答3: 微信公众号二维码导航大全网站源码,是一个具备整站数据聚合功能和SEO优化功能的网站源码。该网站源码可以提供给用户一个方便的平台,能够帮助用户快速找到各种微信群和公众号的二维码。用户只需在搜索框中输入关键字,就可以获取到相关的群组或公众号的二维码信息。 这个网站源码不仅提供了PC端的版本,还有手机版的伪静态源码。手机版的源码可以在手机浏览器中访问,用户可以通过手机随时随地查找自己感兴趣的微信群和公众号。通过手机版的伪静态源码,网站在移动设备上的加载速度更快,用户体验更加流畅。 该网站源码还具备整站数据聚合功能,可以将各种微信群和公众号的信息聚合到一个平台上,方便用户进行搜索和浏览。用户可以通过该网站源码找到自己感兴趣的领域或主题的微信群和公众号,扩展自己的社交圈子和获取相关资讯。 此外,该网站源码还具备SEO优化功能,可以帮助网站在搜索引擎中获得更好的排名。通过合理的网站结构和关键词优化等措施,可以提高网站的曝光度,吸引更多的用户访问和使用。 总之,微信公众号二维码导航大全网站源码是一个功能强大且具有良好用户体验的网站源码,可以帮助用户方便地找到各种微信群和公众号的二维码,并提供整站数据聚合和SEO优化功能,是一个非常实用的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值