wx-starlock/pages/p2p/authorizeWechat.vue
2025-07-07 10:00:44 +08:00

270 lines
7.4 KiB
Vue
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>
<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>