触发器

触发器(Trigger)是知晓云平台的事件驱动引擎,配置好事件源和触发动作,引擎就会在事件发生时自动触发动作。例如,触发器 A 的事件源是数据表新增了数据,触发动作是发送短信给管理员,那么当新增数据时,引擎就会触发短信的发送。使用触发器,可以将复杂的业务流程串联起来,形成自动化的处理机制,大大简化开发。

触发器配置

触发器配置触发器配置

触发类型:即触发源,每个触发器都只能选定一种触发类型,不同的触发类型可执行的动作选项也不一样。知晓云目前支持的触发类型有:数据表微信支付回调定时任务文件操作IncomingWebhook微信消息推送支付宝支付回调

执行状态:用于控制触发器的开关,默认为开启。

条件

触发器条件触发器条件

当选定触发类型后,开发者需要指定触发条件来触发后续动作的执行,触发条件与触发类型一一相关,详见触发类型 & 条件示例

动作

触发器动作触发器动作

动作是在满足触发条件后会被执行的具体事件,开发者可以同时为一个触发器配置多个动作。

不同的触发类型对应可选的动作类型不同,具体如下表所示:

动作类型↓ \ 触发类型→数据表微信支付回调定时任务文件操作IncomingWebhook微信消息推送支付宝支付回调
发送邮件Y️YYYYYY
发送微信模板消息Y️Y️YYYYY
发送 webhookY️Y️NYYYY
操作数据表Y️Y️NYYYY
执行云函数Y️YYYYYY
发送支付宝模板消息Y️YYYYYY
发送 QQ 模板消息Y️YYYYYY
发送短信Y️YYYYYY

触发频率

触发频率触发频率

用于决定触发器被多次触发的情况下是否每一次都执行动作。你可以在每一条动作设置中进行。配置应用场景如:余额不足的预警短信每天执行一次/支付成功通知每次都会执行。

触发频率说明
可重复触发每一次满足触发条件时都会执行该动作
间歇性触发该动作执行一次后某段时间内不会再被触发执行
仅触发一次该动作执行一次后不会再被触发执行

模板变量

模板变量是开发者可以在触发器某些动作中自定义的参数,如收货通知中的「产品名称」或「地址信息」。

可选变量:你可以将鼠标移至动作类型右侧的「查看范例」来查看当前动作可以使用的变量。

模板变量模板变量

模板变量的使用规则如下:

如需插入变量,请按照{{变量名}}的形式插入到邮件文本中。例:您购买的产品{{product}}已经发货,请注意查收。

如需插入微信用户信息,请输入{{created_by.*}}。例:尊敬的{{created_by.nickname}},您购买的产品{{product}}已经发货,请注意查收。

对于 date 类型的变量,可以自定义输出的格式,格式为 {{created_at | date:"format"}},其中 format 为输出的格式,例如需要 2017-09-20 16:05:14 这样的输出格式,变量的格式为 {{created_at | date:"Y-m-d H:i:s"}},具体 format 的意义可参考「date 格式参数说明

对于 object 类型,可以输入 {{<OBJECT_FIELD>.<PROP_NAME>[.<PROP_NAME>]}} 格式,例如 {{obj.name}}{{obj.foo.bar}}

基础操作

创建触发器

创建触发器创建触发器

点击左边栏「添加」按钮即可开始添加一个新的触发器。依据操作流程依次填写触发器配置、条件、动作即可。

开启/关闭触发器

开启/关闭触发器开启/关闭触发器

你可以在触发器配置中编辑触发器的执行状态来开启或关闭触发器。

编辑触发器

编辑触发器编辑触发器

点击设置卡片右上角的「编辑」按钮即可开始编辑触发器,注意编辑完成后需要点击「保存」触发器才会被更新。

删除触发器

删除触发器删除触发器

将光标移动到左侧栏对应触发器上,点击删除图标即可。

查看触发器日志

查看触发器日志查看触发器日志

点击触发器配置卡片右上角的「日志」按钮,即可查看触发器的执行日志。目前仅会保存 180 天内的日志记录。

校验模板变量

校验模板变量校验模板变量

