微信小程序之(zhī)生成自定義參數小程序二維碼 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

微信小程序之(zhī)生成自定義參數小程序二維碼

發表時(shí)間:2021-1-11

發布人(rén):融晨科技

浏覽次數:96

掃碼已經成爲(wéi / wèi)一種常見又方便的(de)進入移動應用的(de)途徑,可以(yǐ)把線上(shàng)線下的(de)用戶流量帶入你的(de)移動應用中來(lái)。微信小程序也(yě)提供了(le/liǎo)掃碼進入的(de)功能,可以(yǐ)通過掃描二維碼或者微信小程序專有的(de)小程序碼,進入到(dào)相應的(de)小程序頁面。

微信官方提供了(le/liǎo)3個(gè)不(bù)同的(de)REST API用于(yú)生成帶參數的(de)小程序碼或者二維碼,可在(zài)掃碼後進入指定的(de)小程序頁面,其中接口A和(hé / huò)C能生成的(de)圖片總數量有限制(10萬張),對于(yú)那種需要(yào / yāo)生成大(dà)量二維碼的(de)使用場景(比如爲(wéi / wèi)每個(gè)訂單生成一個(gè)二維碼、餐廳的(de)每張餐桌生成一個(gè)二維碼等)是(shì)遠遠不(bù)能滿足需求的(de)。而(ér)接口B可以(yǐ)解決這(zhè)個(gè)問題,我們這(zhè)次主要(yào / yāo)來(lái)看一下如何使用這(zhè)個(gè)接口。

總體的(de)思路是(shì):在(zài)我們的(de)後端開發一個(gè)API,在(zài)其中調用微信的(de)二維碼接口,調用成功後會得到(dào)二維碼圖片的(de)二進制流,最後将這(zhè)個(gè)二進制流輸出(chū)到(dào)前台。

以(yǐ)下步驟中的(de)後端代碼是(shì)基于(yú)Node.js進行編寫,并使用了(le/liǎo)Koa 2框架。代碼僅供參考。

步驟1:獲取重要(yào / yāo)參數access_token

調用獲取小程序二維碼的(de)REST API需要(yào / yāo)一個(gè)很重要(yào / yāo)的(de)參數:access_token,這(zhè)是(shì)用于(yú)獲取微信公衆平台API訪問權限的(de)重要(yào / yāo)參數,做過微信公衆号HTML5開發的(de)朋友對其肯定非常熟悉。沒接觸過的(de)話,可以(yǐ)看一下微信公衆平台的(de)文檔。

調用微信公衆平台的(de)API,已經有很多成熟的(de)開源SDK可以(yǐ)使用,從Github上(shàng)可以(yǐ)搜到(dào)很多不(bù)同語言實現的(de)SDK。由于(yú)我用的(de)是(shì)Node.js開發,所以(yǐ)使用了(le/liǎo)co-wechat-api。

以(yǐ)下是(shì)使用co-wechat-api來(lái)獲取access_token的(de)基本用法:

const WechatAPI = require('co-wechat-api')

const wxAppAPI = new WechatAPI('小程序的(de)app id', '小程序的(de)app secret')
const token = await wxAppAPI.ensureAccessToken()

console.log(token.accessToken)

步驟2:拼接url,發送請求獲取二維碼圖片

const fs = require('fs')
const axios = require('axios')

// 拼接url
const url = `https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${token.accessToken}`

// 發送POST請求
const response = await axios.post(url, {
  page: '小程序中Page的(de)路徑',
  scene: '自定義參數,格式你自己決定'
}, { responseType: 'stream' })

// 将請求結果中的(de)二進制流寫入到(dào)本地(dì / de)文件qrcode.png
response.data.pipe(fs.createWriteStream('qrcode.png'))

在(zài)上(shàng)面的(de)代碼中,我們将access_token作爲(wéi / wèi)query string參數拼接到(dào)url上(shàng),然後向這(zhè)個(gè)url發送POST請求,傳遞的(de)參數主要(yào / yāo)是(shì)page和(hé / huò)scene,其中page參數是(shì)掃碼後進入的(de)小程序頁面路徑(比如pages/index/index,并且不(bù)能攜帶參數),而(ér)scene則傳入的(de)是(shì)我們的(de)自定義參數。

