一文揭开云调用的神秘面纱

云调用是云开发推出的一个帮助开发者简化开发的工具,我一直都很喜欢,鉴于不少同学都够搞不清楚云调用的价值所在,因此,今天便写一篇文章,来聊一聊云调用。

什么是「云调用」

据官方所言,「云调用是云开发提供的基于云函数使用小程序开放接口的能力」,这句话里有两个关键词:

  1. 云函数:云调用的一切操作都与云函数有关,你想要使用云调用,就一定要使用云函数。
  2. 小程序开放接口:云调用仅仅适用于一些小程序开放接口,而不是所有的接口,因此,你自己在使用的时候,需要考虑到,并不是所有的接口都能够使用云调用,仅仅是和微信小程序相关的一些开放接口支持云调用,具体的清单你可以在 这里 查到,所有后续标注了云调用的 API,都可以通过云调用来调取。

云调用的核心

如果说云调用和我们自己请求有什么不同,最大的核心莫过于提供了由官方维护的 AccessToken 和 Session Key 的机制,这种机制,可以让开发者简化自己的代码,将更多精力投放在产品研发的过程中。

云调用的三种形态及其应用场景

云调用在实际使用过程中共有三种不同的场景,分别是:

  1. 服务端调用
  2. 开放数据调用
  3. 消息推送

服务端调用

服务端调用就是在云函数中直接调用,这种调用大多是设计到核心业务逻辑的调用,举个例子:发送模板消息。

在没有云调用之前,我们想要发送模板消息,你需要以下几个步骤

  1. 在云函数中按照 got/request 等发送 http 请求的包
  2. 调用小程序的 auth.getAccessToken 接口,生成一个 AccessToken
  3. 调用小程序的 templateMessage.send 接口,发送模板消息

如果写成伪代码,大概就是这样的

1
2
3
4
5
6
7
8
9
const got = require('got');
const cloud = require('wx-server-sdk')

cloud.init()
exports.main = async (event, context) => {
let tres = await got('token url')
let templateRes = await got('templatemsg url')
return ok
}

我们可以看到核心的代码就是其中一个获取 token ,一个发送模板消息。

而我们如果换成云调用以后,就会简单一些:

  1. 配置云调用中 API 的调用权限
  2. 在云函数中使用云调用发起请求

同样的,换成伪代码,是这样的

1
2
3
4
5
6
7
const cloud = require('wx-server-sdk')

cloud.init()
exports.main = async (event, context) => {
const result = await cloud.openapi.templateMessage.send()
return ok
}

你会发现,如果我们使用云调用以后,相关的调用就从两步变成了一步。这是云调用非常重要的一部分工作,那就是其自行维护了 AccessToken,减轻了开发者的压力。

这对于开发者来说,是一个省事又省心的工作,AccessToken 本身存在过期的问题,每次使用前需要判断之前的 AccessToken 是否过期,这样的方式会让开发者降低自己的开发成本,将自己的精力投放在业务逻辑相关的开发上。

开放数据调用

基于安全的考虑,小程序的部分接口在返回数据时不会将所有的数据都以明文的形式返回回来,而是会有一部分数据会经过加密传递到小程序端,这个时候,你需要拿这个数据到服务器的后台,进行解密。

在解密时涉及到一个你在请求 AccessToken 时会获取到的值 session-key, 在官方的解密说明中明确提到,你需要以当前最新的 session key来进行数据解密,这就要求你自行维护 session-key,增加了开发者的负担。

而开放数据调用则提供了不同的方案,如果你使用开放数据调用,你可以直接使用调用接口返回的 CloudID来完成数据请求。你只需要在调用时使用 wx.cloud.CloudID 来初始化对象,就可以在对应的云函数中完成数据解密的操作。

比如说,你在小程序中这样去调用,

1
2
3
4
5
6
wx.cloud.callFunction({
name: 'myFunction',
data: {
weRunData: wx.cloud.CloudID('xxx')
}
})

那么在云函数中就可以直接在 event.weRunData 中拿到数据,就像这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
// weRunData 的值已被替换为开放数据
"weRunData": {
"cloudID": "xxx",
"data": {
"stepInfoList": [
{
"step": 5000,
"timestamp": 1554814312,
}
],
"watermark": {
"appid": "wx1111111111",
"timestamp": 1554815786
}
}
},
}

开放数据调用的模式,对于一些不是很熟悉数据加解密的同学来说,可以更快更简单的完成数据的解密操作,从而提升自己的开发效率。

消息推送

在我们使用小程序的时候,有些时候会使用到客服消息,对于使用了云开发的用户来说,没有自建的服务器,也就没办法去维护一个机器人系统。不过,云调用提供的消息推送能力,让你可以在云函数中实现诸如自动回复等功能。

在使用时你需要先在开发者工具云开发控制台中增加配置,然后,就可以在对应的云函数中编写函数,来进行消息的处理即可。

一段典型的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const cloud = require('wx-server-sdk')

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()

await cloud.openapi.customerServiceMessage.send({
touser: wxContext.OPENID,
msgtype: 'text',
text: {
content: '收到',
},
})

return 'success'
}

云调用的定位

我在很早之前就对云开发的定位有过描述,云开发是适应时代变迁下最好的工具,他可以辅助小的团队快速完成迭代,帮助一个个小的个体完成自己的业务。

而云调用,使得云开发的门槛更近一步的降低,对于开发者来说,可以以更低的成本完成自己的业务,更快的通过小程序,完成自己的业务目标。

总结

云调用的出现,是对于开发者而言是一大利好,借助这种官方 SDK 自行维护的 AccessToken 和 SessionKey 的状态,开发者可以更快更简单的完成自己的业务逻辑开发,实现自己的小梦想、小目标。