先上文档:官方文档
一般碰到问题比较多的是怎么起步,
!important
为了方便讲清楚概念,我们称呼主账号(提供资源/函数的小程序)为【资源方】,要进行跨账号环境调用资源的账号为【调用方】
(需小程序公共库 2.13.0 或以上)(需 wx-server-sdk 版本大于或等于 2.3.0)
确保要共享资源的两个小程序在__同个主体__下面
例如同个公司、个人开发者等。
用微信开发者工具,打开【资源方】,点击头像右侧的__云开发__
点击云开发弹框右侧的__设置__
选择顶部tab栏目的__拓展功能__
点击__环境共享__的开通
点击__添加共享__,并输入【调用方】的appid,根据需求勾选权限并确认
用微信开发者工具,打开【调用方】
点击云开发确认可以看到【资源方】的云函数和云存储,如果这一步没看到共享的内容,返回确认前面的步骤
在【资源方】的云开发-设置-环境设置-环境名称处,创建开通按量计费(免费)的云开发环境。
配置部分非常繁琐,但是到这里就结束了。接下来是开发部分
【资源方】云函数部分改动的内容,入口
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: 0,
errMsg: '',
auth: JSON.stringify({
// 自定义安全规则
// 在前端访问资源方数据库、云函数等资源时,资源方可以通过
// 安全规则的 `auth.custom` 字段获取此对象的内容做校验,
// 像这个示例就是资源方可以在安全规则中通过 `auth.custom.x` 获取
x: 1,
}),
}
}
【调用方】云函数部分改动的内容
!important
这边前端建议对所有云函数入口做一个统一的路由,不要到处callFunction。
在统一路由那边,我一般是这样写在utils里,或者写到route.js里,这样你只要改一个地方,就可以修改整个小程序的所有请求
async function requestCloud(requestName, data) {
wx.cloud.init({
traceUser: true
})
let c1 = new wx.cloud.Cloud({
// 资源方 AppID
resourceAppid: 'wx5d8d765e252720eb',
// 资源方环境 ID
resourceEnv: 'production-rjntq',
})
await c1.init()
return await c1.callFunction({
name: requestName,
data: data
})
}
如果是用promise的写法,就外面再包一层,举例,把上面的代码,加上下面的部分,塞到同一个新的function里,
return new Promise(function (resolve, reject) {
requestCloud(requestName, data).then(res => {
if (res.result.code == 0) {
resolve(res.result.data)
return
} else {
hideLoading()
wx.showToast({
title: res.result.msg,
icon: 'none'
})
reject(res.result)
return
}
}).catch(err => {
reject(err)
return
})
})
纯前端的部分就结束了,这边遇到问题最多的是,没想到这玩意儿要初始化两次云函数,一次是自己的,一次是【资源方】的。
如果是【调用方】也有自己的后台,想要调用【资源方】的云函数,
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: {},
})
}
好了,你再编译一下自己的【调用方】代码,应该就ok了。
我现在卡在怎么以【调用方】身份,在wxml中例如Image src里直接访问【资源方】的图片资源。按理说云开发面板上是可以看到的,以及也授权了,应该是可以直接打开才对,但是渲染层就是打不开。有发现的朋友麻烦联系我微信:SH-Yushi。十分感谢。
已经通过后台批量替换cloud前缀为https格式解决。
现在还剩如何直接操作【资源方】云数据库。保底方案是通过云函数绕过去