Files
aishangjia-uniapp/pages/login/components/wx-official.vue
2023-08-04 13:14:48 +08:00

125 lines
3.4 KiB
Vue
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 跳转到微信授权地址 -->
</template>
<script>
import queryStringify from '@/js_sdk/queryStringify'
import store from '@/store'
import { isEmpty, urlEncode } from '@/utils/util'
import * as Api from '@/api/wxofficial'
export default {
data() {
return {
// 页面来源是否为微信回调
isCallback: false
}
},
created() {
// 处理微信回调
this.onCallback()
// 跳转到微信授权
this.redirectUrl()
},
methods: {
// 处理微信回调
onCallback() {
// 接收微信传来的参数
const wxParam = queryStringify.parse(window.location.search)
if (!isEmpty(wxParam)) {
const url = window.location.href.replace(window.location.search, '')
window.location.href = url + '?' + urlEncode(wxParam)
return
}
// 获取code参数
const query = this.$route.query
if (isEmpty(query) || !query.code) {
return
}
// 请求后端获取微信用户信息
this.isCallback = true
Api.oauthUserInfo(query.code)
.then(({ data }) => {
console.log('用户同意了授权')
console.log('userInfo', data)
// 授权成功事件
this.onAuthSuccess(data)
})
},
// 授权成功事件
// 这里分为两个逻辑:
// 1.将openid和userInfo提交到后端如果存在该用户 则实现自动登录,无需再填写手机号
// 2.如果不存在该用户, 则显示注册页面, 需填写手机号
// 3.如果后端报错了, 则显示错误信息
async onAuthSuccess({ userInfo, encryptedData, iv }) {
const app = this
// 提交到后端
store.dispatch('LoginWxOfficial', {
partyData: { oauth: 'H5-WEIXIN', userInfo, encryptedData, iv },
refereeId: store.getters.refereeId
})
.then(result => {
// 一键登录成功
app.$toast(result.message)
// 跳转回原页面
setTimeout(() => app.onNavigateBack(), 2000)
})
.catch(err => {
const resultData = err.result.data
// 显示错误信息
if (isEmpty(resultData)) {
app.$toast(err.result.message)
}
// 判断还需绑定手机号
if (resultData.isBindMobile) {
app.onEmitSuccess({ userInfo, encryptedData, iv })
}
})
},
// 跳转到微信授权
redirectUrl() {
if (this.isCallback) {
return
}
const callbackUrl = window.location.href
Api.oauthUrl(callbackUrl)
.then(result => {
const url = result.data.redirectUrl
window.location.href = url
})
},
// 将oauth提交给父级
async onEmitSuccess({ userInfo, encryptedData, iv }) {
this.$emit('success', {
oauth: 'H5-WEIXIN', // 第三方登录类型: H5-WEIXIN
userInfo,
encryptedData,
iv
})
},
/**
* 登录成功-跳转回原页面
*/
onNavigateBack(delta = 1) {
const pages = getCurrentPages()
if (pages.length > 1) {
uni.navigateBack({
delta: Number(delta || 1)
})
} else {
this.$navTo('pages/index/index')
}
}
}
}
</script>