当前位置:网站首页>云开发 公众号网页与小程序共享资源进行云开发操作 即在网页调用云函数使用云数据库资源

云开发 公众号网页与小程序共享资源进行云开发操作 即在网页调用云函数使用云数据库资源

2022-11-24 21:36:00zrong180106

/**
			 * 检查/发起登录
			 * 1. 函数会检查当前是否已登录(checkLogin)
			 * 2. 如果未登录,会 10s 后自动发起登录(startLogin)
			 * 3. 如果已登录,会初始化实例,使用指定的微信云开发资源
			 */
import store from '../store'
exports.doLoginFunc = async function() {
	var isPersistLoginInfo = true // 是否需要保留登录态信息到 window 中,只有 snsapi_userinfo 方式需要
	var urlSearch = new URLSearchParams(location.search) // 构造函数 通过new实例化,并传入查询的字符串
	var accessToken = urlSearch.get('access_token') //  获取指定搜索参数的第一个值。
	var refreshToken = urlSearch.get('refresh_token')
	// try {
		const checkLoginOptions = {
			provider: 'OfficialAccount',
			appid: 'xxxxxxxxxx', // 公众号id
		}
		if (urlSearch.get('oauthredirect') === '1') {
			checkLoginOptions.accessToken = accessToken
			checkLoginOptions.refreshToken = refreshToken
		}
		// doLogin(checkLoginOptions)
	// async function doLogin(checkLoginOptions) {
		const result = await cloud.checkLogin(checkLoginOptions)
		if (isPersistLoginInfo) {
			window.checkLoginRes = result
			uni.setStorageSync('isLogin', result.loggedIn);
		}
		// console.log('调用完checkLogin后rusult', result)
		// checkLogin成功
		console.log(`checkLogin success`)
		if (result.errCode === 0 && result.loggedIn) {
			const instance = window.instance = new cloud.Cloud({
				appid: 'xxxxxxxxxx', // 公众号id
				resourceAppid: 'xxxxxxxxx', //小程序id
				resourceEnv: 'cloud1-xxxxxxxx', // 小程序云环境
			})
			const initResult = await instance.init()
			initCloud()
			getUserInfo()
		} else {
			console.log(
				`checkLogin with sdk errCode ${result.errCode} errMsg ${result.errMsg}, will start oauth in 0.001s`
			)
			setTimeout(() => {
				try {
					cloud.startLogin({
						provider: 'OfficialAccount',
						appid: 'xxxxxxxxxx', // 公众号id
						scope: 'snsapi_userinfo',
						redirectUri: 'https://xxxxxxxx.com', // 回调域名 // 重点: 设置为http时,checkLogin时永远失败,loggedIn永远都为false 
					})
				} catch (e) {
					console.error(`startLogin fail: ${e}`)
					console.warn(`will start OfficialAccount OAuth login in 1s.`)
				}
			}, 1)
		}
	// }
	/**
			 * 获取用户信息的示例
			 * 1. 需在登录后调用
			 * 2. 网页授权的方式需为 snsapi_userinfo
			 * 3. 从 checkLogin 结果中获取用户信息 cloudID(已在 doLogin 函数中先暂存到全局变量 checkLoginRes)
			 * 4. 调用云函数换取 cloudID 信息
			 */
	async function getUserInfo() {
		// console.log('获取用户信息getUserInfo')
		if (!checkLoginRes) throw new Error('获取登录信息失败,请确认授权方式以及是否保存了登录信息')
		try {
			if (checkLoginRes.cloudID) {
				const res = await instance.callFunction({
					name: 'echo',
					data: {
						userInfoData: new instance.CloudID(checkLoginRes.cloudID),
					},
				})
				// console.log('echo res', res)
				const cloudData = res.result.userInfoData
				if (cloudData.data) {
					//查询该用户数信息据是否已经存在。
					instance.database().collection('user_info').where({
						openid: cloudData.data.openId
					}).get().then(res => {
						// 不存在则调用add_user_info云函数将数据存入数据库中
						if (res.data.length == 0) {
							instance.callFunction({
								name: 'add_user_info',
								data: {
									unionid: cloudData.data.unionId,
									openid: cloudData.data.openId,
									userName: cloudData.data.nickName,
									gender: cloudData.data.gender,
									province: cloudData.data.province,
									city: cloudData.data.city,
									photo: cloudData.data.avatarUrl
								}
							}).then((res) => {
								// console.log('添加用户信息到数据库成功返回:', res)
							}).catch((err) => {
								// console.log('添加数据到数据库函数失败返回:', err)
							})
						} else {
							uni.setStorageSync('openid', cloudData.data.openId)
							uni.setStorageSync('nickName', cloudData.data.nickName)
							uni.setStorageSync('photo', cloudData.data.avatarUrl)
							// console.log(uni.getStorageSync('openid'))
						}
					})
				} else {
					console.warn(`cloudID data error: `, cloudData)
					alert(`cloudID 信息获取错误,请查看调试器报错信息`)
				}
			} else {
				alert(`找不到 cloudID,请确认网页授权方式为 snsnapi_userinfo`)
			}
		} catch (e) {
			console.error(`error: ${e} ${e.stack}`)
		}
		
	}
	async function initCloud() {
		// 初始化一个实例,声明要使用哪个小程序哪个云环境的资源
		const c = new cloud.Cloud({
			// identityless: true, // 必填,表示是未登录模式
			appid: 'xxxxxxxxxxx', // 公众号appid
			resourceAppid: 'xxxxxxxxx', // 小程序appid
			resourceEnv: 'cloud1-xxxxxxxx', // 云开发环境id
		})
		// 初始化,等待授权关系校验通过以及目标云环境的 cloudbase_auth 函数返回授权
		await c.init({})
		// console.log('wxLogin中 c', c)
		store.commit('SET_CLOUD', c)
	}
}
原网站

版权声明
本文为[zrong180106]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_44830060/article/details/127803422

随机推荐