uniapp生成微信小程序二维码

admin 103 0
uniapp生成微信小程序二维码主要有两种方式:后端接口调用与前端API生成,后端需通过微信服务器接口获取access_token,调用/wxa/getwxacode/wxa/getwxacodeunlimit生成二维码图片并返回前端;前端可直接使用uniapp提供的uni.createQRCode方法,传入小程序路径、尺寸等参数生成二维码,适用于简单场景,前者适合带参数的动态二维码,后者更便捷但灵活性较低,需根据需求选择,同时注意微信小程序的域名配置及接口权限限制。

Uniapp生成微信小程序二维码:完整指南与最佳实践

在微信小程序的开发与推广过程中,二维码作为核心流量入口,扮演着至关重要的角色,无论是线下活动推广、社交分享裂变,还是带参数的场景化跳转(如邀请码、来源统计),生成小程序二维码都是开发者必须掌握的高频需求,Uniapp作为一款"一次开发,多端发布"的跨平台开发框架,凭借其Vue.js语法、丰富的组件库和完善的生态体系,已成为众多开发者的首选方案,本文将系统性地介绍如何通过Uniapp实现微信小程序二维码的生成,涵盖后端官方接口调用与前端库生成两种主流方案,并附上详细的注意事项与最佳实践。

前置准备:小程序配置与权限开通

在开始生成二维码之前,请确保已完成以下基础配置:

小程序基本信息

登录微信公众平台,进入「开发」-「开发管理」-「开发设置」,记录小程序的AppID(小程序ID),这是后续调用微信接口的唯一标识,务必妥善保管。

接口权限开通

微信官方提供了生成小程序二维码的两种接口,各有适用场景:

  • 临时二维码:有效期最长为30天,无需小程序发布即可使用,适合短期活动场景(如7天促销、限时优惠)。
  • 永久二维码:无有效期限制,但要求小程序已发布并通过审核,适合长期固定入口(如首页、个人中心)。

两类接口均需在「开发」-「接口设置」中确认权限状态,默认情况下,这些接口权限已开通,但若未显示相关选项,可能需要提交小程序审核后才能使用。

后端调用微信官方接口(推荐带参数场景)

微信官方提供了生成小程序二维码的接口,但出于安全考虑,必须通过后端服务器调用(避免暴露AppSecret),核心流程为:后端获取access_token → 调用生成二维码接口 → 返回图片数据 → 前端展示

接口说明

微信官方提供两个核心接口:

生成临时二维码
https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN
  • 请求方式:POST
  • 主要参数:
    • path:小程序页面路径,如/pages/index/index
    • width:二维码宽度,默认430像素
    • auto_color:是否自动配置线条颜色,默认为false
  • 返回:图片二进制流
生成永久二维码
https://api.weixin.qq.com/wxa/getwxacodeunlimited?access_token=ACCESS_TOKEN
  • 请求方式:POST
  • 主要参数:
    • path:小程序页面路径
    • width:二维码宽度
    • scene:场景参数,如inviteCode=123(需URL编码)
    • is_hyaline:是否需要透明背景,默认为false
  • 返回:图片二进制流

关键区别:临时接口生成的二维码数量有限(最多10万个),且要求小程序已发布;永久接口无数量限制,但同样需要小程序发布后才能使用。

后端实现(以Node.js为例)

(1)获取access_token

access_token是调用微信接口的凭证,有效期2小时,建议缓存并定时刷新:

const axios = require('axios');
const redis = require('redis'); // 使用Redis缓存access_token
const APPID = '你的小程序AppID';
const APPSECRET = '你的小程序AppSecret';
const getAccessToken = async () => {
  const client = redis.createClient();
  const cachedToken = await client.get('wx_access_token');
  if (cachedToken) {
    return cachedToken;
  }
  try {
    const res = await axios.get(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`);
    const { access_token, expires_in } = res.data;
    // 缓存access_token,提前5分钟过期以避免token失效
    client.set('wx_access_token', access_token, 'EX', expires_in - 300);
    return access_token;
  } catch (error) {
    console.error('获取access_token失败:', error);
    throw new Error('获取微信access_token失败');
  }
};
(2)生成二维码

以生成永久二维码(带参数inviteCode=123)为例:

const generateQRCode = async () => {
  try {
    const accessToken = await getAccessToken();
    const url = `https://api.weixin.qq.com/wxa/getwxacodeunlimited?access_token=${accessToken}`;
    const params = {
      path: '/pages/index/index?inviteCode=123', // 小程序页面路径+参数
      width: 280,
      scene: 'inviteCode=123', // 场景参数(与path参数二选一,优先path)
      is_hyaline: true // 透明背景
    };
    const res = await axios.post(url, params, {
      responseType: 'arraybuffer', // 接收二进制流
      headers: {
        'Content-Type': 'application/json'
      }
    });
    // 返回base64格式图片(可直接用于前端img标签)
    return Buffer.from(res.data, 'binary').toString('base64');
  } catch (error) {
    console.error('生成二维码失败:', error);
    throw new Error('生成小程序二维码失败');
  }
};

Uniapp前端调用与展示

后端生成二维码后,可通过接口返回base64或图片URL,前端使用<image>标签展示:

<template>
  <view class="container">
    <button @click="getQRCode" :disabled="loading">
      {{ loading ? '生成中...' : '生成小程序二维码' }}
    </button>
    <view v-if="qrCodeBase64" class="qr-container">
      <image 
        :src="'data:image/png;base64,' + qrCodeBase64" 
        mode="widthFix"
        class="qr-image"
      />
      <text class="tip">长按保存二维码</text>
    </view>
    <view v-if="error" class="error">{{ error }}</view>
  </view>
</template>
<script>
export default {
  data() {
    return {
      qrCodeBase64: '',
      loading: false,
      error: ''
    }
  },
  methods: {
    async getQRCode() {
      this.loading = true;
      this.error = '';
      try {
        const response = await uni.request({
          url: 'https://your-api-domain.com/generate-qrcode',
          method: 'POST'
        });
        if (response.data.success) {
          this.qrCodeBase64 = response.data.data;
        } else {
          this.error = response.data.message || '生成二维码失败';
        }
      } catch (err) {
        this.error = '网络请求失败,请稍后重试';
        console.error(err);

标签: #微信小程序二维码