遇到了一個需求,想要掃碼後,進入微信小程序的某一個頁面,這就要求二維碼攜帶參數。html
微信小程序開發文檔很簡單,但不太具體。前端
經百度和折騰,在express中成功得到了帶參數的二維碼。ios
總結如下幾步,供參考。express
爲何要在服務端引入這個工具?由於還須要用這個工具去找微信服務端拿access_token接口憑證,來保證安全。npm
筆者用的是axios。cmd進入根目錄,npm安裝。json
# npm i axios --save
canvas
確定須要寫一個得到二維碼的接口。在寫這個接口的文件中引入axios便可,接口路由的寫法不具體展開介紹。axios
import express from 'express';
import axios from 'axios'; //引入axios庫
let qrcode= express.Router();
qrcode.post('/getQrode',async (req,res)=>{
try {
...
//待寫接口內容區域
} catch (error) {
throw error;
}
})
export default qrcode;複製代碼
引入了庫,定義了路由,也定義了一個post接口。第一步準備完畢。小程序
找微信服務端拿access_token,須要用上剛剛引入的axios工具了。後端
經過官方文檔介紹,獲取access_token須要三個參數,一個常量grant_type,兩個變量分別是appid和secret(註冊小程序的時候就會得到)
修改接口便可得到access_token
import express from 'express';
import axios from 'axios';
let qrcode= express.Router();
qrcode.post('/share',async (req,res)=>{
try {
let appid = 'wxc********b7a';
let secret = '2bfa**************e8682';
let url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`
axios.get(url).then(res2=>{
//access_token就在res2中
let access_token = res2.data.access_token;
//待繼續補充區域
});
} catch (error) {
console.log(error)
}
})
export default qrcode;複製代碼
拿到了access_token接口憑證了,繼續下一步。
閱讀文檔,得知須要進一步傳參,請求微信服務端獲取二維碼的buffer數據。
須要攜帶的參數能夠寫在scene中。其餘參數文檔中介紹的已經很具體。
然而,這裏有兩個坑要注意!
第一個坑:access_token參數要寫在url中,否則請求後會報未傳access_token的錯。
第二個坑:要設置響應格式,不然請求回來的buffer數據老是被編譯成String字符串,形成文件損壞,就沒法轉化爲正常圖片(這個折磨了我很久)
import express from 'express';
import axios from 'axios';
let qrcode = express.Router();
qrcode.post('/share',async (req,res)=>{
try {
let appid = 'wxc********b7a';
let secret = '2bfa**************e8682';
let url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`
axios.get(url).then(res2=>{
let access_token = res2.data.access_token;
let scene = req.body._id;//開發者本身自定義的參數
axios(
{
headers:{"Content-type":"application/json"},
method: 'post',
responseType: 'arraybuffer',
url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='+access_token+'',
data:{
scene:scene,
page:'pages/infor/main',
width: 280
}
}
).then(res3=>{
//請求到的二維碼buffer就在res3中
//待完善區域
})
});
} catch (error) {
console.log(error)
}
})
export default qrcode;複製代碼
第二次axios請求,用option配置的方式,設置了responseType,避開了第二個坑。二維碼的buffer數據就在res3中。
只要buffer數據是完整的,就能正確生成二維碼。
由於須要生成圖片,因此須要引用fs模塊和path模塊。
import express from 'express';
import axios from 'axios';
import path from 'path';
import fs from 'fs';
let qrcode= express.Router();
qrcode.post('/share',async (req,res)=>{
try {
let appid = 'wxc********b7a';
let secret = '2bfa**************e8682';
let url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`;
axios.get(url).then(res2=>{
let access_token = res2.data.access_token;
let scene = req.body._id;
axios(
{
headers:{"Content-type":"application/json"},
method: 'post',
responseType: 'arraybuffer',
url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='+access_token+'',
data:{
scene:scene,
page:'pages/infor/main',
width: 280
}
}
).then(res3=>{
let src = path.dirname(__dirname).replace(/\\/g,'/')+`/public/photo/${req.body._id}.png`;
fs.writeFile(src, res3.data, function(err) {
if(err) {console.log(err);}
res.json({msg:ok});
});
})
});
} catch (error) {
console.log(error);
res.json({error})
}
})
export default qrcode;複製代碼
就會在根目錄下的public/photo文件夾中生成制定名稱的二維碼圖片。供小程序訪問調用。
獲取二維碼後,能夠在前端利用canvas進行圖片繪製,也能夠在後端生成圖片。可根據業務需求自行選擇。
但願對有須要的朋友可以有幫助。