hookehuyr

feat(微信): 添加扫码测试页面并重构微信JSSDK初始化逻辑

将微信JSSDK初始化逻辑移至App.vue全局处理
新增wxScanTest页面用于测试微信扫码功能
移除verificationResult.vue中冗余的初始化代码
<!--
* @Date: 2023-06-13 13:26:46
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2024-12-26 11:07:25
* @LastEditTime: 2026-01-22 14:41:27
* @FilePath: /xysBooking/src/App.vue
* @Description: 启动页
-->
......@@ -40,16 +40,35 @@ setToastDefaultOptions({
className: 'zIndex'
});
const init_wx_global = async () => {
try {
const url = window.location.href.split('#')[0]
const cfg_res = await wxJsAPI({ url })
if (!cfg_res || !cfg_res?.data) return false
const cfg = { ...cfg_res.data, jsApiList: apiList }
return new Promise((resolve) => {
wx.config(cfg)
wx.ready(() => {
wx.showAllNonBaseMenuItem()
resolve(true)
})
wx.error((err) => {
console.warn(err)
resolve(false)
})
})
} catch (err) {
console.warn(err)
return false
}
}
onMounted(async () => {
// const { data } = await wxJsAPI({ url: '/f/reserve/#/' });
// data.jsApiList = apiList;
// wx.config(data);
// wx.ready(() => {
// wx.showAllNonBaseMenuItem();
// });
// wx.error((err) => {
// console.warn(err);
// });
if (!window.__wx_ready_promise) {
window.__wx_ready_promise = init_wx_global()
}
await window.__wx_ready_promise
// 正式环境
// TAG:检查是否更新
if (import.meta.env.PROD) {
......
......@@ -137,4 +137,11 @@ export default [
title: '核销',
},
},
{
path: '/wxScanTest',
component: () => import('@/views/wxScanTest.vue'),
meta: {
title: '扫码测试',
},
},
];
......
......@@ -71,8 +71,6 @@ import { computed, onMounted, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import wx from 'weixin-js-sdk'
import { showToast } from 'vant'
import { apiList } from '@/api/wx/jsApiList'
import { wxJsAPI } from '@/api/wx/config'
import { mainStore } from '@/store'
import { checkRedeemPermissionAPI, verifyTicketAPI } from '@/api/redeem'
import { wxInfo } from '@/utils/tools'
......@@ -164,19 +162,8 @@ const verify_ticket = async (code) => {
verify_info.value = {}
}
const init_wx_scan = async () => {
const cfg_res = await wxJsAPI({ url: window.location.href.split('#')[0] })
if (!cfg_res || cfg_res?.code !== 1 || !cfg_res?.data) return false
const cfg = { ...cfg_res.data, jsApiList: apiList }
return new Promise((resolve) => {
wx.config(cfg)
wx.ready(() => resolve(true))
wx.error(() => resolve(false))
})
}
const scan_in_wechat = async () => {
const ok = await init_wx_scan()
const ok = await window.__wx_ready_promise
if (!ok) return ''
return new Promise((resolve) => {
wx.scanQRCode({
......
<template>
<div class="scan-test-page">
<div class="card">
<div class="row">
<div class="label">环境</div>
<div class="value">{{ in_wechat ? '微信内' : '非微信' }}</div>
</div>
<div class="row last">
<div class="label">JSSDK</div>
<div class="value" :class="{ ok: wx_ready === true, fail: wx_ready === false }">
{{ wx_ready_text }}
</div>
</div>
</div>
<div class="card">
<div class="card-title">扫码结果</div>
<van-field
v-model="scan_result"
type="textarea"
rows="3"
autosize
readonly
placeholder="点击下方按钮开始扫码"
/>
<div class="btn-wrap">
<van-button
block
color="#A67939"
:loading="scanning"
:disabled="scanning"
@click="start_scan"
>
调起扫码
</van-button>
</div>
</div>
</div>
</template>
<script setup>
import { computed, onMounted, ref } from 'vue'
import wx from 'weixin-js-sdk'
import { showToast } from 'vant'
import { wxInfo } from '@/utils/tools'
const scan_result = ref('')
const scanning = ref(false)
const wx_ready = ref(null)
const in_wechat = computed(() => wxInfo().isTable === true)
const wx_ready_text = computed(() => {
if (!in_wechat.value) return '非微信环境无需初始化'
if (wx_ready.value === true) return '已就绪'
if (wx_ready.value === false) return '初始化失败'
return '未检测'
})
const ensure_wx_ready = async () => {
if (!window.__wx_ready_promise) return false
const ok = await window.__wx_ready_promise
return ok === true
}
const start_scan = async () => {
if (!in_wechat.value) {
showToast('请在微信内打开该页面')
return
}
if (scanning.value) return
scanning.value = true
try {
const ok = await ensure_wx_ready()
wx_ready.value = ok
if (!ok) {
showToast('wx 初始化失败')
return
}
const result = await new Promise((resolve) => {
wx.scanQRCode({
needResult: 1,
scanType: ['qrCode', 'barCode'],
success: (res) => resolve(res?.resultStr || ''),
fail: () => resolve(''),
cancel: () => resolve(''),
})
})
scan_result.value = String(result || '')
if (!scan_result.value) showToast('未获取到二维码内容')
} finally {
scanning.value = false
}
}
onMounted(async () => {
if (!in_wechat.value) {
wx_ready.value = false
return
}
wx_ready.value = await ensure_wx_ready()
})
</script>
<style lang="less" scoped>
.scan-test-page {
min-height: 100vh;
background-color: #F6F6F6;
padding: 16px;
box-sizing: border-box;
.card {
background: #fff;
border-radius: 12px;
padding: 16px;
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.04);
}
.card + .card {
margin-top: 12px;
}
.card-title {
font-size: 14px;
color: #6B7280;
margin-bottom: 12px;
}
.row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 0;
border-bottom: 1px solid #F3F4F6;
.label {
font-size: 14px;
color: #6B7280;
}
.value {
font-size: 16px;
color: #111827;
font-weight: 600;
margin-left: 12px;
word-break: break-all;
text-align: right;
}
.ok {
color: #16A34A;
}
.fail {
color: #E24A4A;
}
}
.row.last {
border-bottom: 0;
}
.btn-wrap {
margin-top: 12px;
}
}
</style>