представлять
Во многих приложениях WeChat H5, когда пользователи получают доступ к сторонним приложениям, требуется авторизация веб-страницы WeChat, и для многих операций, связанных с безопасностью, мы должны сначала получить информацию о пользователе, прежде чем продолжить.Эта статья кратко знакомит с процессом авторизации WeChat и через приложение WeChat Протестируйте учетную запись для имитации авторизации на веб-странице. Пользователь нажимает «ОК», чтобы войти на страницу авторизации, чтобы получить информацию о пользователе и отобразить ее на странице внешнего интерфейса. Окончательный эффект выглядит следующим образом.
Инструменты и подготовка к разработке
1. Инструменты разработчика WeChat и тестовая учетная запись WeChat
Поскольку он авторизован WeChat, его необходимо использовать в среде WeChat.здесьУстановите инструменты разработчика WeChat, так как своего приложения у нас нет, нам также необходимоПубличная платформа микроканалаПодайте заявку на номер теста интерфейса, который эквивалентен нашему стороннему приложению.
2. Настройка параметров
После входа в тестовую учетную запись вы можете просмотреть информацию о своем appId и appsecret, а также изменить основную информацию о пользователе посредством авторизации веб-страницы службы веб-страницы в таблице разрешений пользовательского интерфейса на 127.0.0.1:8800, что является адресом на который перезвонит пользователь после подтверждения авторизации.Адрес фоновой обработки приложения, как показано ниже
Наконец, достаньте свой WeChat и отсканируйте код, чтобы пройти тестовый номер, как показано на рисунке ниже.
Введение в процесс авторизации WeChat
Для конкретного процесса и подробного ознакомления вы можете перейти на официальный сайтТехническая документация общедоступной платформы WeChatПросмотр, грубо разделенный на четыре шага:
1. Направьте пользователя на страницу авторизации, чтобы согласиться с авторизацией.В это время будет вызван API WeChat для получения кода.
2. После прохождения авторизации будет запрошен callback-адрес с параметром code
3. Получите код в фоновом режиме и снова вызовите интерфейс WeChat, чтобы обменять авторизацию веб-страницы access_token и openid.
4. Получите базовую информацию о пользователе, авторизовав access_token и openid на веб-странице (при наличии unionid будет также получен параметр unionid)
Официально начать
Подробный код можно скачать на github по адресу https://github.com/wangfengyuan/wxAuthorize.
1. Исходный код
let express = require("express");const https = require('https');
let app = express();
//appIDlet
appID = `wxec6fa9e9bc03d885`;
//appsecretlet
appSerect = `4c8a0d14cff08959b4e17334cabf9cf0`;
//点击授权后重定向url地址
let redirectUrl = `/getUserInfo`;
let host = `http://127.0.0.1:3000`;
//微信授权api,接口返回code,点击授权后跳转到重定向地址并带上code参数
let authorizeUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=` + `${host}${redirectUrl}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`
app.get("/login", function(req, res) {
res.sendFile(path.resolve(__dirname,'login.html'));
});
app.get("/auth", function(req, res) {
res.writeHead(302, {
'Location': authorizeUrl
});
res.end();
});
app.get("/getUserInfo", function(req, res) {
let code = req.query.code;
let getaccess = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=` + `${appID}&secret=${appSerect}&code=${code}&grant_type=authorization_code`;
//通过拿到的code和appID、app_serect获取access_token和open_id
https.get(getaccess, (resText) => {
var ddd = "";
resText.on('data', (d) => {
ddd += d;
});
resText.on('end', () => {
// console.log(ddd);
var obj = JSON.parse(ddd);
var access_token = obj.access_token;
var open_id = obj.openid;
//通过上一步获取的access_token和open_id获取userInfo即用户信息
let getUserUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${open_id}&lang=zh_CN`;
https.get(getUserUrl, (resText) => {
user = "";
resText.on('data', (d) => {
user += d;
});
resText.on('end', () => {
console.log(user);
var userobj = JSON.parse(user);
res.send(userobj);
console.log(userobj);
});
}) });
}).on('error', (e) => {
console.error(e);
});
app.listen(3000);
При его использовании вам нужно заменить appID и appSerect на ваши соответствующие параметры, потому что наши запросы в определенном порядке, но нода отправляет запросы асинхронно, поэтому наши запросы вложены в три слоя, а код уродлив.Так что здесь мы можем использовать ES6 async и await, чтобы решить ад асинхронного обратного вызова.
2. Улучшенный код с использованием ES6 async и await
async function wxAuth(req, res) {
//解析querystring获取URL中的code值
let code = req.query.code;
//通过拿到的code和appID、app_serect获取返回信息
let resObj = await getAccessToken(code);
//解析得到access_token和open_id
let access_token = resObj.access_token;
let open_id = resObj.openid;
//通过上一步获取的access_token和open_id获取userInfo即用户信息
let userObj = await getUserInfo(access_token, open_id);
console.log(userObj);
res.render(path.resolve(__dirname,'userInfo.ejs'), {userObj: userObj});
// res.send(userObj);}
//通过拿到的code和appID、app_serect获取access_token和open_id
function getAccessToken(code) {
return new Promise( (resolve, reject) => {
let getAccessUrl = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=` + `${appID}&secret=${appSerect}&code=${code}&grant_type=authorization_code`;
https.get(getAccessUrl, (res) => {
var resText = "";
res.on('data', (d) => {
resText += d;
});
res.on('end', () => {
var resObj = JSON.parse(resText);
resolve(resObj);
});
}).on('error', (e) => {
console.error(e);
});
});
}
//通过上一步获取的access_token和open_id获取userInfo即用户信息
function getUserInfo(access_token, open_id) {
return new Promise( (resolve, reject) => {
let getUserUrl = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${open_id}&lang=zh_CN`;
https.get(getUserUrl, (res) => {
var resText = "";
res.on('data', (d) => {
resText += d;
});
res.on('end', () => {
var userObj = JSON.parse(resText);
resolve(userObj);
});
}).on('error', (e) => {
console.error(e);
});
})}
После модификации поток кода стал намного понятнее.Наконец, после нажатия кнопки «Подтвердить» для входа в систему полученный userObj будет отображаться на странице внешнего интерфейса через шаблон ejs, и вы можете увидеть рендеринг, отображаемый в начале статьи. .
напиши в конце
Я только начал работать с интерфейсом не так давно. Недавно я проходил стажировку в компании и находился под влиянием моих коллег, поэтому я также начал писать статьи, чтобы зафиксировать свой опыт обучения. Это первый раз, когда я пишу статью, поэтому, возможно, не очень хорошо Если у вас есть какие-либо предложения по коду, пожалуйста, поделитесь ими, спасибо!