小程序环境共享入门/跨账号环境调用
发布于 4 年前 作者 vlin 2375 次浏览 来自 分享

先上文档:官方文档

一般碰到问题比较多的是怎么起步,

!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格式解决。
现在还剩如何直接操作【资源方】云数据库。保底方案是通过云函数绕过去

1 回复

我也想问为什么不能显示资源方的图片

回到顶部