node微信小程序登录实现登录

news/2024/7/20 2:29:11 标签: 微信小程序, 小程序, node.js

node小程序>微信小程序登录实现登录

好久不见兄弟们这段时间比较忙

  • 需要使用到的模块
npm i axios
npm i uuid

废话少说直接上可cv(bai piao)代码

const axios = require("axios");
const uuid = require("uuid");
// 小程序>微信小程序的apikey这些
const wxKey = require("../../../main.js").wx;
// wx: {
// 	// 小程序 appid
// 	appid: "xxx",
// 	// 小程序 appSecret
// 	secret: "xxx",
// },

/**
 * @param {code,mode} req
 * @param {wx.login Code} code
 * @param {阶段} mode
 * @param {*返回} reust
 */
// res的code返回 200/400 直接下发用户信息/创建用户
module.exports = async (req, reust) => {
	// 获取从客户端上传上来的key
	try {
		let { code } = req.body;
		let { appid, secret } = wxKey;
		let openid;
		if (!code) {
			return Promise.reject("没有code参数");
		}
		await axios
			.get("https://api.weixin.qq.com/sns/jscode2session", {
				params: {
					appid: appid,
					secret: secret,
					js_code: code,
					grant_type: "authorization_code",
				},
			})
			.then((response) => {
				if (response.data.errcode) {
					return Promise.reject("非法的用户凭证");
				}
				openid = response.data.openid;
			});
		// openid 这个参数在这里就已经拿到了用户的openid
	} catch (err) {
		// 出错了执行
	}
};

下面展示我的完整代码

const axios = require("axios");
const uuid = require("uuid");
const wxKey = require("../../../main.js").wx;
const db = require("../../../api/mysql.js");
const senf = require("../../../api/respond");
/**
 * @param {code,mode} req
 * @param {wx.login Code} code
 * @param {阶段} mode
 * @param {*返回} reust
 */
// res的code返回 200/400 直接下发用户信息/创建用户
module.exports = async (req, reust) => {
	// 获取从客户端上传上来的key
	try {
		let { code } = req.body;
		let { appid, secret } = wxKey;
		let openid;
		if (!code) {
			return Promise.reject("没有code参数");
		}
		await axios
			.get("https://api.weixin.qq.com/sns/jscode2session", {
				params: {
					appid: appid,
					secret: secret,
					js_code: code,
					grant_type: "authorization_code",
				},
			})
			.then((response) => {
				if (response.data.errcode) {
					return Promise.reject("非法的用户凭证");
				}
				openid = response.data.openid;
			});
		let userinfo = await searchUserOpenId(openid);
		if (userinfo.length !== 0) {
			reust.send(senf.init(200, userinfo[0]));
		} else {
			// 创建用户
			let creatUserinfoStatus = await CreateUserinfo({
				hash: uuid.v4(),
				name: "",
				openid: openid,
				avatar:
					"https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0",
			});
			console.log("creatUserinfoStatus", creatUserinfoStatus);
			reust.send(senf.init(200, creatUserinfoStatus));
		}
		console.log("userinfo", userinfo);
	} catch (err) {
		// 用户没有被创建等...
		console.log("err", err);
		reust.send(senf.init(400, err || "请检查网络环境"));
	}
};

// 检查是否有openid如果有的话就直接查数据没有的话就弹登录
function searchUserOpenId(openid) {
	return new Promise((resolve, reject) => {
		// 查找用户
		let sql = db.senf.data.user.AuthUser;
		db.query(sql, [`%${openid}%`], (err, results) => {
			resolve(results);
		});
	});
}

// 创建用户信息
function CreateUserinfo(userinfo) {
	if (userinfo.length < 5) {
		return Promise.reject();
	}
	console.log("userinfo", userinfo);
	// 创建用户
	return new Promise((resolve, reject) => {
		let sql = db.senf.data.user.createUser;
		// 查找用户
		db.query(
			sql,
			[
				userinfo.name,
				userinfo.openid,
				userinfo.avatar,
				userinfo.hash,
				new Date(),
			],
			(err, results) => {
				console.log("err", err);
				if (err) {
					reject("创建用户失败");
				} else {
					resolve(userinfo);
				}
			}
		);
	});
}


http://www.niftyadmin.cn/n/5019103.html

相关文章

提升Postern代理性能的五个小技巧

在使用Postern代理时&#xff0c;如何提高其性能是许多用户关注的问题。本文将分享一些针对Postern代理进行优化的技巧和建议&#xff0c;帮助更好地利用该工具并获得更出色的网络体验。   Postern是一个功能强大且灵活易用的Android应用程序&#xff0c;可实现全局HTTP/SOCK…

Golang开发--select

在Go语言中&#xff0c;select语句用于在多个通道操作中进行选择。select语句使得程序可以同时等待多个通道的操作&#xff0c;并在其中任意一个通道就绪时执行相应的操作。以下是select语句的详细描述&#xff1a; select { case <-ch1:// 当ch1通道可读时执行的操作 case…

数分笔试题-牛客

这里写目录标题 小红书2020校招数分笔试题一1、P(AB)<(P(A)P(B))/2 是对的&#xff0c;等号在A与B重合的时候成立2、回访数据可以用于评估用户黏性3、评估模型之后得出模型存在偏差&#xff0c;解决方法4、0到1000当中有多少个数字带有15、在EXCEL输入以零开头的文本型数字时…

【分享】Windows系统自动更新怎么永久停止?嘘!一般人我不告诉他,快进来看!

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 前言 你的Windows10系统会自动更新么&#xff1f;你是否深受Windows 10 自动更新的困扰&#xff1f;是否担心重要工作因未检查更新而被迫中断&#xff1f; 虽然Windows 10 的体验得到了改善&#xff0c;但是自动更新带来的烦恼却…

WMS仓储-亿发数字化工厂库存管理系统,提升中小企业仓储管理效率

中小企业竞争日益激烈的市场中&#xff0c;仓库管理的重要性不可低估。为了适应不断变化的业务规模和模式&#xff0c;中小企业对仓库管理提出了更高水平的智能化要求。数字化工厂库存管理系统&#xff0c;正是应运而生&#xff0c;助力企业加强仓库智能作业效率&#xff0c;并…

HashMap知识总结

HashMap: 1. 扰动函数hash值右移16位与原hash值做异或运算得出的新hash值散列程度高. 2. 负载因子0.75,就是说一个数组初始化new HashMap(17)容量会比17最小2的n次方大,就是32,想要已空间换时间,就是负载因子小于0.75这样的话hash冲突更低,但是扩容频率更高.3 扩容,jdk…

ARM接口编程—ADC(exynos 4412平台)

ADC简介 ADC ADC(Analog to Digital Converter)即模数转换器&#xff0c;指一个能将模拟信号转化为数字信号的电子元件 ADC主要参数 分辨率 ADC的分辨率一般以输出二进制数的位数来表示&#xff0c;当最大输入电压一定时&#xff0c;位数越高&#xff0c;分辨率越高&#xf…

vue-自适应布局-postcss-pxtorem

原理&#xff1a; 比如一个375px设计稿 其中一个320px宽度的元素 如何实现自适应布局呢&#xff1f; 其实可以这样理解&#xff1a; 我们先计算出375屏幕时候320px的大小&#xff0c;在屏幕变化时候&#xff0c;这些元素都会等比例缩放 比如屏幕从375 变为750px时候&#xff0…