用小程序来实现扫码登录

sxkk20082年前知识分享325

前言

在 web 开发中,少不了用户系统,开发者需要开发注册登录这些重复的功能,而对于用户来说,要要注册才可以使用,往往会不愿意,因为我们有太多的账号和密码了,而现在,微信拥有 12 亿的月活用户,使用微信实现扫码登录,会大大减少需要用户注册而造成的流失率,而实现微信扫码登录有一定门槛,首先需要是企业用户才可以在微信开发平台注册账号,紧接着需要认证缴费 300 元才可以,简直就是黑店,而现在我们可以使用小程序来实现,今天就来讲讲小程序扫码登录的实现方式。

小程序扫码登录的优点

  • 不需要企业资质,个人用户就可以注册小程序;
  • 不需要认证,每年可以省 300 元;
  • 打通小程序端的用户数据,可以让 PC 网站往移动端引流,用户不流失;

流程图

小程序来实现扫码登录流程图

小程序用户系统实现

首先需要有小程序的用户系统

第一步:获取用户登录凭证

通过 wx.login 获取用户登录凭证 res.code

wx.login({
  success: (res) => {
    //res.code
  },
})

在 uniapp 中,可以使用统一封装的登录方法

export default {
  data() {
    return {
      user: null,
    }
  },
  onLoad() {
    //第一步 login 获取 code
    uni.login({
      provider: 'weixin',
      success: (res) => {
        this.wxlogin(res.code) //第二步调用云函数
      },
    })
  },
  methods: {
    async wxlogin(wxcode) {
      // code 获取 openid 存入数据库中
      this.user = await uniCloud.callFunction({
        name: 'user_authorize',
        data: {
          code: wxcode,
        },
      })
    },
  },
}

user 是数据库中的用户信息,用于展示在页面上,这一步用户登录无感知的,我们也无法获得用户的头像昵称等信息,若要在 pc 上展示用户信息,可使用 uni.getUserProfile 方法。

授权登录

实现代码如下:

export default {
  data() {
    return {
      user: null,
    }
  },
  onLoad() {},
  methods: {
    async getUserProfile() {
      //第一步 login 获取 code
      uni.login({
        provider: 'weixin',
        success: function (loginRes) {
          console.log(loginRes.code)
          // 获取用户信息
          uni.getUserProfile({
            desc: '个人登录,记录数据', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
            success: function (infoRes) {
              console.log('用户昵称为:' + infoRes.userInfo.nickName) //昵称
              console.log('用户昵称为:' + infoRes.userInfo.avatarUrl) //头像
              this.wxlogin(loginRes.code, infoRes.userInfo)
            },
          })
        },
      })
    },
    async wxlogin(wxcode) {
      // code 获取 openid 存入数据库中
      this.user = await uniCloud.callFunction({
        name: 'user_authorize',
        data: {
          ...infoRes.userInfo,
          code: wxcode,
        },
      })
    },
  },
}

getUserProfile 方法不能主动调用,必须通过按钮,用户点击授权获得,所以我们需要在页面中加入以下代码:

<template>
  <view>
    <button class="login-btn" v-if="!user" open-type="getUserProfile" @click="getUserProfile">点击登录button>
    <view v-if="user">
      <text>{{ user.nickName }}text>
    <view>
  view>
template>

第二步:code 获取 openid 存入数据库中

请求服务端,服务端通过微信的code2session接口获取 openid 这个 openid 就是小程序与微信的唯一 id 了,这里我以 uniapp 云函数为例,说明下实现代码。

async function code2Session(appId, secret, code) {
  const res = await uniCloud.httpclient.request(
    `https: //api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${code}&grant_type=authorization_code`,
    {
      dataType: 'json',
    }
  )
  return res.data
}

uniCloud.httpclient.request请求 code2Session接口获取 openid

const db = uniCloud.database()

exports.main = async (event, context) => {
  let appId = '小程序appid'
  let appSecret = '小程序秘钥'
  let res = await code2Session(appId, appSecret, event.code)

  let wx_user = await db
    .collection('wx_user')
    .where({
      openid: res.openid,
    })
    .get()
    .then((res) => res.data[0])
  // 判断用户是否存在
  if (!wx_user) {
    let createTime = new Date().getTime()
    let user_new = await db.collection('wx_user').add({
      ...event,
      code: undefined,
      openid: res.openid,
      createTime,
    })
    // 查询最新的数据
    wx_user = await db
      .collection('wx_user')
      .where({
        openid: res.openid,
      })
      .get()
      .then((res) => res.data[0])
  }
  return {
    success: true,
    data: chrrentUser,
  }
}

