node.js实现微信授权登陆
声明:
此文章是针对于网页在微信浏览器获取用户信息的,由于是个人开发,所以只能使用订阅号(订阅号是不能使用微信的——网页授权获取用户基本信息的接口)服务号是可以的,但是订阅号可以申请公众平台测试账号来进行授权的练习,毕竟订阅号授权也是一样的逻辑。
参考文章:
Node.js实现微信授权登陆功能
NodeJs 开发微信公众号——验证服务器
正文:
一、测试公众号
1. 申请公众号
从零开始需要新申请一个公众号(订阅号或者服务号,步骤链接:[(个人)注册公众平台步骤](https://kf.qq.com/faq/120911VrYVrA151009eIrYvy.html) ,参考文章顶部声明)
2. 配置公众号
(1)配置JS接口安全域名(你的网站域名,不要带http或者https,不要带端口)
(2)申请配置测试号
3. 验证服务器
需要安装对应依赖
安装express和request:
npm install express request
安装sha1,将三个参数字符串拼接成一个字符串进行sha1加密
npm install --save sha1
测试号配置token一直失败是吗?那是应为微信要验证你的服务器。(token,自定义的,要与上面测试公众号一致)
// 引入sha1
const sha1 = require("sha1");
app.use((req,res,next)=>{
// GET请求携带参数是个参数signature,timestamp,nonce,echostr
const {signature,timestamp,nonce,echostr} = req.query;
console.log("user",req)
// 服务器的token
const token = "xinglu";
// 将token、timestamp、nonce三个参数进行字典序排序
const arrSort = [token,timestamp,nonce];
arrSort.sort();
// 将三个参数字符串拼接成一个字符串进行sha1加密,npm install --save sha1
const str = arrSort.join("");
const shaStr = sha1(str);
// 获得加密后的字符串可与signature对比,验证标识该请求来源于微信服务器
if(shaStr === signature){
// 确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效
res.send(echostr);
}else{
//否则接入失败。
res.send("no");
}
})
运行node服务器,在返回刚才测试公众号配置token页重新保存就保存成功了。
4. 获取授权
// 配置微信公众号信息
var AppID = '测试号信息中获取'
var AppSecret = '测试号信息中获取'
var code = ''
app.get('/getCode', (req, res) => {
var return_uri = 'http://jfzfg.com:5000/getAccessToken'
var scoped = 'snsapi_userinfo'
var state = '123'
console.log("触发")
res.redirect('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+AppID+'&redirect_uri='+return_uri+'&response_type=code&scope='+scoped+'&state='+state+'#wechat_redirect')
})
app.get('/getAccessToken', function(req, res){
code = req.query.code
console.log('得到授权码code:', code);
request.get(
{
url:'https://api.weixin.qq.com/sns/oauth2/access_token?appid='+AppID+'&secret='+AppSecret+'&code='+code+'&grant_type=authorization_code'
}, // 请求获取令牌
function(error,response,body){
if(response.statusCode == 200){
let data = JSON.parse(body)
let access_token = data.access_token;
let openid = data.openid;
request.get(
{
url:'https://api.weixin.qq.com/sns/userinfo?access_token='+access_token+'&openid='+openid+'&lang=zh_CN'
}, // 调用获取用户信息的api
function(error,response,body){
var userinfo = JSON.parse(body);
console.log(userinfo)
res.send("\
<h1>"+userinfo.nickname+" 的个人信息</h1>\
<p><img src='"+userinfo.headimgurl+"' /></p>\
<p>"+userinfo.city+","+userinfo.province+","+userinfo.country+"</p>\
");
}
)
}
}
)
})
用微信浏览器打开:http://jfzfg.com:5000/getCode(getCode前面换成你的服务器地址)
大功告成(●’◡’●)
二、正式公众号
正式公众号流程基本和上述一致,但是配置需要注意
基本配置
-
公众号开发信息注意
- 生成的开发者密码(AppSecret)信息保存好
- ip白名单可以填写服务器的ip 服务器配置
- 图例
-
注意
- 这里要填的URL为服务器域名,这里有个坑要注意,如果是http的话接口为80(80为http的默认端口),如果为https的话端口为443(443为https的默认端口)。
- 当然,端口不填因为是默认的,那这就遇到了一个问题,我当初的接口端口号是5000怎么搞(○´・д・)ノ。 解决办法
- 我的站点是依靠phpstudy(2016版)搭建的
- 其它选项菜单——phpstudy设置——端口常规设置
-
- (1)随便改个没被占用的端口,保存重启,这时候你的网站直接填域名可能就访问不到了,加上你设置的端口号即可(例如我之前访问我的网站是输入:http://jfzfg.com,但是现在接口80占用默认端口,所以要访问网站首页应搜索:http://jfzfg.com:81)
- (2)返回你的node项目文件中,把接口的端口号改为80
- (3)然后把你node中公众号的AppID和AppSecret换成和公众号开发信息中一致token也和你基本信息中一致
- (4)运行node项目,大功告成(●’◡’●)
想要在微信开发工具中调试的话需要加一下开发人员
由于我的是订阅号,所以无法真正的走通
希望对大家有所帮助
qq:2122375078
b站:行路zfg , UID:345976264