在可以插入模板动作卡片的地步有一个「模板校验」按钮,点击后可以检查开发者填写的变量信息是否被正确识别。

触发类型 & 条件示例

数据表

数据表数据表

指定的数据表发生变化后触发(增、删、改):

事件类型说明
create数据行被创建时触发
update数据行被更新时触发
delete数据行被删除时触发

开发者可以为数据表变化指定一个或多个条件:

满足条件说明
任一OR 满足任一条件
所有AND 同时满足所有条件

不同的数据类型支持的操作符如下所示:

数据类型操作符
arraycontains, isempty
boolean=, !=, isempty
date=, !=, >, >=, <, <=, isempty, range
integer=, !=, >, >=, <, <=, isempty, range
number=, !=, >, >=, <, <=, isempty, range
stringregex, =, !=, isempty
objecthas_key, isempty
pointer=, !=

定时任务

定时任务定时任务

根据 cron 规则周期性的触发。使用规则请查看 cron 表达式简介

注:触发周期最小时间粒度为 1 分钟

文件操作

文件操作文件操作

指定操作(文件上传、文件删除、图片违规校验)成功或失败时触发。

IncomingWebhook

IncomingWebhookIncomingWebhook

用户直接访问特定的 URL,也可以通过 Ajax 方式发起一个请求。

详细说明:支持的 HTTP 方法有 GET, POST, PUT, PATCH, DELETE;请求体只支持 JSON 数据,支持自定义 http header, 但是必须以 XHYDROGEN 开头,全部会被转换为大写,此外如自定义 HTTP 头中包含 -会被转换为 _。

速率限制: 每个小程序 5 QPS。

提交示例:

  1. POST /oserve/v1/incoming-webhook/7YnQmaClzc/ HTTP/1.1
  2. Host: cloud.minapp.com
  3. Content-Type: application/json
  4. Customize-Header: hello
  5. {
  6. "hello": "incoming-webhook"
  7. }

返回示例:

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json;charset:utf-8
  3. {
  4. "status": "ok"
  5. }

对应触发器日志:

  1. {
  2. "_id": 0,
  3. "meta": {
  4. "headers": {
  5. "CONTENT_LENGTH": 3,
  6. "CONTENT_TYPE": "application/json",
  7. "HOST": "cloud.minapp.com",
  8. "X_HYDROGEN_CUSTOMIZE_HEADER": "hello"
  9. },
  10. "remote_address": "1.1.1.1",
  11. "request_method": "POST",
  12. },
  13. "payload": {
  14. "hello": "incoming-webhook"
  15. }
  16. }

微信消息推送

微信消息推送微信消息推送

当用户在小程序中向开发者发送客服消息的时候,开发者可判断消息关键词是否满足条件来决定是否执行动作。

设置条件触发器参数规则请参考微信文档

微信支付回调

微信支付回调微信支付回调

当用户使用微信支付支付成功时,可以触发指定动作。

支付宝支付回调

支付宝支付回调支付宝支付回调

当用户使用支付宝支付支付成功时,可以触发指定动作。

QQ 支付回调

QQ 支付回调QQ 支付回调

当用户使用 QQ 支付支付成功时,可以触发指定动作。

动作示例

发送邮件

发送邮件发送邮件

收件人、邮件标题、邮件内容均可使用模板变量,其中可选变量可以将鼠标移至动作类型右侧的「查看范例」来查看。

发送微信模板消息

发送微信模板消息发送微信模板消息

发送微信模板消息前需要先完成小程序授权并添加消息模板,并完成 formid 收集

收件人支持类型如下:

收件人说明
消息创建人触发当前动作的用户,只能是单个用户
指定用户指定某一批用户,开发者需要设置用户查询条件来筛选用户。当收件人为指定用户时,建议使用智能过滤服务,实现精准发送
指定用户组选定的用户分组,常用于管理员或 VIP 分组

发送策略:短时间内大量发送模板消息容易导致模板消息被封,建议单次发送条数小于 5000 条,每次发送间隔大于 5 分钟。

注:发送微信模板消息时,pointer 数据不进行数据展开,即模板变量中 pointer 只能获取到对应数据 ID。

