1. 程式人生 > >微信小程式 雲開發 生成帶參小程式碼 雲函式網路請求(Node.js網路請求)

微信小程式 雲開發 生成帶參小程式碼 雲函式網路請求(Node.js網路請求)

生成帶參小程式碼流程
1、小程式端上傳生成二維碼所需的引數到雲函式
2、雲函式使用appidappsecret請求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,
    })
  }
})
雲函式用appidappsecret請求access_token
建立雲函式getImage,並在對應雲函式目錄中匯入requestrequest-promiseaxios框架(用於資料請求),
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)
  }
}

掃碼實時獲取更多技術文章

在這裡插入圖片描述