微信小程式 雲開發 生成帶參小程式碼 雲函式網路請求(Node.js網路請求)
阿新 • • 發佈:2019-01-09
生成帶參小程式碼流程
1、小程式端上傳生成二維碼所需的引數到雲函式
2、雲函式使用appid
和appsecret
請求access_token
3、雲函式使用access_token
+ 小程式端上傳的引數生成二維碼
4、雲函式將生成的二維碼返回到小程式端(或者存到資料庫返回fileID,小程式端用fileID進行獲取,後續生成先在資料庫查詢,資料庫沒有再執行生成操作,防止重複生成小程式碼檔案)
小程式端上傳小程式碼所需的引數
wx.cloud.callFunction({ name: 'getImage', // 雲函式名稱 data: { // 小程式碼所需的引數 page: "pages/xxxx/xxxx", id: id, }, complete: res => { console.log('callFunction test result: ', res) this.setData({ // 獲取返回的小程式碼 xcxCodeImageData: res.result, }) } })
雲函式用appid
和appsecret
請求access_token
建立雲函式getImage
,並在對應雲函式目錄中匯入request
、request-promise
、axios
框架(用於資料請求),
npm install --save request // request框架 npm install --save request-promise // request框架promise風格 npm install --save axios // 資料請求框架,可將返回的資料型別設定為流`stream` # 備註:install 可以簡寫為 i ;save 作用是將這個庫新增到package.json裡面
雲函式檔案中匯入框架
const cloud = require('wx-server-sdk')
const axios = require('axios')
var rp = require('request-promise');
const fs = require('fs');
var stream = require('stream');
# 不需要全部匯入,根據實際下面實際使用情況酌情匯入
請求獲取 access_token
// request框架promise風格 rp('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=secret=appSecret' .then(function(resultValue) { console.log("請求 success:") console.log(JSON.parse(resultValue)) }) .catch(function(err) {}); }); // Nodejs原生寫法 const http = require("https") const url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=secret=appSecret" http.get(url,(res)=>{ var resultValue = "" res.on("data",(data)=>{ resultValue+=data }) res.on("end",()=>{ console.log(resultValue) }) }).on("error",(e)=>{ console.log(`獲取資料失敗: ${e.message}`) })
獲取小程式碼
var options = {
method: 'POST',
url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=' + access_token',
body: {
page: "pages/xxx/xxx
scene: "id=xxx"
},
json: true
};
rp(options)
.then(function(parsedBody) {
console.log(parsedBody) //小程式碼圖片資料
})
.catch(function(err) {});
服務端完整程式碼一
var rp = require('request-promise');
const fs = require('fs');
var stream = require('stream');
// 請求微信access_token
rp('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=secret')
.then(function(resultValue) {
console.log("請求 success:" + resultValue)
console.log(JSON.parse(resultValue).access_token)
// 請求小程式碼
var http = require("http"),
data = {
// 小程式碼引數
"page": "pages/CardDetail/CardDetail",
"width": 300,
"scene": "id=W6MIjlJhFW5Pec-Y",
};
data = JSON.stringify(data);
var options = {
method: "POST",
host: "api.weixin.qq.com",
path: "/wxa/getwxacodeunlimit?access_token=" + JSON.parse(resultValue).access_token,
headers: {
"Content-Type": "application/json",
"Content-Length": data.length
}
};
var req = http.request(options, function (res) {
res.setEncoding("binary");
var imgData = '';
res.on('data', function (chunk) {
imgData += chunk;
});
res.on("end", function () {
// 將返回的圖片資料轉化成uploadFile方法fileContent引數所需的檔案流形式,且本地輸出資料正常,可以試著用此方法執行uploadFile進行獲取小程式碼,作者採用了方法二
var bufferStream = new stream.PassThrough();
bufferStream.end(new Buffer(imgData));
console.log('uploadFile方法fileContent引數所需的檔案流----')
console.log(bufferStream)
// Sublime Text可以執行輸出到本地,且可以開啟二維碼
// 本地存放路徑
var path = 'public/'+ Date.now() +'.png';
fs.writeFile(path, imgData, "binary", function (err) {
if (err) {
console.log("down fail");
}
console.log("down success");
});
});
});
req.write(data);
req.end();
})
.catch(function(err) {});
服務端完整程式碼二(可直接貼上使用)
const cloud = require('wx-server-sdk')
const axios = require('axios')
var rp = require('request-promise');
cloud.init()
// 雲函式入口函式
exports.main = async (event, context) => {
console.log(event)
try {
const resultValue = await rp('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=secret')
const token = JSON.parse(resultValue).access_token;
console.log('------ TOKEN:', token);
const response = await axios({
method: 'post',
url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit',
responseType: 'stream',
params: {
access_token: token,
},
data: {
page: event.page,
width: 300,
scene: "id=" + event.id,
},
});
return await cloud.uploadFile({
cloudPath: 'xcxcodeimages/' + Date.now() + '.png',
fileContent: response.data,
});
} catch (err) {
console.log('>>>>>> ERROR:', err)
}
}