/**
* 检查/发起登录
* 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)
}
}
云开发 公众号网页与小程序共享资源进行云开发操作 即在网页调用云函数使用云数据库资源
于 2022-11-11 11:44:19 首次发布