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

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

月光魔力鸭

2020-07-09 00:32 阅读 1425 喜欢 4 微信登录 扫码登录

最近一直琢磨着做一个第三方统一登录的这么一个小东西,虽然网上其实也挺多的.. 不过造轮子的感觉还是很爽的。 QQ /Github 比较简单,申请下就OK 了.. 微信真不是个东西,得花钱。

事情是这样的:

我有一个服务号,是认证过了的,为了实现微信支付,花了几百大洋也给过了.. 虽然中间经历了不少坎坷,也算成功了。 但是,当我以为我这个认证过了的服务号,去申请下微信登录的时候,发现,竟然还需要微信开放平台的开发者认证,而且认证得花钱...而且服务号的认证还不算...我就日了够了,怪不得微信这么赚呢,光TM(sorry,爆粗了..没忍住)这认证费就老多了,多少开发者啊。毒瘤!!

这样,既然我已经有了一个服务号了,而且服务号是可以支持不关注公众号获取微信用户信息的,我估摸着应该也能绕过去,无非就是不是辣么好看罢了,能实现就OK啦 ヾ(゚∀゚ゞ)

思路整理

大体思路就是这样,真实现起来.. 感觉也就微信公众号获取用户信息这段稍微麻烦点..毕竟得翻着API才能写.

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

至于代码.. 我感觉真没啥说的,我是用nodejs实现的,后端的接口:

大约就这么几个吧,简单写下关于微信公众号获取用户信息的代码吧。

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

nodejs - thinkjs - controller/wechat.js

/***
 * 微信模拟登录获取当前用户信息
 */
const Base = require('../base');
const axios = require('axios');

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);
    }
}

转载请注明出处: https://chrunlee.cn/article/wechat-scan-login.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
之前看知乎相中了一个想法,给宝宝做一个站,上传生活的日常照片啊、视频之类的,存储肯定是在自己家里,然后做个穿透这样..开始做的时候又想着是时候接触下这些东西了,虽然公司都一点不用,但是自己没事接触下拓展下也是好的。
在程序中,会有需要后台一直运行的场景。这一节我们来做一个监控某网站的运行状态,如果没有运行,则改变当前的图标。
反爬有很多手段,字体反爬就是其中之一。之前一直都是听过,但是却没怎么在实际爬虫中遇到过,最近在一个爬虫题目网站上看到了,试了试,发现还挺麻烦,当然自己从头研究字体肯定麻烦,简单的是模块多的是,选几个就过了。
最近看某站壁纸挺好看的,抓了几百张放本地...可总不能每天手动去换吧,就做了一个随机更换的小工具。
本篇文章以一个实际的小项目为主题进行从头到尾的讲解实现,该项目总计开发时长约6小时,主要是有很多页面或功能都是现成的,直接复制过来的,剩下的就调整下样式、字段内容等。
上一张中已经完成了比较简易的3D全景浏览,但是...这是写死在xml中的,对于我们实际的项目,这种情况是不可能适应的。所以,来了解下如何动态加载xml已经设置对应的热点。
登录方式现在非常多,不过像我这种小站让用户自己注册基本是不可能的了,只能依赖现有的第三方的登录来集成,之前有集成github,不过这个太过针对性,这里准备集成QQ互联登录,慢慢记录下。
上一章,我们学习和了解了websocket 是什么以及初始搭建,接下来,我们继续了解,如何进行广播以及对应的私聊呢。