小程序云开发已经支持云调用,开放了很多接口,一直想要的获取小程序码也支持了。这下轻量的小程序也可以有自定义小程序码的功能。

1. 需求

获得一个带参数的小程序码,传播出去以后,用户扫码进入指定页面,根据参数做不同的处理。本文只讲小程序码生成、存储、展示部分。参数处理不多介绍,可以查看 项目代码 了解更多。

2. 开通云开发

新建小程序可以从开发工具的云开发模板初始化项目,根据云开发操作指引新建项目即可。

但是这里有个问题,已发布小程序的页面才能生成小程序码。如果现有的小程序没有开通云开发,需要做以下几步:

  1. 开发工具开通云开发,设定云开发的环境;
  2. 将原来的代码(除了project.config.json以外的所有文件)放到新建的 miniprogram 目录;
  3. 新增 cloudfunctions 目录;
  4. app.json 新增配置 "cloud": true
  5. project.config.json 配置 "miniprogramRoot":"miniprogram/""cloudfunctionRoot":"cloudfunctions/"
  6. 修改小程序基础库版本,最低要 2.3.0 "libVersion": "2.3.0"

3. 生成小程序码

下面可以开始写代码开发了,开始之前,建议先看完官方教程。特别是开发工具的使用步骤,开发和调试时如果遇到奇怪的问题,可以尝试重启开发工具、重装开发工具,也可以去微信开放社区发帖。(重启和重装都是我在社区中发现的答案,能解决各种不应该存在的问题)。

3.1 准备文件

cloudfunctions目录右键新建Node.js云函数 getqr

生成小程序码需要单独指定权限。在 getqr 目录新建 config.json ,里面写以下内容:

{"permissions": {"openapi": ["wxacode.getUnlimited"]}
}

小程序码的获取方式有三种,这里只用到了接口 getUnlimited,选择这个接口的原因是漂亮的圆形小程序码,数量无限制。具体区别可以去 获取小程序码官方文档查看详情。
正常情况下,这个时候云函数可以部署测试了。如果遇到部署不成功、各种权限问题,可以尝试本地部署上传所有文件、重启试试。

3.2 生成小程序码

生成小程序码的代码如下,可以指定页面和页面参数 scene,还有小程序码的尺寸。

注意这里的 scene 有限制: 1. 最大32个可见字符; 2. 只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~; 3. 注意参数格式:下面实例代码生成小程序码后,扫码获得 pages/demo/demo?scene=id%3D6

try {const result = await cloud.openapi.wxacode.getUnlimited({page: 'pages/demo/demo',scene: 'id=6',width: 240,})console.log(result)return result
} catch (err) {console.log(err)return err
}

直接调用,比服务端调用少了 access_token 参数。

3.3 上传到云存储

返回值中的 buffer 就是图片内容,直接上传到云存储:

const uploadResult = await cloud.uploadFile({cloudPath: 'shareqr/' + qr_name_hash + '.jpg',fileContent: result.buffer,
});

  • 我在云存储新建了 shareqr 目录保存小程序码;
  • 图片名根据参数取md5摘要;
  • getUnlimited 返回的图像是 jpeg 格式,后缀硬编码写 .jpg

3.4 获取图片临时路径

直接上代码

getURLReault = await cloud.getTempFileURL({fileList: [uploadResult.fileID]
});
fileObj = getURLReault.fileList[0]
return fileObj

3.5 直接从存云存储获取

生成过以后图片已经保存在云存储,用同样的参数第二次调用没必要再生成一次,去掉一次网络请求,可以节省不少时间。

前面说到文件名使用请求参数摘要,知道了目录和文件名,再加上文件bucket前缀就可以拼出来 fileID,用fileID 可以查询云存储的文件。

比如我刚刚生成的 fileID 是 cloud://dev-xxxx.8888-dev-xxxx/qr/44ea42f05091c3bec771123e6e8cd4c2.jpg, 前缀就是 cloud://dev-xxxx.8888-dev-xxxx/。再拼上目录、文件名、后缀就是 fileID

注:此处的 fileID拼接方法并不是来自官方文档,只是在使用中发现这个前缀不会变。还需要官方解释说明fileID规则。 如果会改变,就需要再用云数据库存储fileID,更麻烦一些。

3.6 云函数完整代码

