容器内云调用
在微信云托管容器内,可以免鉴权(免维护 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。
订阅 用户在微信开发者工具云开发控制台创建容器服务版本时,可勾选开启 access_token 自动同步能力。
推送 用户开启后,微信开始定时周期性进行 access_token 推送,并确保推送成功,access_token 将被推送到用户云托管环境下用户资源中进行存储。access_token 有效期为30分钟,推送间隔为10分钟。
使用 用户云托管环境中的 access_token 将会以只读权限挂载到用户容器中,挂载路径为:/.tencentcloudbase/wx/cloudbase_access_token 。微信推送新的access_token后容器中的access_token会同步更新。用户可以读取 access_token 并在请求时放到请求参数上,用户需要主动在 access_token 更新后替换,如定时轮询文件或 watch 文件变化,或每次读取文件。
取消订阅 用户删除全部开启推送的版本后,取消订阅。
快速上手
下面的例子展示如何使用云托管结合消息推送,实现客服消息回复。
注意:需要先部署好以下的镜像,再在设置-其他设置-消息推送中,填入对应服务的路径和环境 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推送的使用
说明:推送的access_token都是资源方的(区别于客户端请求时header中附的access_token,header里的access_token都是调用方的)
- 服务商模式 从挂载文件中获取token,在token前拼接被共享环境的商家小程序的appid,用’@’作为分隔符,如wx3937f3caa95bee58@CIIBEoA…WVZM9yAA。将拼接好的字符串作为新cloudbase_access_token使用,新token的效果与authorizer_access_token一致,仅可以调用小程序授权给服务商的api(参考https://developers.weixin.qq.com/doc/oplatform/Third-party\_Platforms/api/api\_authorizer\_token.html)
- 小程序与公众号的环境共享(此场景下的资源方和被共享方必定是同主体) 使用方法同1,拼接生成的新token会被替换成前缀appid的token。
服务商的创建容器api现在也支持mount_wx_token参数了。