容器内云调用

在微信云托管容器内,可以免鉴权(免维护 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 参数的值即可,构造的请求示例如下:

  1. POST https://api.weixin.qq.com/wxa/getopendata?openid=OPENID&cloudbase_access_token=TOKEN
  2. Request Body:
  3. {
  4. "cloudid_list": ["39_JeXrSGN2VA0oq32eDIrs4Ww_H-8uK0NkGYZ5RMYmFhpoyJUoCx2oRU7qzuQ"]
  5. }

方式二:定时推送

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

  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。

  1. const express = require('express')
  2. const bodyParser = require('body-parser')
  3. const axios = require('axios')
  4. const PORT = process.env.PORT || 80
  5. const HOST = '0.0.0.0'
  6. // App
  7. const app = express()
  8. app.use(bodyParser.raw())
  9. app.use(bodyParser.json({}))
  10. app.use(bodyParser.urlencoded({ extended: true }))
  11. const client = axios.default
  12. app.all('/', async (req, res) => {
  13. const headers = req.headers
  14. const token = headers['x-wx-cloudbase-access-token']
  15. const weixinAPI = `https://api.weixin.qq.com/cgi-bin/message/custom/send?cloudbase_access_token=${token}`
  16. const payload = {
  17. touser: headers['x-wx-openid'],
  18. msgtype: 'text',
  19. text: {
  20. content: `云托管接收消息推送成功,内容如下:\n${JSON.stringify(req.body, null, 2)}`
  21. }
  22. }
  23. // dispatch to wx server
  24. const result = await client.post(weixinAPI, payload)
  25. console.log('received request', req.body, result.data)
  26. res.send('success')
  27. });
  28. app.listen(PORT, HOST)
  29. console.log(`Running on http://${HOST}:${PORT}`)

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

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

说明:推送的access_token都是资源方的(区别于客户端请求时header中附的access_token,header里的access_token都是调用方的)

  1. 服务商模式 从挂载文件中获取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)
  2. 小程序与公众号的环境共享(此场景下的资源方和被共享方必定是同主体) 使用方法同1,拼接生成的新token会被替换成前缀appid的token。

服务商的创建容器api现在也支持mount_wx_token参数了。