发送 WebHook

发送 WebHook发送 WebHook

该动作会向指定 URL 发送一个 POST 请求。

执行动作时,服务器发送请求参数如下:

请求 Headers

请求头部说明
X-Hydrogen-Webhook-Action-Id本次触发器触发动作的 uuid,webhook 重试时此 id 保持不变
X-Hydrogen-Trigger-Eventon_create, on_update, on_delete

请求 Body

请求 Body 为一个 JSON Web Tokens 的文本,需要开发者自己去验证并解码,可以在这里在线调试 jwt

示例:

  1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiMTIzIn0.FGhYH5IF-PkNV8b4SNh-1WKwV8h-Gj8JYVlXmUdCGs8

若触发类型为数据表,则请求 Body 解码后为数据行内容,示例如下:

  1. {
  2. _read_perm: [ 'user:*' ],
  3. name: '1',
  4. created_at: 1517970094,
  5. updated_at: 1517970094,
  6. created_by: 35674431,
  7. _write_perm: [ 'user:35674431' ],
  8. id: '5a7a62aefff1d610ab2ddb10'
  9. }

数据行内容根据 event 类型有所差别,具体差异如下

event 类型请求 Body
on_create创建后的数据行信息
on_update更新后的数据行信息
on_delete被删除的数据行的原信息

若触发类型为微信支付回调,则请求 Body 解码后为微信支付结果。示例如下:

  1. { trade_no: '5a7a695008443e1a69e1a06a',
  2. transaction_no: '5a7a695008443e1a69e1a06a',
  3. merchandise_description: 'test',
  4. merchandise_snapshot: {},
  5. merchandise_schema_id: 1,
  6. merchandise_record_id: '5a7a695008443e1a69e1a06a',
  7. status: 'success',
  8. refund_status: null,
  9. ip_address: '127.0.0.1',
  10. created_by_id: 123,
  11. paid_at: 1517970094 }

操作数据表

操作数据表操作数据表

批量修改指定的数据表的数据行。

数据表操作动作的一些参数说明如下:

操作被触发时动作说明
创建创建一行数据
更新修改符合条件的数据行,需要配置查询条件,筛选出指定的数据行。数据表查询条件相关文档请参考这里
删除删除符合条件的数据行,需要配置查询条件,筛选出指定的数据行。数据表查询条件相关文档请参考这里

注:若使用类型为 object 的模板变量来进行赋值,则被赋值的字段必须为 string 类型。例如:在动作中赋值给 _userprofile 表的 gender 字段是错误的,只能赋值给 nickname 等 string 类型的字段。

目前赋值操作支持的数据类型及其对应的操作符如下:

数据类型操作符
array=, append, append_unique, remove
boolean=
date=
integer=, inc_by
number=, inc_by
string=
geojson=

注:append, append_unique, remove, inc_by 为原子操作符,相关文档请参考这里

执行云函数

不同的触发类型下的云函数动作被触发时,云函数接收到的 event.data 参数内容也会有所不同。以下为参数的具体内容说明:

定时任务vent.data 参数为空。

IncomingWebhookevent.data 参数请求信息,参考 IncomingWebhook 小节。

数据表event.data 参数为数据表记录,File 类型的数据可以直接赋值给数据表 File 类型的字段。数据类型信息请查看数据表中支持的数据类型