// 云函数入口文件
const cloud = require('wx-server-sdk');
const crypto = require('crypto');
const bucketPrefix = 'cloud://dev-xxxx.8888-idc-4d11a4-1257831628/qr/'; // env: 'dev-xxxx'// 云函数入口函数
exports.main = async (event, context) => {const full_path = event.page + '?' + event.scene;const qr_name_hash = crypto.createHash('md5').update(full_path).digest('hex');const temp_id = bucketPrefix + qr_name_hash + '.jpg';// return {//   full_path,//   qr_name_hash,//   temp_id// }try {// 先尝试获取文件,存在就直接返回临时路径let getURLReault = await cloud.getTempFileURL({fileList: [temp_id]});// return getURLReault;let fileObj = getURLReault.fileList[0];if (fileObj.tempFileURL != '') {fileObj.fromCache = true;return fileObj;}// 生成小程序码const wxacodeResult = await cloud.openapi.wxacode.getUnlimited({scene: event.scene,page: event.page,width: 240})// return wxacodeResult;if (wxacodeResult.errCode != 0) {// 生成二维码失败,返回错误信息return wxacodeResult;}// 上传到云存储const uploadResult = await cloud.uploadFile({cloudPath: 'qr/' + qr_name_hash + '.jpg',fileContent: wxacodeResult.buffer,});// return uploadResult;if (!uploadResult.fileID) {//上传失败,返回错误信息return uploadResult;}// 获取图片临时路径getURLReault = await cloud.getTempFileURL({fileList: [uploadResult.fileID]});fileObj = getURLReault.fileList[0];fileObj.fromCache = false;// 上传成功,获取文件临时url,返回临时路径的查询结果return fileObj;} catch (err) {return err}}

4. 小程序页面调用

调用页面就比较简单了,在小程序新建一个 pages/share/shareonLoad 函数调用云函数。

// 使用前记得先初始化云函数,一版放到 app.js onLaunch() 中
// wx.cloud.init({env: 'dev-8888'})wx.cloud.callFunction({name: 'getqr',data: {page: 'pages/demo/demo',scene: 'id=6',}
}).then(res => {console.log(res.result);if (res.result.status == 0) {_this.setData({qr_url: res.result.tempFileURL})}else{wx.showToast({icon: 'none',title: '调用失败',})}
}).catch(err => {console.error(err);wx.showToast({icon: 'none',title: '调用失败',})
})

至此完整的调用过程已经全部完成,详细代码可以到 项目代码 查看。

代码中还对入口页面和share页面的参数做了包装,云函数可以直接使用,小程序可以稍做修改适应自己业务。

写在最后

小程序云开发已经开放了很多功能,除了这次提到的生成小程序码,云调用还可以发送模板消息。有需要的开发者又一个理由可以快速上线新功能了。

云开发还开放了HTTP API,也就是用自己的服务器调用云函数。以前看完云开发介绍文章最大的疑问就是,你说的都很好,可是后台数据怎么管理呢?不能跟自己的服务器结合,只能放一些轻量的小程序。有了 HTTP API 以后就可以用自己的服务器做管理后台了。这时候你要问,都用上服务器了,还需要云开发做什么。首先,云开发免费;其次,免费功能已经够强,就差不能做Web管理后台了;最后,获取access_token(小程序及小游戏调用不要求IP地址在白名单内。)

