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!

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

相关推荐
2601_963016266 小时前
统一消息与事件调用:如何用微信接口把微信自动化做成稳健中台?
大数据·运维·人工智能·微信·自动化
码农客栈15 小时前
小程序学习(二十六)之“订单详情”
小程序
weixin_4400583118 小时前
2026知识付费小程序:年费全包零抽成,录播题库全功能覆盖
小程序·apache·小程序开发
小羊Yveesss19 小时前
2026年微信小程序后端怎么搭建?后台、数据、接口和运维怎么选
运维·微信小程序·小程序
HackTwoHub21 小时前
ARL灯塔重构版:支持APP/小程序/WEB资产同步扫描
人工智能·安全·web安全·网络安全·小程序·重构·自动化
投票竞赛1 天前
避雷按单场活动扣费平台,2026 在线投票测评不限频次新建投票评选活动
小程序
2501_915909061 天前
IPA 深度混淆是什么意思?从混淆强度到实际效果的解读
android·ios·小程序·https·uni-app·iphone·webview
莫名的好感°1 天前
2026家庭快消品采购小程序实测体验
小程序
黄华SJ520it2 天前
新零售排队免单系统开发全流程介绍
小程序·零售·系统开发
微信开发api-视频号协议3 天前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad