二维条形码扫描在线查询登录

微信二维码扫描登录 - 为程序员服务
微信二维码扫描登录
很多网站都多出来了微信二维码扫描登录,微信官方也有提供,然后在看到了他们的微信扫描登录跟其他地方不一样,于是研究了一下,发现是利用和来实现的。
下面是我的实现过程,用的是实现的。
用户登录实现
首先是实现用户登录功能,这里我为了偷懒,就没有用实际的用户登录认证,而是只匹配用户名
主要代码如下
首先创造1000个假用户(名)
for i in xrange(1000):
users.append(dict(username=str(i),
openid=None))
然后是登录
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.render('index.html')
def post(self):
username = self.get_argument('username')
for user in users:
if user['username'] == username:
self.set_cookie('user', username)
return self.redirect('/user', 302)
self.redirect('/', 302)
接下来是一个虚假的用户中心,主要是为了证明登录成功了
class UserCenterHandler(tornado.web.RequestHandler):
def get_current_user(self):
user = self.get_cookie('user')
for _user in users:
if _user['username'] == user:
return _user
return user
@tornado.web.authenticated
def get(self):
self.render('usercenter.html', user=self.current_user)
二维码扫描登录
能够进行正常的登录之后,接下来就是二维码的扫描登录了
当用户扫描二维码后,微信会推送,而这个事件有两种,一种是已关注扫描,另一种是未关注扫描,但是这两种都会带上 sceneid 和 ticket 两个参数,为了识别到是哪个用户扫描的,所以需要将 sceneid 或者 ticket 与当前打开二维码扫描界面的用户绑定起来,所以我用了一种我觉得很蠢的方法来生成 scene_id
q = Queue.LifoQueue(1000)
我生成了1000个 sceneid 放到一个队列里,当用户打开登录页面时,从队列里获得一个 sceneid,当用户关闭登录页面时,释放 sceneid,并且入队,这样就保证了 sceneid 的复用和不重复,用户登录界面与服务器保持连接我用的是 WebSocket,实现如下
class WebSocketHandler(tornado.websocket.WebSocketHandler):
@tornado.gen.coroutine
def open(self):
print 'open'
wechat = WeChat(access_token)
qid = q.get()
qr = yield wechat.get_ticket(180, qid)
'client': self,
'qid': qid,
'ticket': qr['ticket'],
'uuid': str(uuid.uuid4()),
'expires': 180,
clients.append(c)
d = copy.copy(c)
del d['qid'], d['client']
self.write_message(json.dumps(dict(type='qr', data=d)))
def on_close(self):
for c in clients:
if c['client'] == self:
q.put(c['qid'])
clients.remove(c)
前端实现如下
var ws = new WebSocket('ws://' + window.location.host + '/ws');
var ws = new WebSocket('ws://' + window.location.host + '/ws');
$(function() {
ws.onopen = function() {
console.info('open');
var get_qr = {
type: 'get_qr'
ws.send(JSON.stringify(get_qr));
ws.onmessage = function (evt) {
var msg = JSON.parse(evt.data);
console.log(msg);
if (msg.type == 'qr') {
$('#wechat-qr-img').attr('src', 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' + msg.data.ticket)
var expires = msg.data.
function run() {
console.info(expires);
expires--;
if (expires == 0) {
clearTimeout(t);
$('#wechat-qr-img').attr('src', '');
alert('二维码过期');
window.location.reload();
t = setTimeout(function(){run()}, 1000);
} else if (msg.type == 'success_and_not_bind') {
clearTimeout(t);
$('#wechat-bind').slideDown();
$('#bind-openid').val(msg.data);
} else if (msg.type == 'success') {
$.cookie('user', msg.data);
window.location.href = '/user';
$('#wechat-bind-btn').click(function() {
var username = $('#bind-username').val();
var openid = $('#bind-openid').val();
$.post('/user/bind', {openid: openid, username: username})
.success(function(data) {
console.info(data);
if (data.status) {
window.location.href = '/user';
.fail(function(data) {
console.error(data.responseJSON);
因为 WebSocket 没法设置 cookies,所以我就把需要设置的 cookies 发到了浏览器,在前端设置 cookies
服务器端接收到微信扫描事件时的处理
if msg.event == 'scan':
reply = create_reply('扫描', msg)
for c in clients:
if c['qid'] == int(msg.scene_id):
for user in users:
if user['openid'] == msg.source:
c['client'].write_message(dict(type='success', data=user['username']))
c['client'].write_message(dict(type='success_and_not_bind', data=msg.source))
当用户第一次扫描,并没有绑定帐号时,要先绑定帐号
class UserBindHandler(tornado.web.RequestHandler):
def post(self):
username = self.get_argument('username')
openid = self.get_argument('openid')
for user in users:
if user['username'] == username:
user['openid'] = openid
'status': True
self.set_cookie('user', username)
'status': False,
'err': '用户不存在'
self.set_status(403)
self.set_header('content-type', 'application/json')
for user in users:
if user['openid']:
print user
self.write(json.dumps(data))
以上只是为了实验利用微信扫描二维码登录的可行性
上述完整代码放在了gist里面,可以看到完整的
Just do it.
原文地址:, 感谢原作者分享。
您可能感兴趣的代码微信扫二维码怎么登陆_百度知道
微信扫二维码怎么登陆
我有更好的答案
微信扫描二维码的使用方法:第一种方法1、登录微信——点右上角的+——选择【扫一扫】2、然后出来的方框对准二维码开始扫描,扫描成功后会有提示。第二种方法1、登录微信——点底部的【发现】——点【扫一扫】2、然后出来的方框对准二维码开始扫描,扫描成功后会有提示。
采纳率:94%
来自团队:
点击微信页面的右上角有个加号,然后就会有微信扫二维码的栏目了
麻烦您采纳一下,我有用,谢谢您嘞!
本回答被提问者和网友采纳
为您推荐:
其他类似问题
您可能关注的内容
二维码的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。你的位置: >
> websocket实现APP扫描二维码,自动登陆网站(扫码登录)
我了解网站扫描二维码并实现自动登陆功能是从微信哪里看到的,该功能体验还不错,减少密码被盗的风险。那么一个普通的网站该如何实现此功能呢?本文将借助websocket+java实现这一功能。
后台系统,提供生成带参数的二维码的接口,这个参数就是唯一值(场景值)
访问到登录网站页面 时,生成二维码
用户拿APP扫码后,APP直接将场景值中的唯一值和用户信息反馈给后台系统
后台系统将用户访问的唯一值信息记录到redis,key就是唯一值(场景值)
网站端做轮训去查询redis中是否有这个唯一值的数据,如果有就获取APP用户信息信息,没有就五秒一次轮训,登录后就不在做轮训(从二维码弹出之后开始做轮训,关闭二维码后停止轮训)
这里的唯一值是可以自己定义的,我用的是截取了几位的时间戳
根据上面的实现思路,我们用java写一个获取带参数的临时二维码接口。以下是主要代码:
// 临时二维码
private final static String QR_SCENE = &QR_SCENE&;
// 永久二维码
private final static String QR_LIMIT_SCENE = &QR_LIMIT_SCENE&;
// 永久二维码(字符串)
private final static String QR_LIMIT_STR_SCENE = &QR_LIMIT_STR_SCENE&;
// 创建二维码
private String create_ticket_path = &https://api.weixin.qq.com/cgi-bin/qrcode/create&;
// 通过ticket换取二维码
private String showqrcode_path = &https://mp.weixin.qq.com/cgi-bin/showqrcode&;
@RequestMapping(&getQrcode&)
public @ResponseBody String getQrcode(@RequestParam(value = &sceneId&)int sceneId) throws Exception{
String ticket = createTempTicket(tokenService.getToken(),&2592000&,sceneId);
LOGGER.info(&get wechat qrcode
==& start&);
LOGGER.info(&sceneId :&+sceneId);
LOGGER.info(&ticket :&+ticket);
LOGGER.info(&get wechat qrcode
==& end&);
* 创建临时带参数二维码
* @param accessToken
* @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
* @param sceneId 场景Id
* @return // 业余草:www.xttblog.com
public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {
TreeMap&String,String& params = new TreeMap&String,String&();
params.put(&access_token&, accessToken);
Map&String,Integer& intMap = new HashMap&String,Integer&();
intMap.put(&scene_id&,sceneId);
Map&String,Map&String,Integer&& mapMap = new HashMap&String,Map&String,Integer&&();
mapMap.put(&scene&, intMap);
Map&String,Object& paramsMap = new HashMap&String,Object&();
paramsMap.put(&expire_seconds&, expireSeconds);
paramsMap.put(&action_name&, QR_SCENE);
paramsMap.put(&action_info&, mapMap);
String data = new Gson().toJson(paramsMap);
String tse = HttpRequestUtil.HttpsDefaultExecute(HttpRequestUtil.POST_METHOD,create_ticket_path,params,data);
JSONObject jsonObject = JSONObject.fromObject(tse);
LOGGER.info(&ticket :&+jsonObject.getString(&ticket&));
  return showqrcode_path+&?ticket=&+jsonObject.getString(&ticket&);
二维码的生成,相信大家都会,我这里直接调用微信的接口是为了整合微信做其他功能。
配合SpringMVC做一个接口:
@RequestMapping(&getQrcode&)
public @ResponseBody Hashtable getQrcode(int sceneId){
System.out.println(sceneId);
Hashtable param = new Hashtable();
param.put(&sceneId&, sceneId);
String qrcodePath = HttpUtil.postRequest(Constant.getValue(&get_qrcode&), param);
System.out.println(& qrcodePath ==& &+qrcodePath);
param.put(&path&, qrcodePath);
// 业余草:www.xttblog.com
网站端:登陆页面中做轮训,每隔几秒查询一次redis,如果有用户信息就登陆。
var timestamp = new Date().getTime() + &&;
var str = timestamp.substring(8, timestamp.length);
window.setInterval(function() {
getUser(cont);
}, 10000);
function getUser() {
type : 'get',
sceneId : str
dataType : 'json',
url : &getUser.do&,
success : function(data) {
if (data.msg == &success&) {
location.reload();
error : function(data) {
if (data.msg == &success&) {
location.reload();
}// 业余草:www.xttblog.com
上面使用的轮询效率不高,我们可以借助websocket来实现(实际应用中自己判断浏览器是否支持WebSocket,支持就优先WebSocket,不支持就是用轮询)。
使用websocket建立一个连接很容易,代码如下:
var timestamp = new Date().getTime() + &&;
timestamp = timestamp.substring(0, timestamp.length-3);
var websocket =
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
websocket = new WebSocket(&ws://www.xttblog.com/wx/websocket/&+timestamp);
alert('当前浏览器
Not support websocket');
//连接发生错误的回调方法
websocket.onerror = function () {
console.log(&WebSocket连接发生错误&);
//连接成功建立的回调方法
websocket.onopen = function () {
console.log(&WebSocket连接成功&);
//接收到消息的回调方法
websocket.onmessage = function (event) {
jQuery(&#username&).html(event.data);
jQuery(&#singup&).css(&display&, &none&);
jQuery(&#user&).show();
jQuery(&#singout&).show();
layer.closeAll();
//连接关闭的回调方法
websocket.onclose = function () {
console.log(&WebSocket连接关闭&);
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,
//防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
closeWebSocket();
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
服务器端socket的建立,在建立socket链接的时候,将每个页面传过来的唯一标识{sceneId}与会话信息session进行绑定,可以使用map实现,这里用的ConcurrentMap。
* @ServerEndpoint 注解是一个类层次的注解,
* 它的功能主要是将目前的类定义成一个websocket服务器端,
* 注解的值将被用于监听用户连接的终端访问URL地址,
* 客户端可以通过这个URL来连接到WebSocket服务器端
@Component
@ServerEndpoint(&/websocket/{sceneId}&)
public class WebSocketController {
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
//若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
private static ConcurrentMap&String,WebSocketController&
webSocketMap
= new ConcurrentHashMap&String,WebSocketController&();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
* 连接建立成功调用的方法
* @param session
可选的参数。session为与某个客户端的连接会话,
* 需要通过它来给客户端发送数据
public void onOpen(@PathParam(&sceneId&) String sceneId,Session session){
this.session =
webSocketMap.put(sceneId, this);
//在线数加1
System.out.println(&唯一key为:& + sceneId);
* 连接关闭调用的方法
public void onClose(@PathParam(&sceneId&) String sceneId){
webSocketMap.remove(sceneId);//从map中删除
* 收到客户端消息后调用的方法
* @param message 客户端发送过来的消息
* @param session 可选的参数
@OnMessage
public void onMessage(String message,Session session) {
System.out.println(&来自客户端的消息:& + message);
JSONObject jsonobject = JSONObject.fromObject(message);
Hashtable params= (Hashtable)JSONObject.toBean(jsonobject,Hashtable.class);
//群发消息
WebSocketController webSocketController = webSocketMap.get(params.get(&equipmentType&));
webSocketController.sendMessage((String)params.get(&nickname&));
} catch (IOException e) {
e.printStackTrace();
* 发生错误时调用
* @param session
* @param error
public void onError(Session session, Throwable error){
System.out.println(&发生错误&);
error.printStackTrace();
* 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
* @param message
* @throws IOException
public void sendMessage(String message) throws IOException{
this.session.getBasicRemote().sendText(message);
以上就是整个扫码登录功能的核心代码。有兴趣的可以结合我的实现思路和部分代码自己实现一个。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!本文原文出处:: &
相关文章推荐没有手机的情况的下登录电脑版微信,无需扫描二维码。 - 『精品软件区』
- 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn
后使用快捷导航没有帐号?
只需一步,快速开始
请完成以下验证码
请完成以下验证码
查看: 85559|回复: 37
没有手机的情况的下登录电脑版微信,无需扫描二维码。
阅读权限10
论坛里有MAC版的微信,不需要扫描二维码。可我家的电脑是Win7的。所以我重新想了个办法。这个办法比较另类。
首先需要的工具有靠谱助手(一个手机模拟器)&&微信电脑版& &我在底下附上下载地址
靠谱助手:http://www.kaopu001.com/
(下载靠谱助手后,你要在靠谱助手里面把微信安装好。)
微信电脑版:http://weixin.qq.com/cgi-bin/readtemplate?t=win_weixin
然后我用截图来演示给大家看
第一步:我们先打开靠谱助手,然后打开微信。
(提示,之前你要先在靠谱助手里面安装好微信,方法很简单,直接在靠谱助手里面的应用下载里搜索微信即可)
靠谱助手.PNG (116.08 KB, 下载次数: 754)
08:55 上传
第二步:我们登录靠谱助手里面的微信,这一步相信大家都会,就不截图了
第三步:打开电脑版微信,点击登录。
微信.PNG (24.4 KB, 下载次数: 137)
08:59 上传
第四步:然后我们就会发现靠谱助手的微信会有这样的提示,我们点击登录即可。
模拟器微信.PNG (41.46 KB, 下载次数: 71)
09:01 上传
第五步:点击登录完成后,关闭模拟器。我们的目的就达到了。
大家的操作的时候,一定要按照我的步骤来。要不然靠谱助手里的微信不会有提示的。
谢谢大家,本次教程到处结束。
模拟器登录微信会封号的、别问我怎么知道 我被封过四次了&
谢谢@Thanks!模拟器我只用文卓爷,稳定高.
为了一个微信费这么大的劲
为什么不直接使用模拟器里的微信
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
真麻烦,下个安卓版的模拟器都解决了,什么软件都能下载,我的模拟器主要是玩游戏用的
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
要是之前用的是苹果版的微信。你登录模拟器一样需要验证的吧??
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
这个办法好麻烦,还要装模拟器
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限30
还不如登电脑威信。
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
就是安装个安卓模拟器么
老机子表示压力好大
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
有时候可能
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
用模拟器扫描电脑微信二维码一样可以、别问我怎么扫描{:1_914:}
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
千万不要这么干,微信容易被锁定,还得解封,我以前就这么干
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
虽然用不上,回复表示支持,楼主辛苦了
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
这个。。一般人都能想到吧
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
绝不做伸手党,这是原则
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
免责声明:吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。
( 京ICP备号 | 京公网安备 87号 )
Powered by Discuz!
Comsenz Inc.闲来无事分享一个扫描二维码登陆网站的demo - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
公司几个子系统中用了用客户端扫描网页二维码登录web系统的功能,于是就将二维码登录这块抽了出来分享一下自己的思路;
项目地址在:
用到的组件主要有koa、socket.io及一些koa的中间件;
欢迎大家拍砖
正需要验证一下自己想的对不对
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的

我要回帖

更多关于 二维码扫描模块 的文章

 

随机推荐