# 怎样操作可以让多个不同主体小程序/公众号使用同一个账号

云托管、云开发环境背后依赖一个腾讯云账号提供底层资源,在操作时,会给每个小程序/公众号背后都开通一个腾讯云账号。

这种情况下自己名下的腾讯云账号就非常多了,在统一管理统一计费方面都会有很大的负担。

如果你想让若干个不同主体的小程序或公众号使用一个腾讯云账号中的环境资源,可以使用微信开放平台第三方服务商的形式。

在开始之前需要简单说明一下:

  1. 如果你的小程序/公众号属于同一个主体,可以直接使用「云托管/云开发」的资源复用能力,不需要一定要使用服务商形式。
  2. 使用服务商批量代开发,一个环境也只能授权给同主体的小程序/公众号,不能实现一个环境可以共同支持多个主体(这是由隐私政策决定的)
  3. 服务商批量代开发相比资源复用的优势为,可以同时为多个不同主体提供统一的云资源(腾讯云账号唯一),同时减少费用管理等负担。
  4. 如果你是企业用户,并且将来很可能进行横向发展,直接采用服务商批量模式会更加有优势。

充分了解后,根据自己的情况选择最合适的,如果你确定采用第三方服务商的形式,请参照下面步骤:

# 一、 注册微信开放平台

访问微信开放平台,按照指引注册一个开放平台账号,账号主体尽量选择企业,如果没有企业就个人可以。

# 二、 开通平台型服务商

注册完毕后,按照指引步骤,开通一个「平台型服务商」

需要注意开发模式一定要选择传统模式,不要勾选云服务模式。

# 三、开通云服务

新建完成平台型服务商后,转到「云服务」TAB页,点击「开通」按钮

第一次需要管理员进行扫码核验及微信绑定,绑定完成后再次点击「开通」按钮,会再次进行管理员身份核验实名认证。

认证完成后再次点击「开通」按钮,会弹出开通云服务界面,如果你是第一次创建平台型服务商,可以选择「关联腾讯云账号」

若你之前有过平台型服务商了,可以选择「使用已有第三方平台账号」

如果选择「关联腾讯云账号」,点击开通后会跳转到腾讯云授权页面,在这里建议选择自己最常用的腾讯云账号,并且这个账号没有被任何「小程序/小游戏/小商店/公众号/第三方平台」绑定,如果有绑定可以解除绑定然后再做授权操作。

授权完成后页面显示如下:

# 四、创建云开发/云托管环境

微信云托管可以直接从「云服务」TAB中,点击云托管「立即前往」打开控制台,也可以通过接口创建。

由于微信云开发环境没有WEB端的控制台,所以可以直接使用接口创建。

接口调用中需要的token,需要按照第三方平台API接入流程-前2步获取。

如果你觉得这个比较麻烦,那可以用服务商管家(云服务模式),获取TOKEN参考此文档

如果你觉得服务商管家模式也是比较麻烦,你可以前往云托管控制台创建一个环境,然后随便建立一个服务,在webshell中获取cloudbase_access_token,具体按照此文档进行

另外你可以直接跳转到腾讯云,在云开发Cloudbase控制台查看所有环境。

# 五、将环境授权给小程序/公众号使用

无论是云托管/云开发环境,均可以使用此接口完成绑定

-将一个环境授权给多个小程序/公众号

需要注意环境共享需满足以下条件:

  • 同一个环境仅可用于同主体的小程序/公众号使用。
  • 一个小程序/公众号可以被多个第三方平台的多个环境授权
  • 云开发/云托管环境遵循的规则一致。
  • 环境共享只要同主体满足,不需要明确的授权也可以完成绑定,绑定后小程序可以访问环境的资源。

# 六、环境可以以小程序/公众号身份调用其接口

如果环境中的业务操作,需要调用微信API接口,则必须要进行小程序/公众号的授权,授权对应权限集后,才可以使用相应API接口权限。

传统情况下,以小程序/公众号身份调用API接口,可以使用第三方平台API接入流程获取authorizer_access_token,接口的access_token需传入获取的authorizer_access_token。

云开发环境可以直接在云函数中,传入小程序/公众号appid来实现,如下面代码:

cloud.openapi({ appid: '小程序/公众号APPID' }).subscribeMessage.send({ 
  touser: cloud.getWXContext().FROM_OPENID
})

云托管环境如果使用开放接口服务,可以直接在接口传get参数from_appid,效果如下:

return new Promise((resolve, reject) => {
  request({
    method: 'POST',
    url: `http://api.weixin.qq.com/wxa/msg_sec_check?from_appid=${小程序/公众号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))
  })
})

不实用开放接口服务,在容器实例 /.tencentcloudbase/wx/cloudbase_access_token 路径中拿到 cloudbase_access_token 后,按照下面的示例调用。

# 假设取出来的 cloudbase_access_token 为 AAAAAAAAAA
return new Promise((resolve, reject) => {
  request({
    method: 'POST',
    url: `http://api.weixin.qq.com/wxa/msg_sec_check?cloudbase_access_token=${小程序/公众号APPID}@AAAAAAAAAA`,
    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))
  })
})

有很多同学直接从小程序/公众号中拿到secertKey放到项目中进行原始开发(也称定制化开发),不走第三方服务商授权这一条路,这个可行,看自己的业务需要选择,我们不持任何建议态度。

需要注意的是,在出现违规违法行为时,原始定制化开发模式中微信保留的操作人为小程序/公众号主体自己,而不是第三方服务商,需要自行承担法律风险。

服务商模式下,出现违规行为时,承担风险的主体负责人为服务商。小程序/公众号管理者在明确责任归属后,自行授权确认。