判断用户是否存在,若不存在就新建一条数据,若存在,就直接返回数据库中的数据,这样就可以建立用户系统。

PC 端扫码登录

PC 端扫码登录,依赖微信提供的wxacode.getUnlimited接口, 该接口获取的小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制。我们可以通过业务码来实现登录。 下面代码是云函数,用于获取 PC 端的二维码。

//封装获取access_token的方法 1分钟1w次
async function getAccessToken(appId, appSecret) {
  const res = await uniCloud.httpclient.request(
    `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`,
    {
      dataType: 'json',
    }
  )
  return res.data.access_token
}

exports.main = async (event, context) => {
  const data = JSON.parse(data.body)
  let appId = '小程序appid'
  let appSecret = '小程序秘钥'
  const access_token = await getAccessToken(appId, appSecret)

  const res = await uniCloud.httpclient.request(
    'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=' + access_token,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      data: {
        scene: data.scene,
        page: data.page,
        env_version: 'release', //扫描后打开的小程序的版本,正式版release,体验版trial,开发版develop
        width: '430', //生成的小程序码图片的宽度
        //小程序码线条的颜色
        line_color: {
          r: 0,
          g: 0,
          b: 0,
        },
      },
    }
  )
  return 'data:image/png;base64,' + res.data.toString('base64')
}

然后,需要在小程序 onLoad 时候,获取扫码登录的唯一值,并且保存到全局中。

onLoad(options) {
  this.scene = options.scene;
}

登录授权的时候将 scene 和用户信息保存到用户表

async wxlogin(wxcode) {
      // code 获取 openid 存入数据库中
  this.user = await uniCloud.callFunction({
    name: "user_authorize",
    data: {
      ...infoRes.userInfo,
      scene:this.scene,
      code: wxcode,
    },
  });
},

接下来 pc 端,就可以根据 scene 轮询查询 user 表,获取登录信息了。

PC 扫码登录步骤

  • PC 端点击登录时生成并显示小程序码,此时开启轮询,每 3 秒查询一次数据库;

  • 在三分钟内如果查询不到匹配的用户信息,结束轮询,并让二维码失效;

  • 若查询到匹配用户可以将用户信息通过 JsonWebToken 保存,同 PC 登录原理一致。

小程序端优化

可以先通过 wx.login 实现免提示登录,此时 PC 端二维码显示扫码成功。

再通过 wx.getUserProfile 授权获取用户头像等信息,实现同步。

体验

最后我将完整代码实现在小程序"面试狗"中,PC 端大家可以访问:https://www.runjs.cool/interview 体验

Github 地址: https://github.com/maqi1520/runjs.cool

如果对你有帮助,可以随手点个赞,这对我真的很重要。

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

相关文章

AI绘画的技术与未来

AI绘画的技术与未来

  AI(人工智能)绘画是一项新兴技术,正逐渐地在艺术领域走进人们的视线。AI绘画通过人工智能算法实现图像创作,其灵活性和创新性使得越来越多的艺术家开始使用它来创作作品。今天...

【油猴脚本】在 Iconfont 上直接复制 React component 代码

【油猴脚本】在 Iconfont 上直接复制 React component 代码

本文接上一篇《如何在项目中管理你的图标?》Iconfont 和 SVG 优缺点对比在上文中介绍了使用 iconfont 的缺点,以及使用 SVG 的优点,简单归纳为以下几点:Icon 的缺点当网络不好...

新的文档采用了全新的架构 next.js + Tailwind CSS ,改版后的文档界面有种焕然一新的感觉,支持暗黑模式,我们可以在线学习,并且写代码,采用了这种所见即所得的形式,大大降低了学习者的成本,我也被这种形式所深深吸引,那么这种所见即所得的形式是如何实现的呢?

基本介绍

新文档地址在 https://github.com/reactjs/reactjs.org/ 中的 beta 目录下,外层代码是目前的文档代码,那么我们可以直接 git clone 并且拷贝 beta 目录下的内容

这里面有 yarn.lock 文件,跟绝大多数 next 项目一样 yarn install 之后,运行 yarn dev 就可以运行开发环境

s16501401132022

启动速度非常快,仅仅 3.3s, 打开 http://localhost:3000,此时 next.js 会再次编译,大概 200ms,这种优势得益于 next.js 按需编译的优势,也就是是说当前启动的时候,并不会全站打包,而是当进入某个页面的时候编译当前页面,所以速度相当快。

约定式路由

s16384301132022 next 是约定式路由,在 pages 文件夹下的目录默认生成路由,即 '/src/pages/learn/add-react-to-a-website.md' 生成路由 /learn/add-react-to-a-website

