nodejs服务获取微信用户openid
Posted chi1130
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs服务获取微信用户openid相关的知识,希望对你有一定的参考价值。
前端代码
接口发送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
完整代码
以上是关于nodejs服务获取微信用户openid的主要内容,如果未能解决你的问题,请参考以下文章
nodejs+koa+uniapp实现微信小程序登陆获取用户手机号及openId