微信小程序 云开发小程序环境共享 看这篇就够了

1,341 阅读2分钟

官方API 链接

官方解释

云开发支持跨账号环境(资源)共享,即一个小程序的云开发资源可以授权共享给同主体下其他小程序 / 公众号使用。

 

需求

已知两个或多个小程序,A,B...

B需要访问A的云数据库进行操作,其他类似

 

A端(资源方)操作

创建一个云函数,名为 cloudbase_auth,将以下代码写入,同步

 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,
     }),
   }
 }

B端(需求方)操作

创建一个云函数,用于请求A方资源,例如叫GetADB

image.png

将以下代码写入GetADB保存后同步,注意修改自己的配置信息

 // 云函数入口文件
 const cloud = require('wx-server-sdk')
 
 
 // 云函数入口函数
 exports.main = async (event, context) => {
 
   // 声明新的 cloud 实例
   var c1 = new cloud.Cloud({
     // 资源方 AppID
     resourceAppid: '修改为A的AppID',
     // 资源方环境 ID
     resourceEnv: '修改为A的环境ID',
   })
 
   // 跨账号调用,必须等待 init 完成
   // init 过程中,资源方小程序对应环境下的 cloudbase_auth 函数会被调用,并需返回协议字段(见下)来确认允许访问、并可自定义安全规则
   await c1.init()
 
   // 完成后正常使用资源方的已授权的云资源
   return new Promise(async (resolve, reject) => {
     
     //多数报错504002什么的,都是没写下面这段代码,或者查询的数据库不存在导致
     const db = c1.database()
     await db.collection('数据库名称').limit(1000)
     //查询条件
       .field({
         id: true
       })
       .get()
       .then(res => {
         console.log('获取-A数据库-成功',res)
         resolve(res.data)
       })
       .catch(err => {
         console.log('获取-A数据库-失败',err)
         reject(err)
       })
   })
 
 }

测试请求

在小程序B调用自己的云函数GetADB

  async GetADB(){
     await wx.cloud.callFunction({
       name:'GetADB'
     })
     .then(res=>{
       console.log(res);
     })
     .catch(err=>{
       console.log(err);
     })
   }

处理后的返回结果

image.png  

时间若流水,恍惚间逝去