此时发现里面的文档都是.md后缀的 Markdown 文件,那么 markdown 也可以写交互功能了吗? image.png

React 新的文档用到了哪些技术?

前言https://beta.reactjs.org React 的新的文档已经 完成了 70 % 并且呼吁社区进行翻译工作。 新的文档采用了全新的架构 next.js + Tailwind CSS...

2-3 分钟后会在屏幕上输出宝塔面板的登录地址,宝塔面板会随机生成用户名、密码和端口,我们需要把这些地址保存到本地,以免下次忘记。

接下来我们需要在云服务器上设置安全组或者防火墙,放行自动生成的端口。

腾讯云配置安全组

开通了端口,输入宝塔面板地址,输入用户名和密码就可以登录了 宝塔面板登录

域名解析

腾讯云域名解析

在你的域名服务商后台,将一个域名解析到 这台这台服务器 ip,解析完成后,你就可以使用域名访问了。

安装 PHP+mysql

登录后要先绑定一个宝塔账号,这个大家自行注册就可以了 选择系统推荐的 LNMP 环境 绑定成功后,我们来安装 PHP+mysql,系统会自动弹窗框让我们来选择环境,我这里选择 LNMP

  • 急速安装,安装时间极快(5-10 分钟),版本与稳定性略低于编译安装,适合快速部署测试
  • 编译安装,安装时间长(30 分钟到 2 小时),性能最大化,适合生产环境, 点击一键安装后,宝塔面板就会开始安装环境了

LNMP 环境安装进度 等待 10 分钟后,环境安装完成,当然有经验的同学可以自行安装 PHP+mysql 的环境,但是使用宝塔面板对新手比较友好。

访问IP显示会宝塔404页面 此时访问我们的 IP 就可以看到页面,说明我们的环境已经安装成功了。

安装微擎

微擎官网:https://www.we7.cc/

微擎官方文档:https://www.kancloud.cn/donknap/we7/136557

微擎源码地址:https://gitee.com/we7coreteam/pros

微擎是一款小程序和公众号管理系统,可以实现微信平台(mp.weixin.qq.com)不能实现的功能,例如商城,餐饮,酒店,汽车,门店,同城,各类行业解决方案,营销,推广,吸粉,游戏,物联网和人工智能等功能,这些应用大部分收费,也有免费的应用,大家可以在官网上搜索安装。

点击网站,添加网站,输入你自己的要解析的域名, 宝塔面板添加网站

选择创建数据库,和 FTP,点击提交,此时输入我们的域名可以看到如下页面

宝塔默认创建的页面

说明我们的网站创建成功了。

安装微擎框架

在网站 ftp 目录下上传微擎框架的源码 上传微擎框架源码

上传完成后点击 zip 文件解压

设置网站默认站点

点击默认站点,设置我们刚才创建的网站

输入IP,开始安装微擎 输入 IP 地址,就可以进入微擎的安装页面了。 微擎安装页面检查环境

安装过程中会检查 PHP 环境要求,若检查不成功,我们需要修改相应的 PHP info 文件。

微擎配置数据库和密码

点击继续输入刚才创建的数据库信息,并且设置微擎后台密码

微擎安装完成

点击继续安装完成

《成语小秀才》部署教程

前言相信很多朋友都玩过这款小游戏,叫成语秀才,没体验过的朋友可以点击这里,扫码体验,这款小游戏开发起来还是比较困难的,首先要有一份海量的题库,然后在每道题都有不同的布局,我是一个非常喜欢学习的人,于是...

image.png

使用 React-DnD 打造简易低代码平台

前言2016 年起,低代码概念开始在国内兴起,当年该行业总共有 10 起融资事件,之后低代码行业融资笔数整体呈上升趋势,并在 2020 年增长至 14 起,其中亿元以上融资有 13 起。从融资轮次分布...

至此我们的编辑器已经完成。当然产品细节决定产品质量,码上掘金中的例子,还需要继续打磨优化样式,加入更多功能,才可以开发出一款比较完善的产品。

云函数开发接口

为了让数据保存到云端,我选择使用云函数来开发接口,使用云数据库来保存数据。至于为什么?主要是因为便宜。

目前腾讯云开发 19.9 一月,我这里选择使用

Next.js 全栈开发微信公众号 Markdown 排版编辑器

文章为稀土掘金技术社区首发签约文章,14 天内禁止转载,14 天后未获授权禁止转载,侵权必究!阅读本文,你将收获:学会使用 Monaco Editor 开发多文件编辑器学会使用 mdx 在线编译了解了...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。