Nuxt3 页面嵌入微信扫码登录

Nuxt页面内嵌微信扫码登录

微信扫码登录主要通过扫码用用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数,在重定向页面通过code等参数请求后端接口,后端返回登录成功与否(后端用code去微信那获取access_token等)。若用户禁止授权,则不会发生重定向。
参考微信官网文档 网站应用微信登录开发指南
1、准备一个div

<div class="wxcode-con" id="login_container"></div>

2、引入微信js

<script setup lang="ts">
// import { WxLogin } from ''
definePageMeta({
  layout: false
})
useHead({
  title: '登录_注册',
  script: [
    { src: 'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js', type: 'text/javascript' },
    { children: 'var obj = new WxLogin({self_redirect: false, id: "login_container", appid: "xxxx", scope: "snsapi_login", redirect_uri: "https%3A%2F%2Fwww.xxxx.com%2FloginRedirect", state: "", style: "white", href: ""});', body: true }
  ]
})
</script>

id这里填写你装微信二维码的容器id
appid:把appid这样写本地不安全,目前没想到其他处理办法,先将就一下吧
redirect_url: 跳转的中间页面,得是正式环境得时候得地址,所以我这当时本地测不了。我这地址也就是http://www.xxx.com/loginRedirect
具体参数的意义及其配置请参考官方文档。

3、准备loginRedirect.vue

<template>
  <div class="text-center">欢迎登录</div>
</template>

<script lang="ts" setup>
import { getUserInfo, getScComplate } from "@/utils/api"
const route = useRoute()
const code = ref(route.query.code)
const state = ref(route.query.state)
const userInfo = useCookie('userInfo', { maxAge: 3600 * 24 * 30 })
const token = useCookie('token', { maxAge: 3600 * 24 * 30 })
const loginWx = async () => {
  const { data } = await useFetch(
    'http://xxx/login-with-wechat',
    {
      method: 'post',
      body: {
        code: code.value
      },
    }
  );
  // 根据自己后端的返回判断
  // 如果登录成功,但是未绑定微信,跳转绑定页面。如果已经绑定,去请求用户信息
  // 如果登录失败。。。。
}
if (!code) {
  navigateTo('/login')
} else {
  loginWx()
}

</script>

<style lang="scss" scoped></style>
Nuxt.js v3 中接入微信扫码授权登录的流程通常需要以下几个步骤: 1. **安装依赖**: 首先,你需要安装微信提供的官方 SDK,可以使用 npm 或 yarn 安装: ``` npm install wx-jssdk --save # 或者 yarn add wx-jssdk ``` 2. **配置微信JS安全域名**: 在微信公众平台上,设置你的服务器域名用于微信网页授权,确保这个域名已经添加到公众号后台的“开发者中心”的“JS接口安全域名”列表。 3. **引入并初始化 SDK**: 在 Nuxt 的组件或页面里,初始化微信 JavaScript 封装库: ```javascript import Wx from 'wx-jssdk' export default { async mounted() { if (process.client) { // 只在浏览器环境中运行 await this.$axios.get('api/wechat/getJSSDK') // 获取微信SDK配置 .then(({ config }) => { Wx.config({ debug: false, // 是否显示错误信息 appId: config.appId, timestamp: config.timestamp, nonceStr: config.nonceStr, signature: config.signature, jsApiList: ['checkJsApi', 'getUserInfo'] // 需要使用的API }) Wx.ready(() => { // 初始化成功后可以调用微信登录功能 this.loginWithWechat() }) }) } }, methods: { loginWithWechat() { Wx.authorize({ scope: 'snsapi_userinfo', // 请求用户基础信息权限 success(res) { // 用户授权成功后,可以调用getUserInfo获取详细信息 this.getUserInfo() }, fail(err) { console.error('微信登录失败:', err) } }) }, getUserInfo() { Wx.getUserInfo({ success(res) { const userInfo = res.userInfo // 得到用户的微信头像、昵称等信息 // 这里处理获取的信息,例如将数据发送到后端服务器 }, fail(err) { console.error('获取用户信息失败:', err) } }) } } } ``` 4. **后端处理**: 后端接收到前端传来的用户信息后,验证并存储用户的微信 OpenID 和其他必要的信息。同时,你还需要处理授权回调跳转回来的情况。 5. **安全性考虑**: 确保所有涉及用户敏感信息的操作都在HTTPS环境下,并妥善保管用户的授权令牌。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值