其實經過這(zhè)一步,你就(jiù)已經可以(yǐ)在(zài)你的(de)磁盤上(shàng)找到(dào)這(zhè)張小程序碼的(de)圖片了(le/liǎo),用微信掃一下這(zhè)張圖片,就(jiù)能進入你的(de)小程序頁面。

步驟3:将二維碼圖片輸出(chū)

雖然我們已經獲取到(dào)了(le/liǎo)小程序碼圖片,但是(shì)現在(zài)它還隻是(shì)躺在(zài)我們的(de)服務器端。而(ér)通常實際情況是(shì),我們需要(yào / yāo)在(zài)小程序頁面上(shàng)去顯示這(zhè)張圖片,讓用戶去保存和(hé / huò)分享它。因此,我們需要(yào / yāo)把這(zhè)張圖片通過我們的(de)API進行輸出(chū)。以(yǐ)下是(shì)基于(yú)koa 2的(de)示例代碼:

const fs = require('fs')
const Router = require('koa-router')
const router = new Router()

router.get('/wx/common/qrcode', async (ctx) => {
  const stream = fs.createReadStream(‘qrcode.png’)
  ctx.body = stream
})

步驟4:在(zài)小程序中顯示

在(zài)小程序中顯示該圖片就(jiù)非常簡單了(le/liǎo),直接使用<image>組件來(lái)進行展示:

  <image src="https://your-domain.com/wx/common/qrcode" style="width:200px;height:200px"></image>

附錄:稍微完備一些的(de)服務端代碼

上(shàng)面4個(gè)步驟中給出(chū)的(de)示例代碼隻是(shì)爲(wéi / wèi)了(le/liǎo)配合說(shuō)明各個(gè)步驟,代碼比較簡陋,下面是(shì)經過稍微的(de)組織過的(de)代碼,供參考:

  • 路由部分的(de)代碼:
const Router = require('koa-router')
const PassThrough = require('stream').PassThrough;
const wxapi = require('../services/wxapi')
const router = new Router()

router.get('/wx/common/qrcode', async (ctx) => {
  const stream = await wxapi.getWxaCodeUnlimit({
    page: 'pages/profile/profile',
    scene: 'abc123'
  })
  ctx.body = stream.pipe(PassThrough())
})
  • Service部分的(de)代碼:
const fs = require('fs')
const path = require('path')
const crypto = require('crypto')
const bluebird = require('bluebird')
const axios = require('axios')
const WechatAPI = require('co-wechat-api')

const wxAppAPI = new WechatAPI('小程序的(de)app id', '小程序的(de)app secret')

function sha1(message) {
  return crypto.createHash('sha1').update(message, 'utf8').digest('hex')
}

module.exports = {

  async getWxaCodeUnlimit({ page, scene }) {
    // 圖片文件名使用page和(hé / huò)scene等數據生成Hash
    // 以(yǐ)避免重複生成内容相同的(de)小程序碼
    const fileName = sha1(page + scene)
    const filePath = path.join(__dirname, `../../qrcode/${fileName}.png`)

    let readable

    try {
      // 檢測該名字的(de)小程序碼圖片文件是(shì)否已存在(zài)
      await bluebird.promisify(fs.access)(filePath, fs.constants.R_OK);
      readable = fs.createReadStream(filePath)
    } catch (e) {
      // 小程序碼不(bù)存在(zài),則創建一張新的(de)
      const token = await wxAppAPI.ensureAccessToken()
      const response = await axios({
        method: 'post',
        url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit',
        responseType: 'stream',
        params: { access_token: token.accessToken },
        data: { page, scene }
      })
      readable = response.data
      readable.pipe(fs.createWriteStream(filePath))
    }

    // 返回該小程序碼圖片的(de)文件流
    return readable
  }

}

祝大(dà)家開發出(chū)更好的(de)小程序!

相關案例查看更多