收藏
回答

wx.scanQRCode 进入扫码页面后无法扫码识别结果并且点击左上角返回按钮点击无效?

ios、安卓、鸿蒙大部分用户初次使用该h5应用,首次打开扫码应用都会出现卡死情况,无法扫码识别并且点击左上角返回按钮点击无效,需要关闭微信后台再次进入才可以顺利扫码。测试过程重复打开扫码页面多次,一般第三次时也会导致卡死。调试模式下调用扫码sdk提示正常,进入页面后卡死无法退出和扫码。

引用了

<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

// 全局初始化微信SDK

export const initWechatSDK = async () => {

  if (isInitialized) return Promise.resolve(); // 已初始化直接返回

  if (initPromise) return initPromise; // 正在初始化,等待结果

  // 生成当前页面URL(去除hash,避免签名错误)

  const currentUrl = window.location.href.split('#')[0];

  initPromise = new Promise(async (resolve, reject) => {

    try {

      const res = await getSignature(currentUrl);

      wx.config({

        debug: false,

        appId: res.data.appId,

        timestamp: res.data.timestamp,

        nonceStr: res.data.nonceStr,

        signature: res.data.signature,

        jsApiList: ['scanQRCode'],

            openTagList: ['wx-open-subscribe'],

      });

      wx.ready(() => {

        isInitialized = true;

        resolve();

      });

      wx.error((err) => {

        console.error('微信SDK初始化失败:', err);

        isInitialized = false;

        reject(err);

      });

    } catch (err) {

      console.error('获取签名失败:', err);

      reject(err);

    } finally {

      initPromise = null; // 重置初始化Promise

    }

  });

  return initPromise;

};

const handleScan = async () => {

  if (isScanning.value) return; // 防止重复触发

  try {

    // 确保SDK已初始化

    await initWechatSDK();

    // 执行扫码

    isScanning.value = true;

    wx.scanQRCode({

       needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,

       scanType: ['barCode'], // 可以指定扫二维码还是一维码,默认二者都有

       success: function (res) {

           emit('scanVal', res);

      },

      fail: function (res) {

uni.showToast({

title: '识别失败',

icon: 'error'

})

  },

});

  } catch (err) {

    console.error('扫码失败:', err);

    // 根据错误类型提示用户

    if (err.message.includes('不支持扫码')) {

      uni.showToast({ title: '当前环境不支持扫码', icon: 'error' });

    } else if (err.message.includes('cancel')) {

      uni.showToast({ title: '已取消扫码', icon: 'none' });

    } else {

      uni.showToast({ title: '扫码失败,请重试', icon: 'error' });

    }

  } finally {

    isScanning.value = false; // 无论成功失败,最终重置状态

  }

};




最后一次编辑于  2025-11-19
回答关注问题邀请回答
收藏

2 个回答

  • 社区技术运营专员--许涛
    社区技术运营专员--许涛
    2025-11-19

    你好,麻烦提供下机型,微信版本号和复现链接

    2025-11-19
    有用
    回复 2
  • 智能回答 智能回答 本次回答由AI生成
    2025-11-18
    有用
登录 后发表内容