微信小程序云开发 生成带参小程序码流程
程序员文章站
2024-02-09 21:32:34
本文实例为大家分享了小程序生成带参小程序码的具体步骤,供大家参考,具体内容如下
生成带参小程序码流程
1、小程序端上传生成二维码所需的参数到云函数
2、云函数使用ap...
本文实例为大家分享了小程序生成带参小程序码的具体步骤,供大家参考,具体内容如下
生成带参小程序码流程
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) } }
点击查看:
点击查看:
点击查看:
点击查看:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。