淘宝用户授权并且获取用户资料
次功能可以做一个给自己的网站嵌入淘宝扫码登录之类的、
1.生成授权二维码
淘宝开放平台
1.首先要在淘宝开放平台注册一个应用
注册应用的详细地址
2.拼接授权码url
https://oauth.taobao.com/authorize?response_type=code&client_id=11111111&redirect_uri=http://www.taobao.com&state=1212&view=web
示例中的client_id和redirect_uri需要替换成您创建应用的实际数据。client_id可在“控制台-应用管理-管理-概览”的APP证书中找到,App Secret也在此处;redirect_uri和“控制台-应用管理-管理-应用设置-基本信息”中的回调地址保持一致。
拼接好url后 就可以制作二维码 在我理解二维码就是一张图片我们可以
前端有很多包可以实现url 转成二维码 如 paynowqr qrcode
这里因为是本地调试所以直接访问拼接的url
由于前端生成的二维码只是一个url 用户扫描就是打开这个url 所以前端根本无法捕获这个二维码被扫描 更别提可以直接获取到用户资料了
2.用户扫描二维码授权获取资料
由于之前拼接的url中和项目中都配置的回调url 这两个必须保持一致
然后用户扫描点击授权后他会跳转到这个url并且在url中带入个code参数
我们只要在生成url的时候和后端做一个WebSocket连接 扫描二维码跳转后后端感知到再通过code参数查询access_token
我后端使用的node简单写了一个
const express = require('express')
const app = express()
var fs = require('fs');
var https = require('https')
const { ApiClient } = require('./nodejs')
const port = 3000
const host = "localhost"
var key = fs.readFileSync('private.key');
var cert = fs.readFileSync('mydomain.crt');
var options = {
key: key,
cert: cert
};
var server = https.createServer(options, app)
var expressWs = require('express-ws')(app, server);
app.get('/', (req, res) => {
res.send('Hello World!')
})
//长连接
app.ws('/echo', function (ws, req) {
ws.on('message', function (msg) {
用户跳转url
app.get('/hello', function (reqs, res) {
console.log(reqs.query.code)
var client = new ApiClient({
'appkey': 'appkey',
'appsecret': 'appsecret',
'url': 'https://eco.taobao.com/router/rest'
});
获取access_token
client.execute('taobao.top.auth.token.create', {
'code': reqs.query.code,
}, function (error, response) {
if (!error) {
console.log(JSON.parse(response.token_result))
}
else console.log(error);
})
taobao.user.seller.get
ws.send('hello');
res.send('授权成功')
})
ws.send(123);
});
})
.get('/echo', (req, res) => res.send('hello world'))
server.listen(port, () => {
console.log(`Example app listening on port ${port}!`)
});
前端触发webSocket
var ws = new WebSocket("wss://localhost:3000/echo");
ws.onopen = function (evt) {
ws.send("Hello WebSockets!");
console.log("Connection open ...");
};
ws.onmessage = function (evt) {
console.log("Received Message: " + evt.data);
// ws.close();
};
ws.onclose = function (evt) {
console.log("Connection closed.");
}