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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值