【nodejs】使用nodejs获取微信小程序的openid,并授权登录

分成两步:
① 微信小程序的功能
② nodejs 后台的功能

首先小程序登录功能:查看官方文档
在微信小程序端,将code,encryptedData 和 iv 的值传给node
在nodejs端,通过 https://api.weixin.qq.com/sns/jscode2session 去获取 openid 和 sessionKey。再使用 sessionKey 去解密得到用户信息,将用户信息保存进表里,完成登录过程。

步骤:
① 微信小程序的功能

代码如下:

index.wxml


<view class='login-btn'>
  <button class='bottom-btn' open-type="getUserInfo" bindgetuserinfo="getUserInfo">立即登录</button>
</view>

index.js

const http = require('../../../utils/request.js');

Page({
/**获取用户授权及信息 */
  getUserInfo: function (e) {
    let that = this;
    if (e.detail.userInfo) {
      //用户按了允许授权按钮
      wx.showLoading({
        title: '正在登录...',
      })

      wx.login({
        success: res => {
          let code = res.code; //获取登录的临时凭证
          if (code) {
            //获取授权信息
            wx.getSetting({
              success: function (res) {
                if (res.authSetting['scope.userInfo']) {
                  //获取用户信息:getUserInfo必须是在用户已经授权的情况下调用
                  wx.getUserInfo({
                    withCredentials: true,
                    success: res => {
                      app.globalData.userInfo = res.userInfo //非敏感用户信息
                      // 发送请求,获取openid
                      let url = " xxxxx";//后台请求地址
                      let params = {
                          "code": code,
                          "encryptedData": res.encryptedData,
                          "iv": res.iv
                        }
                      http.request(url, "POST", params ).then(loginInfo => {
                        console.log("loginInfo:", loginInfo);
                      })
                    }
                  })
                }
              }
            });
          }
        }
      });
    }
  }
  })

request.js
utils 工具类里的方法,用于网络请求


function request(url, method, params) {
  let apiUrl = "http://xx.xx.xx.xx:8080/";
  return new Promise((resolve, reject) => {
    wx.request({
      url: apiUrl + url,
      data: params,
      header: {
        'content-type': 'application/json'
      },
      method: method,
      dataType: 'json',
      responseType: 'text',
      success: function(res) {
        if (res.statusCode == 200) {
          resolve(res.data);
        }
        if (res.statusCode == 500) {
          wx.showToast({
            title: '服务异常',
          })
        }
      },
      fail: function(err) {
        wx.hideLoading();
        reject(err);
      },
      complete: function(res) {
        wx.hideLoading();
      },
    })
  });
}
module.exports = {
  request: request
}

② node.js功能
获取openid和sessionKey

let code = params.code;//获取小程序传来的code
let encryptedData = params.encryptedData;//获取小程序传来的encryptedData
let iv = params.iv;//获取小程序传来的iv
let appid = "xxxxxxx";//自己小程序后台管理的appid,可登录小程序后台查看
let secret = "xxxxxxx";//小程序后台管理的secret,可登录小程序后台查看
let grant_type = "authorization_code";// 授权(必填)默认值

//请求获取openid
let url = "https://api.weixin.qq.com/sns/jscode2session?grant_type="+grant_type+"&appid="+appid+"&secret="+secret+"&js_code="+code;

let openid,sessionKey;

let https = require("https");

https.get(url, (res) => {
    res.on('data', (d) => {
        console.log('返回的信息: ', JSON.parse(d));
        openid = JSON.parse(d).openid;//得到openid
        sessionKey = JSON.parse(d).session_key;//得到session_key

    }).on('error', (e) => {
        console.error(e);
    });
});

下面这部分,是解密,解密后,可得到用户信息。
其实在用户授权后,也能在小程序上通过 wx.getUserInfo 方法,去获取到这些用户信息。

//下面这部分是解密	

var crypto = require('crypto');
function WXBizDataCrypt(appId, sessionKey) {
    this.appId = appId
    this.sessionKey = sessionKey
}

WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
    // base64 decode
    var sessionKey = new Buffer(this.sessionKey, 'base64')
    encryptedData = new Buffer(encryptedData, 'base64')
    iv = new Buffer(iv, 'base64')

    try {
        // 解密
        var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv)
        // 设置自动 padding 为 true,删除填充补位
        decipher.setAutoPadding(true)
        var decoded = decipher.update(encryptedData, 'binary', 'utf8')
        decoded += decipher.final('utf8')
        decoded = JSON.parse(decoded)
    } catch (err) {
        throw new Error('Illegal Buffer')
    }

    if (decoded.watermark.appid !== this.appId) {
        throw new Error('Illegal Buffer')
    }
    return decoded
}

//解密
var pc = new WXBizDataCrypt(appid, sessionKey);//这里的sessionKey 是上面获取到的
var decodeData = pc.decryptData(encryptedData , iv);//encryptedData 是从小程序获取到的
console.log('解密后 data: ', decodeData);
      

完毕~

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值