示例:

  1. {
  2. "id": "5d76230f1db94f6cf2aa7ae1",
  3. "num": 1314.52,
  4. "int": 520,
  5. "str": "This is a string.",
  6. "bool": false,
  7. "date": "2019-09-09T17:56:38.758000+08:00",
  8. "file": {
  9. "cdn_path": "1g50PgtbHMNWFntB.png",
  10. "path": "https://cloud-minapp-0000.cloud.ifanrusercontent.com/1g50PgtbHMNWFntB.png",
  11. "created_at": 1537932176,
  12. "id": "5baafb906e73240d2acfb67e",
  13. "mime_type": "image/png",
  14. "name": "file1.png",
  15. "size": 105224
  16. },
  17. "object": {
  18. "key": "value"
  19. },
  20. "pointer_userprofile": {
  21. "_table": "_userprofile",
  22. "id": 88950987673979
  23. },
  24. "geo_polygon": "{\"coordinates\": [[[10.123, 10], [20.12453, 10], [30.564654, 20], [20.654, 30], [10.123, 10]]], \"type\": \"Polygon\"}",
  25. "geo_point": "{\"coordinates\": [10.123, 8.543], \"type\": \"Point\"}",
  26. "array_geo": [
  27. "{\"coordinates\": [10.123, 8.543], \"type\": \"Point\"}",
  28. "{\"coordinates\": [10.123, 8.543], \"type\": \"Point\"}"
  29. ],
  30. "array_bool": [
  31. true,
  32. false
  33. ],
  34. "array_integer": [
  35. 1,
  36. 2
  37. ],
  38. "array_string": [
  39. "This is a string."
  40. ],
  41. "array_date": [
  42. "2018-12-04T16:59:37.153000+08:00",
  43. "2018-12-03T16:52:44.413000+08:00",
  44. "2018-12-02T16:52:40.023000+08:00",
  45. "2018-12-01T16:52:36.028000+08:00"
  46. ],
  47. "array_number": [
  48. 1314.52,
  49. 520.1314
  50. ],
  51. "array_object": [
  52. {
  53. "key1": "value"
  54. },
  55. {
  56. "key1": "value"
  57. }
  58. ],
  59. "array_file": [
  60. {
  61. "cdn_path": "1g50PgtbHMNWFntB.png",
  62. "path": "https://cloud-minapp-0000.cloud.ifanrusercontent.com/1g50PgtbHMNWFntB.png",
  63. "created_at": 1537932176,
  64. "id": "5baafb906e73240d2acfb67e",
  65. "mime_type": "image/png",
  66. "name": "file1.png",
  67. "size": 105224
  68. }
  69. ],
  70. "array_geomars": [
  71. "{\"coordinates\": [10.123, 8.543], \"type\": \"Point\"}",
  72. "{\"coordinates\": [10.123, 8.543], \"type\": \"Point\"}"
  73. ],
  74. "array_geoearth": [
  75. "{\"coordinates\": [10.123, 8.543], \"type\": \"Point\"}",
  76. "{\"coordinates\": [10.123, 8.543], \"type\": \"Point\"}"
  77. ],
  78. "updated_at": 1568023357,
  79. "created_by": 62689516,
  80. "created_at": 1568023260,
  81. "_write_perm": [
  82. "user:anonymous"
  83. ],
  84. "_read_perm": [
  85. "user:anonymous"
  86. ]
  87. }

支付回调event.data 参数为订单记录。

字段字段名类型枚举值
id订单记录 IDinteger不可枚举
miniapp小程序 IDinteger不可枚举
gateway_type支付类型string枚举值见表格下方
currency_type货币类型string人民币:CNY
trade_no订单号string不可枚举
transaction_no流水号string不可枚举
status支付状态string待支付:pending,支付失败:failed,支付成功:success
refund_status退款状态string退款成功:complete, 部分退款:partial
merchandise_schema_id表 IDinteger不可枚举
merchandise_record_id记录 IDinteger不可枚举
merchandise_description商品描述string不可枚举
merchandise_snapshot商品快照object不可枚举
total_cost金额number不可枚举
ip_address发起订单的 IP 地址string不可枚举
paid_at支付时间(时间戳)integer不可枚举
created_by创建者(支付用户)IDinteger不可枚举
created_at创建时间(时间戳)integer不可枚举
updated_at最近一次更新时间(时间戳)integer不可枚举

gateway_type 枚举值:

  • 微信支付回调:

    • 微信小程序:weixin_tenpay
    • 微信 H5:weixin_tenpay_wap
    • 微信 Native:weixin_tenpay_native
    • 微信 App:weixin_tenpay_app
    • 微信 JSAPI:weixin_tenpay_js
  • 支付宝支出回调:

    • 支付宝小程序:alipay
    • 支付宝手机网页:alipay_wap
    • 支付宝网页:alipay_page
    • 支付宝移动:alipay_app
  • QQ 支付回调:

    • QQ 小程序:qpay
    • QQ Native:qpay_native

