知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷(xiāo)的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷(xiāo)工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 小程序相關(guān) >
微信小程序之生成自定義參數(shù)小程序二維碼
發(fā)表時(shí)間:2021-1-11
發(fā)布人:葵宇科技
瀏覽次數(shù):96
掃碼已經(jīng)成為一種常見(jiàn)又方便的進(jìn)入移動(dòng)應(yīng)用的途徑,可以把線(xiàn)上線(xiàn)下的用戶(hù)流量帶入你的移動(dòng)應(yīng)用中來(lái)。微信小程序也提供了掃碼進(jìn)入的功能,可以通過(guò)掃描二維碼或者微信小程序?qū)S械男〕绦虼a,進(jìn)入到相應(yīng)的小程序頁(yè)面。
微信官方提供了3個(gè)不同的REST API用于生成帶參數(shù)的小程序碼或者二維碼,可在掃碼后進(jìn)入指定的小程序頁(yè)面,其中接口A和C能生成的圖片總數(shù)量有限制(10萬(wàn)張),對(duì)于那種需要生成大量二維碼的使用場(chǎng)景(比如為每個(gè)訂單生成一個(gè)二維碼、餐廳的每張餐桌生成一個(gè)二維碼等)是遠(yuǎn)遠(yuǎn)不能滿(mǎn)足需求的。而接口B可以解決這個(gè)問(wèn)題,我們這次主要來(lái)看一下如何使用這個(gè)接口。
總體的思路是:在我們的后端開(kāi)發(fā)一個(gè)API,在其中調(diào)用微信的二維碼接口,調(diào)用成功后會(huì)得到二維碼圖片的二進(jìn)制流,最后將這個(gè)二進(jìn)制流輸出到前臺(tái)。
以下步驟中的后端代碼是基于Node.js進(jìn)行編寫(xiě),并使用了Koa 2框架。代碼僅供參考。
步驟1:獲取重要參數(shù)access_token
調(diào)用獲取小程序二維碼的REST API需要一個(gè)很重要的參數(shù):access_token
,這是用于獲取微信公眾平臺(tái)API訪(fǎng)問(wèn)權(quán)限的重要參數(shù),做過(guò)微信公眾號(hào)HTML5開(kāi)發(fā)的朋友對(duì)其肯定非常熟悉。沒(méi)接觸過(guò)的話(huà),可以看一下微信公眾平臺(tái)的文檔。
調(diào)用微信公眾平臺(tái)的API,已經(jīng)有很多成熟的開(kāi)源SDK可以使用,從Github上可以搜到很多不同語(yǔ)言實(shí)現(xiàn)的SDK。由于我用的是Node.js開(kāi)發(fā),所以使用了co-wechat-api。
以下是使用co-wechat-api
來(lái)獲取access_token
的基本用法:
const WechatAPI = require('co-wechat-api')
const wxAppAPI = new WechatAPI('小程序的app id', '小程序的app secret')
const token = await wxAppAPI.ensureAccessToken()
console.log(token.accessToken)
步驟2:拼接url,發(fā)送請(qǐng)求獲取二維碼圖片
const fs = require('fs')
const axios = require('axios')
// 拼接url
const url = `https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=${token.accessToken}`
// 發(fā)送POST請(qǐng)求
const response = await axios.post(url, {
page: '小程序中Page的路徑',
scene: '自定義參數(shù),格式你自己決定'
}, { responseType: 'stream' })
// 將請(qǐng)求結(jié)果中的二進(jìn)制流寫(xiě)入到本地文件qrcode.png
response.data.pipe(fs.createWriteStream('qrcode.png'))
在上面的代碼中,我們將access_token
作為query string參數(shù)拼接到url上,然后向這個(gè)url發(fā)送POST
請(qǐng)求,傳遞的參數(shù)主要是page
和scene
,其中page
參數(shù)是掃碼后進(jìn)入的小程序頁(yè)面路徑(比如pages/index/index,并且不能攜帶參數(shù)),而scene
則傳入的是我們的自定義參數(shù)。
其實(shí)經(jīng)過(guò)這一步,你就已經(jīng)可以在你的磁盤(pán)上找到這張小程序碼的圖片了,用微信掃一下這張圖片,就能進(jìn)入你的小程序頁(yè)面。
步驟3:將二維碼圖片輸出
雖然我們已經(jīng)獲取到了小程序碼圖片,但是現(xiàn)在它還只是躺在我們的服務(wù)器端。而通常實(shí)際情況是,我們需要在小程序頁(yè)面上去顯示這張圖片,讓用戶(hù)去保存和分享它。因此,我們需要把這張圖片通過(guò)我們的API進(jìn)行輸出。以下是基于koa 2的示例代碼:
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:在小程序中顯示
在小程序中顯示該圖片就非常簡(jiǎn)單了,直接使用<image>
組件來(lái)進(jìn)行展示:
<image src="https://your-domain.com/wx/common/qrcode" style="width:200px;height:200px"></image>
附錄:稍微完備一些的服務(wù)端代碼
上面4個(gè)步驟中給出的示例代碼只是為了配合說(shuō)明各個(gè)步驟,代碼比較簡(jiǎn)陋,下面是經(jīng)過(guò)稍微的組織過(guò)的代碼,供參考:
- 路由部分的代碼:
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部分的代碼:
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('小程序的app id', '小程序的app secret')
function sha1(message) {
return crypto.createHash('sha1').update(message, 'utf8').digest('hex')
}
module.exports = {
async getWxaCodeUnlimit({ page, scene }) {
// 圖片文件名使用page和scene等數(shù)據(jù)生成Hash
// 以避免重復(fù)生成內(nèi)容相同的小程序碼
const fileName = sha1(page + scene)
const filePath = path.join(__dirname, `../../qrcode/${fileName}.png`)
let readable
try {
// 檢測(cè)該名字的小程序碼圖片文件是否已存在
await bluebird.promisify(fs.access)(filePath, fs.constants.R_OK);
readable = fs.createReadStream(filePath)
} catch (e) {
// 小程序碼不存在,則創(chuàng)建一張新的
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))
}
// 返回該小程序碼圖片的文件流
return readable
}
}
祝大家開(kāi)發(fā)出更好的小程序!
相關(guān)案例查看更多
相關(guān)閱讀
- 百度小程序公司
- 公眾號(hào)模板消息
- 全國(guó)前十名小程序開(kāi)發(fā)公司
- 百度小程序開(kāi)發(fā)公司
- 小程序被騙退款成功
- 小程序退款
- 云南網(wǎng)站建設(shè)方法
- 云南小程序開(kāi)發(fā)
- 網(wǎng)站建設(shè)服務(wù)
- web開(kāi)發(fā)
- 云南網(wǎng)站建設(shè)案例
- 云南網(wǎng)站建設(shè)電話(huà)
- 云南網(wǎng)站建設(shè)百度
- 網(wǎng)站建設(shè)哪家強(qiáng)
- 小程序開(kāi)發(fā)課程
- 搜索排名
- 智慧農(nóng)貿(mào)市場(chǎng)
- 網(wǎng)站建設(shè)專(zhuān)業(yè)品牌
- 花農(nóng)小程序
- 云南網(wǎng)站建設(shè)一條龍
- 云南省城鄉(xiāng)建設(shè)廳網(wǎng)站
- 云南網(wǎng)站建設(shè)選
- 云南網(wǎng)站建設(shè)報(bào)價(jià)
- 云南省住房建設(shè)廳網(wǎng)站
- 微信小程序
- 前端開(kāi)發(fā)
- 昆明小程序開(kāi)發(fā)聯(lián)系方式
- 江蘇小程序開(kāi)發(fā)
- 昆明小程序設(shè)計(jì)
- 昆明小程序定制開(kāi)發(fā)