美文网首页
微信公众号授权登录

微信公众号授权登录

作者: 墨染丶轻尘 | 来源:发表于2017-07-25 11:31 被阅读0次

首先登录微信开发者平台
https://mp.weixin.qq.com

1.png

由于我个人是订阅号,没权限,就借了朋友一个账号
先设置域名,我这里直接看他的域名了

2.png

当然我们没有他的域名的权限,而且为了测试方便,把我们本地的host改一下映射到他的域名上


3.png

我这里用的fiddler改的,自己改的时候直接改host文件也是可以的

除了域名之外,还需要appId和AppSecret
从微信公众号平台找一下

4.png
然后配一下自己的访问链接
https://open.weixin.qq.com/connect/oauth2/authorize?appid=【这里填写appid】&redirect_uri=【这里填写授权链接(注意域名)】&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
进入链接看一下
5.png
loading过后点击复制出来当前的链接看一下
http://m.xxxxx.com/?code=xxxxxxxxxxx&state=1
我们会发现经过这个open.weixin.qq.com包装之后的链接,会多出来一个query,为code和state

我们要把这个code发送给后端,然后处理后会返回授权信息和用户信息
这里后端我们用的是nodeJS,思路都一样的,举一反三,由于本身代码量很少,我就尽量少的引用各种库和包了

先是nodeJS项目初始化
先创建一个文件夹,然后$npm init,一路回车
node的标配哈,会生成一个package.json
在这个文件夹下新建一个index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>微信授权</title>
</head>
<body>
    <div class="result"></div>
    <script>
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && /^2\d\d$/.test(xhr.status)) {
                document.querySelector('.result').innerHTML = xhr.responseText
            }
        };
        xhr.open("post", "/oauth", false);
        xhr.send(JSON.stringify({ code: /code=(.*?)\&/.exec(location.search)[1] }))
    </script>
</body>

</html>

前端就先写这么简单了
大概就是进入页面之后会将query中的code用ajax发出去,返回的内容直接innerHTML放到div里

然后右键新建一个server.js,先创建一个httpServer

var http = require('http');
var fs = require('fs');
var url = require('url');

http.createServer(function (req, res) {
    var urlObj = url.parse(req.url);
    if (urlObj.path == '/'||urlObj.path.indexOf('/?')==0) {
        fs.readFile('index.html', 'utf8', function (err, data) {
            res.end(data)
        })
    } else {
        res.end("404")
    }
}).listen(8081);

如果访问的是网站根路径,就直接读文件index.html,然后吐出去
此时文件目录大概是这样的

8.png
然后控制台node server
再访问这个授权的连接
https://open.weixin.qq.com/connect/oauth2/authorize?appid=【这里填写appid】&redirect_uri=【这里填写授权链接(注意域名)】&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
会发现返回的是404
因为我们前端代码ajax调用的xhr.open("post", "/oauth", false);嘛,没有oauth这个路由,当然是404了 9.png

现在写一下oauth的登录路由
在creatServer里加一个else if

http.createServer(function (req, res) {
    var urlObj = url.parse(req.url);
    if (urlObj.path == '/'||urlObj.path.indexOf('/?')==0) {
        fs.readFile('index.html', 'utf8', function (err, data) {
            res.end(data)
        })
    } else if (urlObj.path == '/oauth') {
        var str = '';
        req.on('data', function (data) {
            str += data;
        });
        req.on('end', async function () {
            res.end(str)
        })
    } else {
        res.end("404")
    }
}).listen(8081);

这样就会接受到什么内容,就直接返回了什么内容
当然我们是需要处理一下再返给前端的,而处理主要是调用两个微信的接口

一般node调用外部接口都是用superagent,所以要安装一下
命令行输入npm i superagent --save-dev
然后头部require一下
var superagent = require('superagent')
而获取用户信息大概分为两步骤,
1、先根据前端传过来的code,获取openidaccess_token

let getOauthInfo = (code) => new Promise((res, rej) => {
    superagent.get("https://api.weixin.qq.com/sns/oauth2/access_token")
        .query({
            appid:"【这里填写你的公众号appid】",
            secret:"【这里填写你的公众号secret】",
            code:code,
            grant_type:"authorization_code"
        })
        .end((e, d) => {
            res(JSON.parse(d.text))
        })
})

JSON.parse(d.text)这个对象里就包含了openidaccess_token
2、然后根据openidaccess_token获取授权信息和用户信息

let getUserInfo = (oauthInfo) => new Promise((res, rej) => {
    superagent.get("https://api.weixin.qq.com/sns/userinfo")
        .query({
            openid:oauthInfo.openid,
            access_token:oauthInfo.access_token,
        })
        .end((e, d) => {
            res(d.text)
        })
})

有了这两个方法,在req.on end里调用一下就好了

        req.on('end', async function () {
            let oauthInfo = await getOauthInfo(JSON.parse(str).code)
            let userInfo = await getUserInfo(oauthInfo)
            res.end(userInfo)
        })

好了重启一下后端,然后再访问授权链接

10.png

看到已经授权成功了,并且拿到了JSON,看下JSON的结构

11.png

用户名、openid、地址、头像,前端都已经拿到了,想做什么再前端处理改一下index.html一下就好了~

相关文章

网友评论

      本文标题: 微信公众号授权登录

      本文链接:https://www.haomeiwen.com/subject/sdrwkxtx.html