前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信扫描小程序码登录 PC 网站 Demo

微信扫描小程序码登录 PC 网站 Demo

作者头像
薛定喵君
发布2021-01-27 14:31:40
2.8K0
发布2021-01-27 14:31:40
举报
文章被收录于专栏:薛定喵君薛定喵君

本文主要介绍如何基于小程序页面授权,使用微信扫描PC端小程序码实现获取用户信息进行系统登录。

之前介绍过一个Demovue项目:基于网页授权的微信扫码登录Demo,最近了解到小程序也可以实现这个功能,所以突发奇想自己实现一个备用吧。

# 实现思路

简要介绍

PC 端点击使用小程序登录时会生成一个 uuid 并弹出一个小程序码,小程序码的 scene 值附带了生成的 uuid 对应到一个线上的小程序页面,微信扫码后打开小程序页面,小程序内解析 scene 值中的 uuid ,用户点击按钮进行授权登录,页面内拿到用户信息后通过云函数将 uuid 及 用户信息传递给服务端后存入云数据库中,PC 端通过轮询方式根据打开页面时生成的 uuid 作为参数来获取用户的 openid 等基础信息进行登录操作从而进入系统。

# 使用技术栈

主要技术介绍:

  • vue:2.6.11
  • vuex:3.1.2
  • vue-router:3.1.5
  • element-ui:2.13.0
  • koa:2.11.0
  • 小程序云开发

# 主要问题

  1. 小程序全局 access_token 项目需要在 web 端生成小程序码,二维码生成需要小程序全局 access_token,所以选择了在打开页面的时候预生成全局 access_token 以备用
  2. 小程序码更新问题 本示例项目的小程序页面授权获取信息采用了两种方式
  • 云端免鉴权:用户扫码打开小程序页面时就利用云函数获取到用户的 openid 信息
  • 按钮获取:通过用户主动点击授权按钮获取开放数据,包含昵称、头像数据 两种处理方式不同,所以生成的小程序码的 scene 值也是不同的,用户切换两种方式的时候需要实时更新二维码

# 项目开发

# 服务端启动

服务端基于 koa 框架开发,在根目录的 server 文件夹下。

安装依赖

代码语言:javascript
复制
cd server
npm install

配置小程序,复制一份 config.sample.js 重命名为 config.js 填好如下配置

代码语言:javascript
复制
module.exports = {
  port: '', // 服务端端口号
  appId: '', // 小程序appid
  appSecret: '' // 小程序secrect
}

然后启动服务

代码语言:javascript
复制
node app.js

访问地址

代码语言:javascript
复制
http://localhost:2002

接着我们来配置 web 端

# web 端

修改env环境变量配置,项目使用的后台服务端口为 2002

代码语言:javascript
复制
VUE_APP_BASE_API = 'http://localhost:2002'

安装依赖

代码语言:javascript
复制
npm install

开发

代码语言:javascript
复制
npm run serve

访问

代码语言:javascript
复制
http://localhost:9556

web 端默认使用9556端口

# 小程序修改

项目的主角是小程序,所以当然需要一个小程序,个人主体就可以。 有了小程序之后首先要在微信开发者工具内开通云开发。 接着进行下面的操作。

  1. 新建云函数 例:openid_login 作用主要是为了获取用户信息并存入云数据库 index.js 内容:
代码语言:javascript
复制
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()

exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  try {
    let openid = wxContext.OPENID
    // 防止重复存储
    let uuids = await db
      .collection('uuids')
      .where({
        uuid: event.uuid,
      })
      .get()

    if (uuids.data.length) {
      await db
        .collection('uuids')
        .doc(uuids.data[0]._id)
        .update({
          data: {
            openid: openid,
          },
        })
      return uuids
    }

    const result = await db.collection('uuids').add({
      data: {
        ...event,
        uuid: event.uuid,
        openid: openid,
      },
    })
    return result
  } catch (err) {
    console.log(err)
    return err
  }
}

package.json 内容:

代码语言:javascript
复制
{
  "name": "openid_login",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "wx-server-sdk": "latest"
  }
}
  1. 在云数据库新建一个集合,比如 uuids,主要为了存储 uuid 以及用户信息的。
  2. 新建一个小程序页面,扫码登录用的。 这里我是用的个人博客小程序,框架用的 mpvue ,下面是核心代码。
代码语言:javascript
复制
onLoad(options) {
  let params = []
  // 扫码进来时的处理
  if (options.scene) {
    params = decodeURIComponent(options.scene).split('&')
    this.uuid = params[0].split('=')[1]
    this.useAuth = params[1].split('=')[1]
  } else {
    this.uuid = options.uuid
    this.useAuth = options.useAuth
  }
  if (+this.useAuth === 0) {
    wx.cloud.callFunction({
      name: 'openid_login',
      data: {
        uuid: this.uuid,
      },
    })
  }
},

需要注意的是小程序码里对应的页面必须是线上的页面,所以要审核通过之后才能进行测试。

# 在线 Demo

可以用这个来体验一下扫描小程序码登录的有趣玩法。 http://mpscan.tiaocaoer.com

# 项目总结

一个字:有意思。 首先又可以多拉几个用户了,用户每次登录都需要扫码二维码,无形当中增加了很多日活啊,妙哉~ 另外巧妙运用了云开发的免鉴权,如果只是需要 openid 或者 unionid 的话,会变得很是方便。 缺点就是万一依附的小程序有什么意外,这个功能就用不了,另外这个适合做成一个插件,这样子就比较通用了。

# 参考资料

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 实现思路
  • # 使用技术栈
  • # 主要问题
  • # 项目开发
    • # 服务端启动
      • # web 端
      • # 小程序修改
      • # 在线 Demo
      • # 项目总结
      • # 参考资料
      相关产品与服务
      云开发 CloudBase
      云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档