dev 命令行参数调用_云开发·云调用生成小程序码相关推荐

  1. 机智云开发平台一键生成小程序,低成本将智能产品快速推向市场

    小程序开发一.功能简介 本文档阐述了超赛自动生成小程序功能的使用说明和功能细节. 自动生成小程序功能是通过用户授权的方式,在超赛后台配置小程序所需的内容参数,自动生成小程序应用并提审发布到微信公众平台 ...

  2. 基于云开发的答题活动小程序v2.0-用云开发的聚合能力实现从题库中随机出题功能

    项目技术栈 微信原生小程序+云开发.为什么选择微信原生小程序进行开发呢?因为能够直接应用它的云开发能力吖. 我这里主要使用了云开发能力中的小程序端SDK,说白了就是在javascript中就能直接操作 ...

  3. 基于云开发的答题活动小程序v2.0-答题记录页

    项目技术栈 微信原生小程序+云开发.我这里主要使用了云开发能力中的小程序端SDK,说白了就是在javascript中就能直接操作数据库. 本篇前言 基于云开发的答题活动小程序v2.0的源码地址,以及手 ...

  4. 【小程序·云开发】手动把小程序项目变成云开发项目

    小目录 问题描述: 问题解决: 1.工程创建事项 2.开通云服务 3.配置云函数文件夹 4.云环境初始化 结语: 问题描述: 你我皆凡人,没多少人能直接会云开发的,都是在小程序地基打好之后才想云开发这 ...

  5. 基于云开发的答题活动小程序v2.0-结合具体场景谈谈路由传参以及组件化思想

    项目技术栈 微信原生小程序+云开发.我这里主要使用了云开发能力中的小程序端SDK,说白了就是在javascript中就能直接操作数据库. 本篇前言 基于云开发的答题活动小程序v2.0的源码地址,以及手 ...

  6. 微信小程序|基于小程序+云开发制作一个菜谱小程序

    今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力. 一.小程序 1. 创建小程序

  7. 云开发表白墙微信小程序源码

    这是一款云开发的表白墙微信小程序 特点是云开发, 安装特别的简单 首先呢小程序账号开通云开发权限 然后把源码上传到微信开发者工具里面 然后点击开发者工具软件上面的云开发,然后点击数据库 在数据库里面创 ...

  8. 修复采集接口版云开发表情包微信小程序源码下载增加制作等功能

    大家好,相信很多人对这个界面的表情包小程序肯定不陌生吧 不错之前该款小程序是属于独立后端的,不管今天所发的这款是云开发的哟 运营着这个表情包的用户应该发现了,最近很多表情包图片都失效了 所以呢,今天小 ...

  9. 小程序源码:全新独家云开发微群人脉小程序源码下载社群空间站

    今天给大家带来一款云开发版本的微群人脉小程序源码 该版本属于采集版本(群二维码自动采集) 该版本属于云开发版本(免服务器和域名) 这是一款不怕封小程序版本 PS:支持用户自主发布那一款还是有点危险因为 ...

最新文章

  1. simpledateformat 毫秒_阿里巴巴 | 为啥代码中禁用static修饰SimpleDateFormat?
  2. 餐厅管理程序c语言源代码,课内资源 - 基于C++的餐厅管理程序的设计与实现
  3. sql int 转string_SQL智能代码补全引擎【sql-code-intelligence】介绍
  4. MyEclipse连接MySQL
  5. C++11 多线程库使用说明
  6. 解决: IDEA 代码 commit 后,Local Changes 中代码依旧在,提交失败,报错:is out of date
  7. sox处理mp3_使用SoX将mp3文件拆分为TIME秒
  8. unicode html转义字符,HTML转义字符 Unicode和CSS伪类介绍(示例代码)
  9. Android系统常用的权限
  10. Scality试图将对象存储转移到磁带和云中
  11. SQL语句常用优化技巧
  12. 苹果8p吃鸡服务器没有响应,今天绝地求生更新之后进不去了,一进开始界面就游戏未响应:为什么绝地求生更新完进不去...
  13. (二十二)用RANSAC算法来求线性回归模型的参数
  14. input眼睛显示 vue_2019前端面试题汇总(主要为Vue)
  15. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
  16. matlab在振动信号处理中的应用_激光测振仪在超声变幅杆振动测试中的应用
  17. Mac如何将DVD转换为MP3格式
  18. java 读取 dto_DTO 实现 service 和 controller 之间值传递的操作
  19. Xcode低版本运行高版本真机(xcode9联调真机iOS12 系统)
  20. Linux系统如何安装oki打印机,涨知识!OKI针式打印机的驱动安装方法

热门文章

  1. Hbase的读写速度,写比读快
  2. 缓存、内存、硬盘、虚拟硬盘
  3. 【案例分析】分布式系统的接口幂等性设计!
  4. SpringCloud 01_单体应用到分布式系统演变过程
  5. java基础----IO序列化Serializable
  6. JDK9的新特性:String压缩和字符编码
  7. Google Chubby 论文翻译
  8. Leecode15. 三数之和——Leecode大厂热题100道系列
  9. 【题意+推导讲解】1031 Hello World for U (20 分)_15行代码AC
  10. 万进制——蓝桥杯|ACM 大数阶乘——21行代码AC