# 容器内云调用

在微信云托管容器内,可以免鉴权(免维护 access_token)发起服务端接口调用,支持所有服务端接口(列表一览)。有两种调用方式:header中获取、定时推送。

# 调用方式

# 方式一:header中获取

在容器内收到微信链路上来的请求时,在请求头部会有临时 access_token,使用此 access_token 即可以 HTTP 形式发起所有服务端接口调用,但在 HTTP 请求时 url 参数需传入 cloudbase_access_token 而不是 access_token。在容器收到请求时将收到如下两个特殊头部:

header 说明
X-WX-CLOUDBASE-ACCESS-TOKEN 临时 access_token(资源方身份)
X-WX-FROM-CLOUDBASE-ACCESS-TOKEN 临时 access_token(来源方身份,跨账号调用时有)
# 示例

cloudbase.getOpenData通过 cloudID 换取开放数据的接口为例:

所有 HTTP 服务端接口的 URL 参数可接受传入 access_token 或 cloudbase_access_token,在容器中,只需从 header 中取得 token 然后作为 cloudbase_access_token 参数的值即可,构造的请求示例如下:

POST https://api.weixin.qq.com/wxa/getopendata?openid=OPENID&cloudbase_access_token=TOKEN

Request Body:

{
  "cloudid_list": ["39_JeXrSGN2VA0oq32eDIrs4Ww_H-8uK0NkGYZ5RMYmFhpoyJUoCx2oRU7qzuQ"]
}

# 方式二:定时推送

新建云托管服务版本时,开启云调用令牌,开启后将定时推送access_token。

  1. 订阅 用户在微信开发者工具云开发控制台创建容器服务版本时,可勾选开启 access_token 自动同步能力。

  2. 推送 用户开启后,微信开始定时周期性进行 access_token 推送,并确保推送成功,access_token 将被推送到用户云托管环境下用户资源中进行存储。access_token 有效期为30分钟,推送间隔为10分钟

  3. 使用 用户云托管环境中的 access_token 将会以只读权限挂载到用户容器中,挂载路径为:/.tencentcloudbase/wx/cloudbase_access_token 。微信推送新的access_token后容器中的access_token会同步更新。用户可以读取 access_token 并在请求时放到请求参数上,用户需要主动在 access_token 更新后替换,如定时轮询文件或 watch 文件变化,或每次读取文件。

  4. 取消订阅 用户删除全部开启推送的版本后,取消订阅。

# 快速上手

下面的例子展示如何使用云托管结合消息推送,实现客服消息回复。

注意:需要先部署好以下的镜像,再在设置-其他设置-消息推送中,填入对应服务的路径和环境 ID。

const express = require('express')
const bodyParser = require('body-parser')
const axios = require('axios')

const PORT = process.env.PORT || 80
const HOST = '0.0.0.0'

// App
const app = express()

app.use(bodyParser.raw())
app.use(bodyParser.json({}))
app.use(bodyParser.urlencoded({ extended: true }))

const client = axios.default

app.all('/', async (req, res) => {
    const headers = req.headers
    const token = headers['x-wx-cloudbase-access-token']
    const weixinAPI = `https://api.weixin.qq.com/cgi-bin/message/custom/send?cloudbase_access_token=${token}`
    const payload = {
        touser: headers['x-wx-openid'],
        msgtype: 'text',
        text: {
            content: `云托管接收消息推送成功,内容如下:\n${JSON.stringify(req.body, null, 2)}`
        }
    }
    // dispatch to wx server
    const result = await client.post(weixinAPI, payload)
    console.log('received request', req.body, result.data)
    res.send('success')
});

app.listen(PORT, HOST)
console.log(`Running on http://${HOST}:${PORT}`)

配置成功后,使用 <button open-type="contact"> 类型的按钮唤起客服会话,发送任意消息即可看到云托管处理的回复。

# 环境共享场景下access_token推送的使用

从header中获取的access_token是属于调用方的,从定时推送中获取的access_token是属于资源方的。若要使用定时推送的方式获取的access_token发起被共享环境账号的调用,需要进行Token的拼接。具体方式如下:

从挂载文件中获取token,在token前拼接被共享环境的小程序的appid,用’@‘作为分隔符,如wx3937f3caa95bee58@CIIBEoA…WVZM9yAA。将拼接好的字符串作为新cloudbase_access_token使用。

说明:

  1. 服务商模式下,拼接成的cloudbase_access_token与authorizer_access_token效果一致,仅可以调用小程序授权给服务商的api。
  2. 同主体小程序与公众号环境共享模式下,拼接生成的新token与前缀Appid的access_token效果一致。