270 lines
7.4 KiB
Vue
270 lines
7.4 KiB
Vue
<template>
|
||
<view class="flex flex-col justify-center items-center pt-[30vh]">
|
||
<view v-if="requestFinish">
|
||
<view
|
||
v-if="!isAuthorized"
|
||
class="bg-[#63b8af] text-white rounded-full text-center leading-88rpx h-88rpx w-686 mx-4"
|
||
@click="handleAuthorize"
|
||
>
|
||
授权
|
||
</view>
|
||
<view v-else>
|
||
<view v-if="!reject" class="text-center text-2xl font-bold">您已授权</view>
|
||
<view v-else>
|
||
<view v-if="weChatTicketsFlag">
|
||
<view class="text-center text-lg font-bold mt-6"> 授权失败 </view>
|
||
<view class="text-center text-lg font-bold mt-4"> 请保证设备一直处于在线状态 </view>
|
||
<view
|
||
class="bg-[#63b8af] text-white rounded-full text-center leading-88rpx h-88rpx w-686 mx-4 mt-10"
|
||
@click="retry"
|
||
>
|
||
重试
|
||
</view>
|
||
</view>
|
||
<view v-else>
|
||
<view class="text-center text-lg font-bold mt-6"> 您已拒绝授权,请去设置中 </view>
|
||
<view class="text-center text-lg font-bold mt-4">
|
||
打开<text class="text-red">语音、视频通话提醒</text>开关
|
||
</view>
|
||
<view
|
||
class="bg-[#63b8af] text-white rounded-full text-center leading-88rpx h-88rpx w-686 mx-4 mt-10"
|
||
@click="openSetting"
|
||
>
|
||
打开设置
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<view v-if="requestFinish" class="mt-10 text-center text-base font-bold text-[#999]">
|
||
授权后,在设备上按下门铃按钮
|
||
</view>
|
||
<view v-if="requestFinish" class="mt-4 text-center text-base font-bold text-[#999]">
|
||
微信会收到视频通话请求
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { onShow } from '@dcloudio/uni-app'
|
||
import { ref } from 'vue'
|
||
import { passthrough } from '@/api/sdk'
|
||
import { useBluetoothStore } from '@/stores/bluetooth'
|
||
import env from '@/config/env'
|
||
import { getStorage } from '@/utils/storage'
|
||
|
||
const $bluetooth = useBluetoothStore()
|
||
|
||
const requestFinish = ref(false)
|
||
|
||
const isAuthorized = ref(false)
|
||
const list = ref([])
|
||
|
||
const reject = ref(false)
|
||
|
||
const pending = ref(false)
|
||
|
||
const weChatTicketsFlag = ref(false)
|
||
|
||
onShow(async () => {
|
||
uni.showLoading({
|
||
title: '加载中...'
|
||
})
|
||
|
||
const resultList = await Promise.all([getDeviceVoIPList(), getAuthResult()])
|
||
|
||
list.value = resultList[0]
|
||
const authResult = resultList[1]
|
||
|
||
const data = list.value.find(item => item.sn === authResult.data.wxDeviceSn)
|
||
|
||
if (authResult?.code === 0 && data) {
|
||
if (authResult?.data?.wxOpenid === getStorage('openid')) {
|
||
if (data.status === 1) {
|
||
reject.value = false
|
||
weChatTicketsFlag.value = false
|
||
} else if (data.status === 0) {
|
||
reject.value = true
|
||
weChatTicketsFlag.value = false
|
||
}
|
||
} else {
|
||
reject.value = true
|
||
weChatTicketsFlag.value = true
|
||
}
|
||
isAuthorized.value = true
|
||
requestFinish.value = true
|
||
uni.hideLoading()
|
||
} else {
|
||
requestFinish.value = true
|
||
uni.hideLoading()
|
||
}
|
||
})
|
||
|
||
const getDeviceVoIPList = async () => {
|
||
return new Promise(resolve => {
|
||
wx.getDeviceVoIPList({
|
||
success: res => {
|
||
resolve(res.list)
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
const retry = async () => {
|
||
if (pending.value) return
|
||
uni.showLoading({
|
||
title: '授权中...'
|
||
})
|
||
pending.value = true
|
||
const ticketsResult = await weChatTickets()
|
||
|
||
pending.value = false
|
||
if (ticketsResult?.code === 0) {
|
||
passthrough({
|
||
request_method: 'POST',
|
||
request_uri: '/api/v1/tencentYun/reportWechatAuthSuccess',
|
||
post_args: {
|
||
lockId: $bluetooth.currentLockInfo.lockId,
|
||
wxOpenid: getStorage('openid'),
|
||
wxDeviceSn: ticketsResult.data.wxDeviceSn
|
||
}
|
||
})
|
||
uni.hideLoading()
|
||
isAuthorized.value = true
|
||
reject.value = false
|
||
weChatTicketsFlag.value = false
|
||
} else {
|
||
uni.hideLoading()
|
||
uni.showToast({
|
||
title: '授权失败',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
}
|
||
|
||
const openSetting = () => {
|
||
uni.openSetting({
|
||
success: res => {
|
||
console.log(res)
|
||
}
|
||
})
|
||
}
|
||
|
||
const getAuthResult = async () => {
|
||
const result = await passthrough({
|
||
request_method: 'GET',
|
||
request_uri: '/api/v1/tencentYun/checkWechatAuth',
|
||
post_args: {
|
||
lockId: $bluetooth.currentLockInfo.lockId,
|
||
wxOpenid: getStorage('openid')
|
||
}
|
||
})
|
||
return result
|
||
}
|
||
|
||
const getInfo = async () => {
|
||
const result = await passthrough({
|
||
request_method: 'GET',
|
||
request_uri: '/api/v1/tencentYun/getWechatDeviceTicket',
|
||
post_args: {
|
||
lockId: $bluetooth.currentLockInfo.lockId
|
||
}
|
||
})
|
||
return result
|
||
}
|
||
|
||
const weChatTickets = async () => {
|
||
let ticket = null
|
||
let snResult = null
|
||
if (!ticket) {
|
||
const result = await getInfo()
|
||
ticket = result.data.WXIoTDeviceInfo.SNTicket
|
||
snResult = result.data.WXIoTDeviceInfo.SN
|
||
}
|
||
const result = await $bluetooth.weChatTickets({
|
||
keyId: $bluetooth.currentLockInfo.keyId.toString(),
|
||
uid: $bluetooth.currentLockInfo.uid.toString(),
|
||
openId: getStorage('openid'),
|
||
snTicket: ticket
|
||
})
|
||
|
||
return {
|
||
code: result.code,
|
||
data: {
|
||
wxDeviceSn: snResult
|
||
}
|
||
}
|
||
}
|
||
|
||
const handleAuthorize = async () => {
|
||
if (pending.value) return
|
||
pending.value = true
|
||
uni.showLoading({
|
||
title: '授权中...'
|
||
})
|
||
const result = await getInfo()
|
||
if (result.code === 0) {
|
||
wx.requestDeviceVoIP({
|
||
sn: result.data.WXIoTDeviceInfo.SN,
|
||
snTicket: result.data.WXIoTDeviceInfo.SNTicket,
|
||
modelId: result.data.WXIoTDeviceInfo.ModelId,
|
||
deviceName: await env[await getApp().globalData.getEnvConfig()].appName,
|
||
async success() {
|
||
const ticketsResult = await weChatTickets(
|
||
result.data.WXIoTDeviceInfo.SNTicket,
|
||
result.data.WXIoTDeviceInfo.SN
|
||
)
|
||
|
||
if (ticketsResult?.code === 0) {
|
||
isAuthorized.value = true
|
||
uni.hideLoading()
|
||
pending.value = false
|
||
passthrough({
|
||
request_method: 'POST',
|
||
request_uri: '/api/v1/tencentYun/reportWechatAuthSuccess',
|
||
post_args: {
|
||
lockId: $bluetooth.currentLockInfo.lockId,
|
||
wxOpenid: getStorage('openid'),
|
||
wxDeviceSn: result.data.WXIoTDeviceInfo.SN
|
||
}
|
||
})
|
||
reject.value = false
|
||
weChatTicketsFlag.value = false
|
||
uni.showToast({
|
||
title: '授权成功',
|
||
icon: 'none'
|
||
})
|
||
} else {
|
||
isAuthorized.value = true
|
||
uni.hideLoading()
|
||
pending.value = false
|
||
reject.value = true
|
||
weChatTicketsFlag.value = true
|
||
uni.showToast({
|
||
title: '授权失败',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
},
|
||
fail() {
|
||
isAuthorized.value = true
|
||
reject.value = true
|
||
uni.hideLoading()
|
||
pending.value = false
|
||
uni.showToast({
|
||
title: '授权失败',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
})
|
||
} else {
|
||
uni.hideLoading()
|
||
pending.value = false
|
||
uni.showToast({
|
||
title: result.message,
|
||
icon: 'none'
|
||
})
|
||
}
|
||
}
|
||
</script>
|