官方API Link
官方解釋
雲開發支持跨賬號環境(資源)共享,即一個小程序的雲開發資源可以授權共享給同主體下其他小程序 / 公眾號使用
需求
已知兩個或多個小程序,A,B...
B需要訪問A的雲數據庫進行操作,其他類似
A端(資源方)操作
創建一個雲函數,名為 cloudbase_auth,將以下代碼寫入,同步
1 const cloud = require('wx-server-sdk') 2 cloud.init({ 3 env: cloud.DYNAMIC_CURRENT_ENV 4 }) 5 6 // 雲函數入口函數 7 exports.main = async (event, context) => { 8 const wxContext = cloud.getWXContext() 9 10 console.log(event) 11 console.log(wxContext) 12 // 跨賬號調用時,由此拿到來源方小程序/公眾號 AppID 13 console.log(wxContext.FROM_APPID) 14 // 跨賬號調用時,由此拿到來源方小程序/公眾號的用戶 OpenID 15 console.log(wxContext.FROM_OPENID) 16 // 跨賬號調用、且滿足 unionid 獲取條件時,由此拿到同主體下的用戶 UnionID 17 console.log(wxContext.FROM_UNIONID) 18 19 return { 20 errCode: 0, 21 errMsg: '', 22 auth: JSON.stringify({ 23 // 自定義安全規則 24 // 在前端訪問資源方數據庫、雲函數等資源時,資源方可以通過 25 // 安全規則的 `auth.custom` 字段獲取此對象的內容做校驗, 26 // 像這個示例就是資源方可以在安全規則中通過 `auth.custom.x` 獲取 27 //x: 1, 28 }), 29 } 30 }
B端(需求方)操作
創建一個雲函數,用於請求A方資源,例如叫GetADB
將以下代碼寫入GetADB保存后同步,注意修改自己的配置信息
1 // 雲函數入口文件 2 const cloud = require('wx-server-sdk') 3 4 5 // 雲函數入口函數 6 exports.main = async (event, context) => { 7 8 // 聲明新的 cloud 實例 9 var c1 = new cloud.Cloud({ 10 // 資源方 AppID 11 resourceAppid: '修改為A的AppID', 12 // 資源方環境 ID 13 resourceEnv: '修改為A的環境ID', 14 }) 15 16 // 跨賬號調用,必須等待 init 完成 17 // init 過程中,資源方小程序對應環境下的 cloudbase_auth 函數會被調用,並需返回協議字段(見下)來確認允許訪問、並可自定義安全規則 18 await c1.init() 19 20 // 完成后正常使用資源方的已授權的雲資源 21 return new Promise(async (resolve, reject) => { 22 23 //多數報錯504002什么的,都是沒寫下面這段代碼,或者查詢的數據庫不存在導致 24 const db = c1.database() 25 await db.collection('數據庫名稱').limit(1000) 26 //查詢條件 27 .field({ 28 id: true 29 }) 30 .get() 31 .then(res => { 32 console.log('獲取-A數據庫-成功',res) 33 resolve(res.data) 34 }) 35 .catch(err => { 36 console.log('獲取-A數據庫-失敗',err) 37 reject(err) 38 }) 39 }) 40 41 }
測試請求
在小程序B調用自己的雲函數GetADB
1 async GetADB(){ 2 await wx.cloud.callFunction({ 3 name:'GetADB' 4 }) 5 .then(res=>{ 6 console.log(res); 7 }) 8 .catch(err=>{ 9 console.log(err); 10 }) 11 }
處理后的返回結果