Taro小程序微信、支付宝双端实现二维码图片生成

一、安装依赖

这里安装1.5.3以下版本,最新的会报错

ReferenceError: TextEncoder is not defined at new ByteData (byte-data.js:6:1) at buildSingleSegment (segments.js:262:1

bash 复制代码
npm install qrcode@1.5.3 --save

weapp-qrcode-canvas-2d仅支持微信小程序

bash 复制代码
npm install weapp-qrcode-canvas-2d --save

仅供参考:我使用的版本如下:

bash 复制代码
"qrcode": "1.5.3",
"vue": "^3.0.0",
"weapp-qrcode-canvas-2d": "^1.1.6"

二、具体实现

1、封装个QRCode.vue子组件

javascript 复制代码
<template>
  <view class="qrcode-container">
    <!-- 
        1. 用于绘制的隐藏 Canvas
        type="2d" 和 id 是关键
      -->
    <canvas
      id="myCanvas"
      type="2d"
      :style="{
        width: `${width}px`,
        height: `${height}px`,
        position: 'fixed',
        left: '9999px', // 移出屏幕可视区
        top: '-9999px',
      }"
    />
    <!-- 
        2. 最终展示给用户的图片
        show-menu-by-longpress 属性支持长按保存
      -->
    <image
      v-if="qrCodeUrl"
      :src="qrCodeUrl"
      :style="{
        width: `${width}px`,
        height: `${height}px`,
      }"
      mode="aspectFit"
      show-menu-by-longpress
      @click="saveToAlbum"
    />
  </view>
</template>
  
  <script setup>
import { ref, onMounted, nextTick } from "vue";
import Taro from "@tarojs/taro";
import drawQrcode from "weapp-qrcode-canvas-2d";
import QRCode from 'qrcode';

const props = defineProps({
  // 要生成二维码的文本或链接
  text: {
    type: String,
    required: true,
  },
  width: {
    type: Number,
    default: 200,
  },
  height: {
    type: Number,
    default: 200,
  },
});

const qrCodeUrl = ref(""); // 存储二维码的临时图片路径

// 生成二维码的核心函数-weapp
const generateWxQRCode = () => {
  const query = Taro.createSelectorQuery();
  // 获取 Canvas 节点
  query
    .select("#myCanvas")
    .fields({ node: true, size: true })
    .exec((res) => {
      if (!res || !res[0]) {
        console.error("Canvas 节点获取失败");
        return;
      }

      const canvas = res[0].node;
      // 调用库的方法在 Canvas 上绘制二维码
      drawQrcode({
        canvas,
        canvasId: "myCanvas",
        width: props.width,
        height: props.height,
        text: props.text,
        background: "#ffffff", // 背景色,可自定义
        foreground: "#000000", // 前景色(二维码颜色)
      });

      // 将 Canvas 内容转换为临时图片路径,便于展示和保存
      setTimeout(() => {
        Taro.canvasToTempFilePath({
          canvasId: "myCanvas",
          canvas,
          x: 0,
          y: 0,
          width: props.width,
          height: props.height,
          destWidth: props.width * 2, // 输出图片宽度,*2可使图片更清晰
          destHeight: props.height * 2, // 输出图片高度
          success(res) {
            qrCodeUrl.value = res.tempFilePath;
          },
          fail(err) {
            console.error("Canvas 转图片失败", err);
          },
        });
      }, 100); // 延迟确保二维码绘制完成
    });
};
// Base64编码函数(小程序兼容)
const base64Encode = (str) => {
  if (typeof btoa !== 'undefined') {
    return btoa(str); // 浏览器环境
  } else {
    // 小程序环境使用 Buffer 或 Taro API
    try {
      if (typeof Buffer !== 'undefined') {
        return Buffer.from(str).toString('base64');
      } else {
        // 使用 Taro 的 base64 编码
        return Taro.base64.encode(str);
      }
    } catch (error) {
      console.error('Base64编码失败:', error);
      return '';
    }
  }
};

// 生成二维码的核心函数-aliapy
const createAlipayQrCode = async () => {
  try {
    // 生成 SVG 格式的二维码
    const svgString = await QRCode.toString(props.text, { type: 'svg' });
    
    // 使用兼容的Base64编码
    const base64SVG = base64Encode(svgString);
    const imgSrc = `data:image/svg+xml;base64,${base64SVG}`;
    
    qrCodeUrl.value = imgSrc;
  } catch (error) {
    console.error('SVG二维码生成失败:', error);
  }
};
const generateQRCode = () => {
  // 根据环境选择二维码生成方法
  const env = Taro.getEnv();
  if (env === Taro.ENV_TYPE.WEAPP) {
    generateWxQRCode();
  } else if (env === Taro.ENV_TYPE.ALIPAY) {
    setTimeout(() => {
      createAlipayQrCode(); 
    }, 100);
  }
}
// 组件挂载时生成二维码
onMounted(() => {
  nextTick(() => {
    generateQRCode();
  });
});
</script>
  
<style lang="scss">
.qrcode-container {
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>

2、在父组件你需要的地方使用即可

javascript 复制代码
 <QRcode :text="qrCodeUrl" :size="200"></QRcode>

本来是想问ai的结果豆包只会编造不存在的插件和api ,麻了。。。。。

end!

希望记录的问题能帮助到你~

相关推荐
lichenyang4539 小时前
Expo 小程序媒体库功能设计与实现记录
小程序
智慧医养结合软件开源11 小时前
可视化呈现长者分布与年龄结构,赋能精准康养管理
大数据·安全·百度·微信·云计算
经济元宇宙13 小时前
2026混合开发工具选型:小程序生态适配测评
小程序
lpfasd1231 天前
微信小程序虚拟支付(道具直购)踩坑全记录:从-15005到支付成功
微信小程序·小程序
小姑爷1 天前
微信4.1.5.16 UI树“消失”?UIAutomation实战复现+AI驱动RPA落地方案
人工智能·ui·微信
crazy_wsp1 天前
使用AI从0到1上线微信小程序
人工智能·微信小程序·小程序
小宋的踩坑日记1 天前
全网最全!Tailwind/Unocss 类名速查表,前端开发必备神器!
css·小程序·前端框架
低代码布道师1 天前
健身房私教课小程序需求规格说明书
小程序·规格说明书
朱良2 天前
Taro小程序生成分享海报解决方案
taro
浩冉学编程2 天前
微信小程序中基于java后端实现官方的文本内容安全识别msgSecCheck
java·前端·安全·微信小程序·小程序·微信公众平台·内容安全审核