本文字数:2340 字 12图
阅读完需:约 6 分钟
点击上方“青年码农”关注
回复“源码”可获取各种资料
微信小程序最近的大动作算是云开发计费调整,不再支持免费套餐,改为新的计费方式,“基础套餐+按量付费” 模式。这就导致我之前的所有基于云开发的小程序都需要调整,毕竟没有收益的小程序,不可能继续使用一个小程序开通一个开发环境和一个生产环境。
微信云开发免费的基础套餐、与微信生态整合、灵活的计费方式和完善的服务,使得云开发非常的火爆,大量的开发者涌入,即使不懂服务器,一个前端工程师使用云开发就可以完成一整个项目。
2018年9月云开发发布到现在,官方统计有1000000开发者选择微信云开发。
但是这次的改动,涉及的用户量非常的大,已经有很多开发者转战到其他平台。
就我个人而言,之前开发的小程序都需要做出调整,目前已经迁移了一个,删除了6个环境,还有几个打算后期在调整。还是老老实实用服务器吧,毕竟天下没有免费的午餐。
还好微信提供了跨账号环境共享,多个小程序可以共用一个环境,这样对开发者来说确实能减少一部分开销。接下来就说说如何共享环境。
1. 前置条件
环境共享必须是同主体的,这个同主体指的是:
个人:同一个人(身份证)注册的小程序
单位:同一公司
2. 开通
使用 1.03.2009140 或以上版本的开发者工具,进入云控制台,到 “设置 - 拓展能力 - 环境共享” 点击开通即开通环境共享能力。
更多
环境共享
开通
添加共享
不同主体提示信息,即使小程序绑定到同一公众号下也是不可以的。
授权
当前的小程序环境已经共享成功,调用方可以看到新的环境
接下来是代码环节,在使用共享环境之前,需要保证资源方拥有cloudbase_auth 云函数,用于鉴权调用方的身份并制定相关权限。
其实这个函数可以理解为守卫,调用方带着appid和环境id首先会走到这个函数,验证通过之后才可以使用。因为这个函数是必须的,官方也提供了简单的demo。
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
console.log(event)
console.log(wxContext)
// 跨账号调用时,由此拿到来源方小程序/公众号 AppID
console.log(wxContext.FROM_APPID)
// 跨账号调用时,由此拿到来源方小程序/公众号的用户 OpenID
console.log(wxContext.FROM_OPENID)
// 跨账号调用、且满足 unionid 获取条件时,由此拿到同主体下的用户 UnionID
console.log(wxContext.FROM_UNIONID)
return {
errCode: ,
errMsg: '',
auth: JSON.stringify({
// 自定义安全规则
// 在前端访问资源方数据库、云函数等资源时,资源方可以通过
// 安全规则的 `auth.custom` 字段获取此对象的内容做校验,
// 像这个示例就是资源方可以在安全规则中通过 `auth.custom.x` 获取
x: ,
}),
}
}
有了这个函数,就能确定调用方有哪些权限了。调用方使用共享环境方法,在需要的页面实例化。
onLoad: async function (options) {
let that = this
var c1 = new wx.cloud.Cloud({
// 资源方 AppID
resourceAppid: 'wxb8f15ddd4eb56193',
// 资源方环境 ID
resourceEnv: 'iot-prd',
})
// 跨账号调用,必须等待 init 完成
// init 过程中,资源方小程序对应环境下的 cloudbase_auth 函数会被调用,并需返回协议字段(见下)来确认允许访问、并可自定义安全规则
await c1.init()
that.setData({
c1:c1
})
}
使用的时候直接
that.data.c1
.callFunction({
name: "函数名",
data: {}
}).then(res => {
// 业务逻辑
})
最开始的时候打算把实例化放在app.js的onLaunch中,但是发现在index页面并不能取到,这个是由于异步导致,必须先实例化。
在云函数中使用和上面方法差不多,
const cloud = require('wx-server-sdk')
exports.main = async (event) => {
// 声明新的 cloud 实例
var c1 = new cloud.Cloud({
// 资源方 AppID
resourceAppid: 'wxe0e2656d74f0bff3',
// 资源方环境 ID
resourceEnv: 'test-f96b31',
})
// 跨账号调用,必须等待 init 完成
// init 过程中,资源方小程序对应环境下的 cloudbase_auth 函数会被调用,并需返回协议字段(见下)来确认允许访问、并可自定义安全规则
await c1.init()
// 完成后正常使用资源方的已授权的云资源
return c1.callFunction({
name: '函数名',
data: {},
})
}
这里有一个需要注意的地方,就是如果小程序使用了云开发,在编辑器中想要切换到共享的环境,是选择不了的,目前的编辑器还不支持,不知后续是否能支持。