当然可以!下面是一个完整的【实战教程】,教你如何在微信小程序中生成可自定义页面路径的方形二维码,并附带完整代码。


🧩 实现目标

通过调用微信小程序的云开发功能或使用微信官方API,生成一个跳转到指定页面的二维码,可将其展示或保存,样式为方形


✅ 方法一:使用小程序码(推荐)

一、准备工作

  1. 开通小程序云开发
  2. 获取 AppID 和 AppSecret
    • 在“开发设置”中查看

二、云函数:生成小程序码

在 cloudfunctions 中创建一个云函数 getQRCode

1. getQRCode/index.js

const cloud = require('wx-server-sdk')

cloud.init()

exports.main = async (event, context) => {
  const { page, scene } = event

  try {
    const res = await cloud.openapi.wxacode.getUnlimited({
      scene, // 传参如:id=123
      page, // 页面路径如:pages/detail/index
      width: 430,
      is_hyaline: false, // false 表示白底二维码
    })

    // 上传到云存储
    const upload = await cloud.uploadFile({
      cloudPath: `qrcodes/${Date.now()}.jpg`,
      fileContent: res.buffer,
    })

    return {
      fileID: upload.fileID
    }
  } catch (err) {
    return {
      errMsg: err.message
    }
  }
}

三、小程序前端调用云函数

1. 触发生成二维码

wx.cloud.callFunction({
  name: 'getQRCode',
  data: {
    page: 'pages/detail/index', // 要跳转的页面
    scene: 'id=123'             // 参数(需 encodeURIComponent)
  },
  success: res => {
    const fileID = res.result.fileID
    wx.cloud.downloadFile({
      fileID,
      success: downloadRes => {
        this.setData({
          qrCodeImage: downloadRes.tempFilePath
        })
      }
    })
  }
})

2. WXML 显示二维码

<image src="{{qrCodeImage}}" mode="widthFix" style="width: 200px;" />

✅ 方法二:调用微信 API(服务器端)

适用于有后端服务器的项目:

  1. 使用 https://api.weixin.qq.com/wxa/getwxacodeunlimit
  2. 携带参数:access_tokenscenepagewidth, 等
  3. 返回图片(buffer)

但此方式需要你服务器管理 access_token,相对更复杂。


💡 Tips

  • scene 不能超过 32 个可见字符
  • 生成的二维码默认是方形白底图,适合各种页面跳转
  • 若要加 logo 或美化,可使用 canvas 在前端叠加

🧪 示例效果

生成的二维码长这样:

[ 方形白底二维码图 ]
点击扫码 → 自动跳转到 pages/detail/index?id=123

📦 完整目录结构参考

miniprogram/
  ├── pages/
  ├── utils/
  ├── cloudfunctions/
       └── getQRCode/
           └── index.js

好的,这里我为你准备了一个完整的微信小程序二维码生成项目模板(含 canvas 美化),可生成带 Logo 的方形二维码,并支持自定义页面路径与参数跳转,一共分为两部分:


📁 一、项目结构

- miniprogram/
  ├── pages/
  │   └── qrcode/
  │       ├── index.js
  │       ├── index.wxml
  │       ├── index.wxss
  │       └── index.json
  ├── utils/
  │   └── weapp-qrcode.js  ← 二维码生成库
- cloudfunctions/
  └── getQRCode/
      └── index.js

🧩 二、功能说明

  • 可输入目标页面路径及参数(如 pages/detail/index?id=123)
  • 点击按钮生成二维码并显示
  • 二维码可保存到本地
  • 二维码可绘制到 canvas,并在中间插入 logo 图标

✨ 三、代码详解


1️⃣ 云函数 getQRCode

路径:cloudfunctions/getQRCode/index.js

const cloud = require('wx-server-sdk')
cloud.init()

exports.main = async (event, context) => {
  const { page, scene } = event

  try {
    const res = await cloud.openapi.wxacode.getUnlimited({
      scene,
      page,
      width: 430,
      is_hyaline: false,
    })

    const upload = await cloud.uploadFile({
      cloudPath: `qrcodes/${Date.now()}.jpg`,
      fileContent: res.buffer,
    })

    return { fileID: upload.fileID }
  } catch (err) {
    return { errMsg: err.message }
  }
}

2️⃣ 二维码页面 pages/qrcode/index.js

Page({
  data: {
    qrCodeImage: '',
    scene: 'id=123',
    page: 'pages/detail/index',
    canvasHidden: false
  },

  generateQRCode() {
    wx.cloud.callFunction({
      name: 'getQRCode',
      data: {
        page: this.data.page,
        scene: this.data.scene
      },
      success: res => {
        const fileID = res.result.fileID
        wx.cloud.downloadFile({
          fileID,
          success: downloadRes => {
            this.setData({ qrCodeImage: downloadRes.tempFilePath }, () => {
              this.drawQRCodeWithLogo()
            })
          }
        })
      }
    })
  },

  drawQRCodeWithLogo() {
    const ctx = wx.createCanvasContext('qrcodeCanvas', this)
    const qrPath = this.data.qrCodeImage
    const logoPath = '/images/logo.png' // 你自己的logo路径

    // 绘制二维码
    ctx.drawImage(qrPath, 0, 0, 300, 300)

    // 绘制logo在中心
    ctx.drawImage(logoPath, 120, 120, 60, 60)

    ctx.draw()
  },

  saveQRCode() {
    wx.canvasToTempFilePath({
      canvasId: 'qrcodeCanvas',
      success: res => {
        wx.saveImageToPhotosAlbum({
          filePath: res.tempFilePath,
          success: () => wx.showToast({ title: '保存成功' })
        })
      }
    }, this)
  }
})

3️⃣ 页面结构 pages/qrcode/index.wxml

<view class="container">
  <button bindtap="generateQRCode">生成二维码</button>
  <canvas canvas-id="qrcodeCanvas" style="width:300px;height:300px;"></canvas>
  <button bindtap="saveQRCode">保存到相册</button>
</view>

4️⃣ 样式 pages/qrcode/index.wxss

.container {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 30rpx;
}
button {
  margin: 20rpx 0;
}

📌 四、图片素材说明

将你的小程序 logo 放到 miniprogram/images/logo.png,推荐尺寸 60x60px。


📦 五、二维码美化方案(可拓展)

你还可以在 canvas 上添加:

  • 渐变背景
  • 圆角二维码
  • 加描边、阴影
  • 二维码四角圆点(仿微信扫码样式)

需要我帮你继续拓展这些美化功能也可以告诉我!


🔗 六、依赖说明

该方案完全基于:

  • 微信小程序云开发
  • 微信官方二维码接口(无需额外 npm 包)
  • Canvas API 绘制带 Logo 的二维码