nodejs服务获取微信用户openid

本文展示了前端如何利用微信用户信息获取code,并将code传递给后端完成登录验证。前端使用wx.getUserProfile获取用户信息,后端通过微信API获取openid,再结合数据库操作进行用户登录或注册。登录成功后,将token和用户信息存储到本地。
摘要由CSDN通过智能技术生成

前端代码

接口发送code就可以

<template>
    <view class="brn-wrap">
      <view class="uni-btn-v" v-if="!hasLogin">
        <button @click="handleBeforeLogin">{{ title }}</button>
      </view>
      <view class="uni-btn-v" v-else>
        <button @click="handleTitleClick">{{ title }}</button>
      </view>
    </view>
</template>

  import { requestLogin } from '@/utils/str.js';
  export default {
    props: {
      title: {
        type: String,
        default: '提交发布'
      }
    },
    data() {
      return {
        hasLogin: false
      };
    },
    methods: {
      handleTitleClick() {
        this.$emit('submit');
      },
      handleBeforeLogin() {
        let that = this;
        // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
        // 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
        wx.getUserProfile({
          desc: '用于完善用户资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
          success: res => {
            console.log(res);
            that.doLogin(res);
          }
        });
      },
      doLogin(detail) {
        const self = this;
        if (detail.errMsg === 'getUserProfile:ok') {
          console.log('===', detail);
          const options = wx.getLaunchOptionsSync();
          const scene = options.scene + '';
          if (scene.startsWith('CRLAND:')) {
            detail.userInfo.scene = scene.substr(7);
          }
          requestLogin().then(async data => {
            console.log('========', detail.userInfo);
            const obj = {
              ...detail.userInfo,
              userInfo: detail.rawData,
              code: data.code
            };
            const { code, result } = await this.$api.user.login(obj);
            if (code === 200) {
              uni.setStorageSync('userInfo', JSON.stringify(detail.userInfo));
              uni.setStorageSync('token', result.token);
              uni.setStorageSync('userId', result.userId);
              this.hasLogin =true;
              uni.switchTab({
                url: '/pages/index/index'
              });
            } else {
              uni.showModal({
                title: '提示',
                content: e.msg || '登录失败',
                showCancel: false,
                confirmText: '确定',
                success: res => {}
              });
            }
          });
        }
      }
    }
  };

后端代码

后端只需要拿到code就可以,code不能二次使用

const express = require('express')
const http = require('https')
const router = express.Router()
const mongoose = require('mongoose')
const qs = require('querystring')
const User = require('../models/User') //引入模块模型
const vertoken = require('../utils/token') //引入token
const wx = require('../config/wx')

// 登录
router.post('/login', (_req, _res) => {
  console.log(_req.body, ' 页面传入参数')
  let user = Object.assign({}, _req.body)
  var query = {
    appid: wx.appid,
    secret: wx.secret,
    js_code: _req.body.code,
    grant_type: 'authorization_code',
  }
  var content = qs.stringify(query)
  var options = {
    hostname: 'api.weixin.qq.com',
    port: '',
    path: '/sns/jscode2session?' + content,
    method: 'GET',
    header: {
      'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
    },
  }

  var req = http.request(options, function (res) {
    res.on('data', function (_data) {
      console.log('_data: ', _data)

      let parsData = JSON.parse(_data.toString())
      const { openid } = parsData
      User.find(
        {
          openid,
        },
        (err, users) => {
          if (users && users.length > 0) {
            vertoken.setToken(users[0]._id, users[0].openid).then((token) => {
              _res.json({
                code: 200,
                result: {
                  token,
                  userId:users[0]._id
                },
                message: '登录成功',
              })
            })
          } else {
            user.openid = openid
            new User(user).save().then((val) => {
              vertoken.setToken(val._id, openid).then((token) => {
                _res.json({
                  code: 200,
                  result: {
                    token,
                    userId:val._id
                  },
                  message: '登录成功',
                })
              })
            })
          }
        }
      )
    })
  })

  req.on('error', function (e) {
    console.log('problem with request: ' + e.message)
  })

  req.end()
})

module.exports = router

完整代码

前端
node服务端

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值