微信小程序实现登录授权,并将获取到的用户授权信息存储到数据库中

这篇具有很好参考价值的文章主要介绍了微信小程序实现登录授权,并将获取到的用户授权信息存储到数据库中。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.微信小程序授权登录实现原理图(如下)

  • 官方开发文档
    微信小程序实现登录授权,并将获取到的用户授权信息存储到数据库中
  • 注意:在实现授权登录时,不要使用测试号进行

2.WXML中的代码

<view class="container">
  <view class="userinfo">
    <!-- 授权前 -->
    <block wx:if="{{!hasUserInfo}}">
      <button bindtap="getUserProfile"> 获取头像昵称 </button>
    </block>
    <!-- 授权后 -->
    <block wx:else>
     <view class="users">
      <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
     </view>
    </block>
  </view>
</view>

3.JS代码

  • wx.getUserProfile使用文档
Page({
  data: {
    // 用户信息
    userInfo: {},
    // 判断显示授权前或授权后的样式
    hasUserInfo: false
  },
  onLoad() {
    // 获取存储的用户授权信息
    const userinfo =  wx.getStorageSync('userinfo') || {}
    console.log(Object.keys(userinfo));
    // 判断是否存在已经授权的用户信息
    if (Object.keys(userinfo).length == 0) {
      this.setData({
        userInfo: userinfo,
        hasUserInfo: false
      })
    } else {
      this.setData({
        userInfo: userinfo,
        hasUserInfo: true
      })
    }
  },
  getUserProfile(e) {
    let that = this
    // 获取个人信息
    wx.getUserProfile({
      desc: '用于获取用户个人信息',
      success: function (detail) {
        console.log(detail);
        wx.login({
          success: res => {
            var code = res.code; //登录凭证
            wx.request({
              url: 'http://127.0.0.1:8888/api/wxuser', //自己的服务接口地址
              method: 'post',
              header: {
                'content-type': 'application/x-www-form-urlencoded'
              },
              // 需要传给后端的数据
              data: {
                encryptedData: detail.encryptedData,
                iv: detail.iv,
                code: code,
                userInfo: detail.rawData

              },
              success: (res) => {
                console.log("res:", res.data)
                // 将用户授权信息存储到本地
                wx.setStorageSync('userinfo', detail.userInfo)
                // 将后端返回的token存储到本地
                wx.setStorageSync('token', res.data.token)
                that.setData({
                  userInfo: detail.userInfo,
                  hasUserInfo: true
                })
              },
              fail: function () {
                console.log('系统错误')
              }
            })
          }
        });
      },
      fail: function () {
       wx.showModal({
         content: '取消授权将会影响相关服务,您确定取消授权吗?',
         success (res) {
           if (res.confirm) {
             wx.showToast({
               title: '已取消授权',
               duration: 1500
             })
           } else if (res.cancel) {
             that.getUserProfile()
           }
         }

       })
      }
    })
  }
})

4. WXSS代码