示例:

  1. {
  2. "trade_no": "1i7HJ1t6UZdyQ2fLNHrgDQHQrlbgm2g8",
  3. "status": "success",
  4. "merchandise_record_id": null,
  5. "gateway_type": "weixin_tenpay",
  6. "refund_status": null,
  7. "currency_type": "CNY",
  8. "merchandise_snapshot": {},
  9. "created_at": 1568026439,
  10. "updated_at": 1568026488,
  11. "merchandise_schema_id": null,
  12. "transaction_no": "lVBtmjssROOwbLraez5WpeGKFmfcbK2w",
  13. "total_cost": 0.01,
  14. "created_by": 83909082304832,
  15. "merchandise_description": "一条支付描述",
  16. "miniapp": 7894,
  17. "ip_address": "14.17.86.113",
  18. "id": "1i7HJ1t6UZdyQ2fLNHrgDQHQrlbgm2g8",
  19. "paid_at": 1568026488
  20. }

微信消息推送

微信推送的消息,已自动转换为 JSON 数据,此外会增加一个字段:_AppId 表示消息所属的公众号或小程序 appid。

示例:卡券未通过审核

  1. {
  2. "CardId": "Wzq1bxvtOD",
  3. "CreateTime": 1568019887,
  4. "Event": "card_not_pass_check",
  5. "FromUserName": "CL2qIPYwrr",
  6. "MsgType": "event",
  7. "RefuseReason": "4W9ltUWdtT",
  8. "ToUserName": "0VeUo2Kh4l",
  9. "_AppId": "wxO1x6SwAEC"
  10. }

文件记录字段解释:

字段字段名类型枚举值
id文件 IDstring不可枚举
name文件名称string不可枚举
status文件状态string等待上传:pending,上传成功:success,正在处理:running
categories文件所属分类array不可枚举
size文件大小(单位:Byte)integer不可枚举
media_type媒体类型string图像:image,音乐:music,录音:voice,视频:video,其他:other
mime_typeMIME 类型string标准 MIME 类型
reference最近一次引用信息object不可枚举,具体解释见表格下方
cdn_path文件在 CDN 中的路径string不可枚举
path文件路径string不可枚举
created_at创建时间(时间戳)integer不可枚举
updated_at最近一次更新时间(时间戳)integer不可枚举
created_by创建人 IDinteger不可枚举

reference:

字段字段名类型枚举值
schema_id表 IDinteger不可枚举
field字段名string不可枚举
record_id记录 IDstring不可枚举

文件上传event.data 参数为文件记录。

示例:上传成功

  1. {
  2. "status": "success",
  3. "cdn_path": "1i7HWTgtd80LDaUj.PNG",
  4. "name": "WW.PNG",
  5. "reference": "",
  6. "created_at": 1568027273,
  7. "updated_at": 1568027274,
  8. "created_by": 62689516,
  9. "mime_type": "image/jpeg",
  10. "media_type": "image",
  11. "path": null,
  12. "id": "5d7632891db94f23bd68f2b7",
  13. "categories": [],
  14. "size": 34283
  15. }

示例:上传失败

  1. {
  2. "status": "pending",
  3. "cdn_path": "1i7HWTgtd80LDaUj.PNG",
  4. "name": "WW.PNG",
  5. "reference": "",
  6. "created_at": 1568027273,
  7. "updated_at": 1568027274,
  8. "created_by": 62689516,
  9. "mime_type": null,
  10. "media_type": null,
  11. "path": null,
  12. "id": "5d7632891db94f23bd68f2b7",
  13. "categories": [],
  14. "size": null
  15. }

敏感图片校验event.data 参数为文件记录。

示例:校验通过

  1. {
  2. "status": "success",
  3. "cdn_path": "1i7HWTgtd80LDaUj.PNG",
  4. "name": "WW.PNG",
  5. "reference": "",
  6. "created_at": 1568027273,
  7. "updated_at": 1568027274,
  8. "created_by": 62689516,
  9. "mime_type": "image/jpeg",
  10. "media_type": "image",
  11. "path": null,
  12. "id": "5d7632891db94f23bd68f2b7",
  13. "categories": [],
  14. "size": 34283
  15. }

