# 资源复用

很多业务情况下，我们需要在多个小程序或公众号中提供统一的后端服务；微信云托管目前支持将一个「小程序/小游戏/公众号」的云托管环境共享给**同主体**的其他「小程序/小游戏/公众号」。
设置资源复用时，被复用方 `不需要也开通` 微信云托管。即从理论上来说，同一个主体的多个小程序/公众号，只需开通一个云托管即可，避免创建过多账号。

## 操作指引

1. 前往[微信云托管控制台-资源复用](https://cloud.weixin.qq.com/cloudrun/settings/resource-reuse)页面，登录共享环境所在的账号。

![](https://res8.wxqcloud.qq.com.cn/wxdoc/0943ff97-36e2-449b-90ea-ec5f4b6c2756.png)

2. 点击右上角「关联」按钮，将会弹出对话框，在对话框中输入需要共享的账号 AppID，如果条件符合，将展示 logo 和名称用于确认。

![](https://res8.wxqcloud.qq.com.cn/wxdoc/50fbba42-af8f-4400-99b1-174cd7556e1c.png)

3. 另外，选择共享的环境，可以选择多个，确认信息后点击「确定」按钮。

4. 关联中会弹出管理员扫码确认框，需要当前账号下的微信管理员扫码确认方可。

5. 确认完成后，将在列表中显示信息，你可以进行「配置」用于变更环境，也可以操作「解绑」解除复用关系。每项操作均需要管理员扫码确认。

6. 如需添加关联账号的相关开发者，可前往当前账号 MP 后台将相关开发者加为 Web 开发者/项目成员即可。

## 云端调试

共享环境后，在共享环境所在的服务中，云端调试可以切换账号主体，相应的就可以用指定账号发起调用测试，也可以复制关键代码直接用于开发。

![](https://res8.wxqcloud.qq.com.cn/wxdoc/6e9d2d0b-b06e-4321-bda9-27ac8882b459.png)

## 各端应用调用

资源复用下小程序中调用，需要在 `wx.cloud.init` 中填写环境来源的账号 AppID，

例如，小程序 A（AppID：WXAAA）的环境 `prod_001` 授权给 小程序 B（AppID：WXBBB），则应是如下：

``` js
const c1 = new wx.cloud.Cloud({
  resourceAppid: 'WXAAA', // 环境所属的账号 AppID
  resourceEnv: 'prod_001', // 微信云托管的环境ID
})
await c1.init()
await c1.callContainer({
  config: {
    env: 'prod_001', // 微信云托管的环境ID
  },
  path: '/xxx', // 填入业务自定义路径和参数，根目录，就是 / 
  method: 'POST', // 按照自己的业务开发，选择对应的方法
  header: {
    'X-WX-SERVICE': 'xxx', // xxx中填入服务名称（微信云托管 - 服务管理 - 服务列表 - 服务名称）
    // 其他header参数
  }
  // 其余参数同 wx.request
})
```

如果你在小程序中进行对象存储相关操作，请参考[对象存储文档](/miniprogram/dev/wxcloudservice/wxcloudrun/src/development/storage/miniapp/index)，参看资源复用章节

资源复用下公众号中调用，请参考[公众号调用文档](/miniprogram/dev/wxcloudservice/wxcloudrun/src/development/call/h5)

## 资源复用下的开放接口调用

使用资源复用进行[开放接口调用](/miniprogram/dev/wxcloudservice/wxcloudrun/src/guide/weixin/open)时，需要额外携带调用方的 AppID 信息进行调用，示例如下。

``` bash
# 原接口形式
api.weixin.qq.com/wxa/getwxadevinfo

# 资源复用的形式
api.weixin.qq.com/wxa/getwxadevinfo?from_appid=APPID
```

如果没有携带 `from_appid`，默认会以调用方的身份去进行服务端调用。建议在业务代码内判断需要的资源方身份，并在调用时显式携带 `from_appid` 参数。

如果请求来自小程序，可以将用户请求中的 `x-wx-from-appid` 透传至 `api.weixin.qq.com` 的接口参数中，参考代码如下：

```js
return new Promise((resolve, reject) => {
  request({
    method: 'POST',
    url: `http://api.weixin.qq.com/wxa/msg_sec_check?from_appid=${req.headers['x-wx-from-appid']}`,
    body: JSON.stringify({
      openid: req.headers['x-wx-openid'],
      version: 2,
      scene: 2,
      content: '安全检测文本'
    })
  },function (error, response) {
    console.log('接口返回内容', response.body)
    resolve(JSON.parse(response.body))
  })
})
```

## 资源复用情况下使用微信支付

请参考[此文档](../weixin/pay#%E8%B5%84%E6%BA%90%E5%A4%8D%E7%94%A8%E6%83%85%E5%86%B5%E4%B8%8B%E9%85%8D%E7%BD%AE)

## 资源复用情况下消息推送的使用

请参考[此文档](../weixin/push#%E8%B5%84%E6%BA%90%E5%A4%8D%E7%94%A8%E9%85%8D%E7%BD%AE)

## 使用限制

1. 当前仅支持小程序、小游戏、公众号、小商店的账号间资源复用。

2. 不支持第三方平台、开放平台 WEB 网站等其他账号类型的复用。
第三方平台的账号授权请参照[服务商模式](/doc/oplatform/openApi/cloudrun-batch/cloudenv-mgnt/api_sharecloudbaseenv.md)

3. 即使 `A小程序` 和 `B小程序`/`B公众号` 设置了资源复用，在使用云调用时，也不可以以 `A小程序` 身份使用 `B小程序`/`B公众号` 的微信令牌。