.users {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.userinfo-avatar {
  height: 260rpx;
  width: 260rpx;
  border-radius: 50%;
}

5.后端代码(express)

  • config文件代码如下
// token全局配置文件
module.exports = {
    // 加密和解密的token秘钥(引号中的字符可以自定义)
    jwtSecretKey: 'advance8',
    // token有效期
    expiresIn: '8640h'
}
  • 路由模块
const express = require('express')
const router = express.Router()

const wxuserHandle = require('../router_handle/wxuser')
router.post('/wxuser', wxuserHandle.wxuser)

module.exports = router
  • 主要代码(如果不想多个文件,可以将wxuserHandle.wxuser这个位置内容替换为exports.wxuser的内容)
// 导入requset包
const request = require('request')
// 导入数据库操作模块
const db = require('../db/config')
// 导入生成token的包
const jwt = require('jsonwebtoken')
// 导入全局配置文件
const config = require('../config')
//config文件代码在上方
const { jwtSecretKey } = require('../config')
exports.wxuser = (req, res) => {
    let params = req.body // 接收小程序端传过来的所有数据
    let code = params.code;//获取小程序传来的code
    let encryptedData = params.encryptedData;//获取小程序传来的encryptedData
    let iv = params.iv;//获取小程序传来的iv
    let userInfo = JSON.parse(params.userInfo) //获取个人信息
    let appid = "换成自己的appid";//自己小程序后台管理的appid,可登录小程序后台查看
    let secret = "换成自己的secret";//小程序后台管理的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;
    request(url, (err, response, body) => {
        if (!err && response.statusCode == 200) {
            // 服务器返回的openid、sessionKey
            let _data = JSON.parse(body)
            _data.code = code
            _data.session_key = ''
            // 对用户信息进行加密生成字符串
            const wxToken = jwt.sign(_data, jwtSecretKey, { expiresIn: config.expiresIn })
            // 定义sql 语句,查询当前用户是否存在(openid)
            const sql = `select * from wxuser where user_id = ?`
            db.query(sql, _data.openid, (err, result) => {
                if (err) return res.cc(err) //res.cc为自定义封装,可以换成res.send
                if (result.length === 0) {
                    const sql = `insert into wxuser  set ?`
                    db.query(sql, { user_id: _data.openid, nickName: userInfo.nickName, avatar: userInfo.avatarUrl, gender: userInfo.gender }, (err, result) => {
                        if (err) return res.cc(err)
                        if (result.affectedRows !== 1) return res.cc('授权失败,请重试')
                        res.send({
                            token: 'Bearer ' + wxToken,
                            status: 200,
                            messages: 'WX 授权成功'
                        })
                    })

                }else {
                    const sql = `update wxuser set ? where user_id = ?`
                    db.query(sql, [{ user_id: _data.openid, nickName: userInfo.nickName, avatar: userInfo.avatarUrl, gender: userInfo.gender }, _data.openid], (err, result) => {
                        if (err) return res.cc(err)
                        res.send({
                            token: 'Bearer ' + wxToken,
                            status: 200,
                            messages: 'WX1 授权成功'
                        })
                    })
                    
                }
            })
        } else {
            res.cc('请求openid失败')
        }
    })

}
  • 注意: 在返回token的字符串拼接时,Bearer 后面必须有一个空格

最终效果:

  • 数据库中的结果
    微信小程序实现登录授权,并将获取到的用户授权信息存储到数据库中

  • 授权成功后存储数据结果
    微信小程序实现登录授权,并将获取到的用户授权信息存储到数据库中

  • 小程序演示
    微信小程序实现登录授权,并将获取到的用户授权信息存储到数据库中文章来源地址https://www.toymoban.com/news/detail-499194.html

到了这里,关于微信小程序实现登录授权,并将获取到的用户授权信息存储到数据库中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp微信小程序授权登录并获取手机号

    新版:前端要授权两次,一次获取用户信息授权码code,另外一次获取用户手机授权码code,全部传给后端。后端通过用户信息授权码获取openid,通过手机授权码获取手机号码。老版:前端传给后端授权码code和用户手机授权回调 里的iv和encryptedData给后端,后端通过code获取ope

    2024年02月11日
    浏览(99)
  • 微信小程序中如何获取用户手机号授权登录

    随着微信小程序的普及,许多应用程序需要用户登录才能提供更好的服务。而获取用户手机号码是验证用户身份和确保账户安全的重要步骤之一。因此,在本文中,我们将介绍如何在微信小程序中实现手机号授权登录。 首先,在小程序后台开发设置中勾选“获取手机号”选项

    2024年02月11日
    浏览(106)
  • 微信小程序:登录授权,根据手机号获取凭证,获取用户手机号

    1.微信小程序授权 controller 层代码 wxUtils 工具类 2.微信小程序,用户手机号获取 微信小程序,根据code(code为手机号获取凭证)获取用户加密手机号 获取用户手机号方法

    2024年02月14日
    浏览(65)
  • 微信小程序授权登录(含获取基本信息及绑定的手机号)

    1、授权获取微信个人信息 2、调用 wx.login() 获取临时登录凭证code 3、用code调用接口换取用户唯一标识openId、用户在微信开放平台账号下的唯一标识unionId和会话密钥session_key (1)前端获取 注意点 :正常开发中不会通过这种方法获取,会通过后台获取调用微信公众平台接口获

    2024年02月09日
    浏览(51)
  • .NET6使用微信小程序授权登录,获取手机号

    1.在appsettings配置你的小程序配置信息 2.请求接口时先获取Access_token 3.授权时获取手机号 4.微信接口要求必须使用Post请求方法 //小程序官方文档 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html

    2024年02月13日
    浏览(51)
  • 【微信授权登录】uniapp开发小程序,实现获取微信授权登录功能

    微信授权登录(获取用户信息) 1.先获取用户信息——用户授权允许后,通过调用uni.login 可以获取到code。 2.拿着获取到的code去调用——登录接口,可以获取到token。 3.把token存入缓存。就可以在页面判断是否登录了。 第一种方式: 第二种方式:

    2024年02月11日
    浏览(44)
  • 微信小程序获取用户的openid以及授权登录拿到用户头像及姓名

    在微信小程序中,往往需要将用户信息录入自己的数据库中,就得有一个唯一标记区分用户,这个标记就是openid。 我这里用云函数的方式,比较简单 先创建一个名为getOPenid的云函数  在云函数中获取微信调用上下文cloud.getWXContext  可选择性的返回openid、appid、unionid等,可详细查

    2024年02月12日
    浏览(60)
  • 微信小程序授权登录wx.getUserProfile获取不到昵称及头像解决方案

    半年前做的个小程序,更新了二个文字,重新上传审核通过,悲剧了,新用户的昵称全部变为微信用户,头像全部变为默认头像,查了半天代码没找到原因,相当头大,搜了一下文档,尴尬了,11月9号新更新的规则,不再返回昵称和头像值....需要用头像昵称获取能力去触发获

    2024年02月11日
    浏览(42)
  • mpVue 微信小程序授权登录流程(即登录鉴权流程)及获取手机号一键登录教程(getPhoneNumber使用)

    微信小程序登录 鉴权流程 如下: 因 wx.getUserProfile 与 wx.getUserInfo 接口被收回了,都不能弹出授权窗口,只能使用头像昵称填写能力去获取微信用户信息。 在鉴权页面如下操作 : 1、在 onShow 中调用微信登录 wx.login 获取到唯一的code(用来获取 openid ); 2、根据 wx.login 获取的c

    2024年02月12日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包