容器内云调用

在微信云托管容器内,可以免鉴权(免维护 access_token)发起服务端接口调用,支持所有服务端接口(列表一览)。

调用方式

在容器内收到微信链路上来的请求时,在请求头部会有临时 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"]
}

快速上手

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

注意:需要先部署好以下的镜像,再在设置-其他设置-消息推送中,填入对应服务的路径和环境 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"> 类型的按钮唤起客服会话,发送任意消息即可看到云托管处理的回复。