示例:校验失败

  1. {
  2. "status": "success",
  3. "cdn_path": "1i7HWTgtd80LDaUj.PNG",
  4. "name": "WW.PNG",
  5. "reference": "",
  6. "created_at": 1568027273,
  7. "updated_at": 1568027274,
  8. "created_by": 62689516,
  9. "mime_type": "image/jpeg",
  10. "media_type": "image",
  11. "path": null,
  12. "id": "5d7632891db94f23bd68f2b7",
  13. "categories": [],
  14. "size": 34283
  15. }

示例:删除成功

  1. {
  2. "status": "running",
  3. "cdn_path": "1i7HWTgtd80LDaUj.PNG",
  4. "name": "WW.PNG",
  5. "reference": "",
  6. "created_at": 1568027273,
  7. "updated_at": 1568027497,
  8. "created_by": 62689516,
  9. "mime_type": "image/jpeg",
  10. "media_type": "image",
  11. "path": null,
  12. "id": "5d7632891db94f23bd68f2b7",
  13. "categories": [],
  14. "size": 34283
  15. }

发送支付宝模板消息

发送支付宝模板消息发送支付宝模板消息

发送支付宝模板消息前需要先完成小程序授权并添加消息模板,并完成 formid 收集

注:下发消息需绑定生活号(重要):开发者需要绑定上线可运营的生活号,由生活号来承接服务提醒的消息;交易类:当用户在小程序内完成支付行为,可允许开发者向付款用户在7天内推送有限条数的模板消息(同个订单号只能发送3条消息,不限制模板数),当开发者调用交易类的模板消息时,必须要传入 tradeNo表单类:当用户在小程序内发生过提交表单行为且该表单为要发模板消息的,可允许开发者向用户在7天内推送有限条数的模板消息(1次提交表单可下发3条,不限制模板数),当开发者调用表单类的模板消息时,必须要传入 formId

收件人支持类型如下:

收件人说明
消息创建人触发当前动作的用户,只能是单个用户
指定用户指定某一批用户,开发者需要设置用户查询条件来筛选用户。当收件人为指定用户时,建议使用智能过滤服务,实现精准发送
指定用户组选定的用户分组,常用于管理员或 VIP 分组

发送策略:短时间内大量发送模板消息容易导致模板消息被封,建议单次发送条数小于 5000 条,每次发送间隔大于 5 分钟。

注:发送支付宝模板消息时,pointer 数据不进行数据展开,即模板变量中 pointer 只能获取到对应数据 ID。

发送 QQ 模板消息

发送 QQ 模板消息前需要先完成小程序授权并添加消息模板,并完成 formid 收集

注:表单类:当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在 7 天内推送有限条数的模板消息( 1 次提交表单可下发 1 条,多次提交下发条数独立,相互不影响)

收件人支持类型如下:

收件人说明
消息创建人触发当前动作的用户,只能是单个用户
指定用户指定某一批用户,开发者需要设置用户查询条件来筛选用户。当收件人为指定用户时,建议使用智能过滤服务,实现精准发送
指定用户组选定的用户分组,常用于管理员或 VIP 分组

发送策略:短时间内大量发送模板消息容易导致模板消息被封,建议单次发送条数小于 5000 条,每次发送间隔大于 5 分钟。

注:发送 QQ 模板消息时,pointer 数据不进行数据展开,即模板变量中 pointer 只能获取到对应数据 ID。

发送短信

发送短信发送短信

注:在发送短信前,开发者需要先开通短信服务并通过短信签名和模板的审核,具体请查看短信章节。系统会自动过滤没有手机的用户。短信服务单价为 ¥0.05/条。

收件人支持类型如下:

收件人说明
消息创建人触发当前动作的用户,只能是单个用户
指定用户指定某一批用户
指定用户组选定的用户分组,常用于管理员或 VIP 分组

实战教程

触发器实战教程请移步这里