微信扫码登录PC网站实现思路

微信扫码登录PC网站实现思路

点点

2021-04-25 10:00 阅读 500 喜欢 1

思路整理

登录页面,当点击微信登录后,根据地址url生成一个二维码,让用户扫描。 在生成二维码的同时,我在数据库插入一条记录,然后将ID放在这个二维码中。 然后用户拿着微信去扫描这个二维码(地址),后面的就是公众号通过网页获取用户信息了.. 获取到用户信息后,根据地址中的ID,查找数据库,更新状态和用户信息 与此同时,在PC端二维码生成后,一直轮询向后台请求状态,根据状态获取对应的结果 大体思路就是这样,真实现起来.. 感觉也就微信公众号获取用户信息这段稍微麻烦点..毕竟得翻着API才能写.

需要感受完整功能的可以在 我的亿万店 随便找个商品,点击购买的时候,选择普通登录,就会跳转到我的第三方登录系统啦

代码是用nodejs实现的,后端的接口:

创建二维码 轮询状态 跳转到第三方地址(这个大家用的话,可能就是登录成功后跳转的地址了) 微信公众号跳转地址,用于获取code 微信公众号重定向地址,用户获取用户信息,并展示对应的信息 简单写下关于微信公众号获取用户信息的代码吧。

公众号获取用户信息代码部分

nodejs - thinkjs - controller/wechat.js

/***

module.exports = class extends Base{

/**
 * 微信扫描二维码进入该地址,附带地址信息。
 */
async indexAction(){
    let code = this.query('code');
    let redirectURI = this.config('site').domain.value+'/oauth/wechat/redirect';
    let appid = this.config('site').wechatappid.value;
    let scope = 'snsapi_userinfo';
    await this.model('lxxx').where({id : code}).update({
        status : 1//已扫描
    });
    let codeUrl =  `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirectURI}&response_type=code&scope=${scope}&state=${code}#wechat_redirect`;
    return this.redirect(codeUrl);
}

/**
 * 重定向后的地址,换取access_token
 */
async redirectAction(){
    let code = this.query('code');
    let state = this.query('state');

    let appid = this.config('site').wechatappid.value;
    let secret = this.config('site').wechatappsecret.value;
    let tokenUrl = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appid}&secret=${secret}&code=${code}&grant_type=authorization_code`;

    let rs = await axios.get(tokenUrl).then(rs=>rs.data);
    console.log(rs);
    let access_token = rs.access_token;
    let openId = rs.openid;

    let userUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openId}&lang=zh_CN`

    let userInfo = await axios.get(userUrl).then(rs=>rs.data);
    console.log(userInfo);
    let {nickname,headimgurl} = userInfo;
    //查找state
    let record = await this.model('xxx').where({id : state}).find();
    console.log(record);
    if(!think.isEmpty(record) && openId && userInfo && !userInfo.errmsg){
        //获取用户信息成功
        console.log('登录成功,更新信息')
        await this.model('xxx').where({id : state}).update({
            json : JSON.stringify(userInfo),
            code : think.uuid().replace(/-/g,''),
            name : nickname,
            openid : openId,
            avatar : headimgurl,
            status : 2
        });
        this.assign('suc',true);
    }else{
        console.log('登录失败')
        await this.model('xxx').where({id : state}).update({status : 4});
        this.assign('suc',false);
    }
    //此处需要将获得的state ,然后查找对应的记录,进行数据更新。并提示关闭当前页面。
    return this.display('wechat/logintip');

}

/**
 * 扫描成功后,进入该地址,根据session进行页面地址跳转
 */
async wechatAction(){
    let id = this.query('id');
    let record = await this.model('xxx').where({id : id}).find();
    //获取对应的appid
    let loginInfo = await this.session('loginInfo');
    let clientCode = record.code;
    return this.redirect(loginInfo.redirect_uri+'?code='+clientCode+'&state='+loginInfo.state);
}

}

转载请注明出处: http://sdxlp.cn/article/weixindengru.html


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
随着网络普及,视频、语音聊天成了小伙伴们又一种不可或缺的通讯方式,但是很多的时候,会出现这样或者那样的问题,用QQ语音聊天时对方听不到我的声音,而我能听到对方的声音。针对这个问题,作如下详细解答,帮助小伙伴们轻松解决这个难题。
随着电子技术的不断发展,即时通许软件已经成为我们工作和生活的一部分了。那在电脑上使用微信接收的图片,都保存在哪个文件夹呢?如果想要清理这些图片的话,又有哪些微信图片的清理方法呢?
手机上的微信支付是一款常用的聊天社交、支付应用,是我们生活中必不可少的应用,那我们在使用微信支付的过程中遇到了支付受限的问题,这是为什么呢,最长多久可以解封恢复使用,下面就和点点一起来看看吧!
手机是我们常用的生活工具,给手机增加一个密码不安全,给手机软件再增加一个密码就更加安全了,很多用户再使用手机的时候都想要知道荣耀手机怎么给软件加密码,下面就让小编给小伙伴们介绍一下给软件加密码的方法。
QQ可能是很多小伙伴们的回忆,而照片就是小伙伴最简单的回忆方法,说到照片,大多数人都知道,有的小伙伴问QQ相册里的照片彻底删除了怎么找回来
简单的设置,搞定烦恼!我当前想发一条朋友圈,不想让A君、B君、C君看到,好友圈里的其他人都能看到! 说白了就是只想让他们看不到当前所发的这条朋友圈,其它时候发的朋友圈他们都能看到,该如何设置?
现在小伙伴们都离开不了手机,它逐渐成为我们生活中必不可少的一样生活用品。很多小伙伴在用了 iPhone6 以后,遇到系统提示内存不足的问题。对于智能手机,相信小伙伴们都知道,同款机型不同内存大小,价格会相差很多,特别是对应iPhone这样的土豪手机,不同的内存版本更是相差多则上千。而很多当初选择了小内存的手机用户,发现在使用过程中彻底不够用。
在最近很多小伙伴都在找微信头像卫星红旗设置教程,就是将渐变的五星红旗添加到你的微信头像上,那怎么设置国旗渐变头像呢?下面就和点点一起来看看吧!让小伙伴的头像每天换一个,每天都不待重样的。