# 触发器实战教程

## 触发器介绍

我们打开应用的引擎模块，默认就进入到了触发器模块，在这个页面我们可以很方便进行的查询、编辑，禁用等操作。 ![触发器](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXnXgcHPh3bTde7j%2F3275474.jpg?generation=1546512124423189\&alt=media)

触发器相关文档请[移步这里](../dashboard/basic-services/trigger)

## 触发类型：数据表

下面我们先以数据表作为触发条件，方便大家实操。 ![触发类型：数据表](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXnaeCIlrFDcvpxM%2F42461106.jpg?generation=1546512123814415\&alt=media)

### 邮件模板

#### 准备工作

我们先在数据页面，创建一个product表，然后添加如下一个字段：

| 字段名称 | 类型     |
| ---- | ------ |
| name | string |

#### 创建触发器

我们新建一个触发类型为数据表的触发器，条件卡片的配置如下：

| 名称   | 内容               |
| ---- | ---------------- |
| 数据表  | product          |
| 事件类型 | create           |
| 满足条件 | 任一               |
| 条件一  | name = "我的第一件商品" |

接下来我们编辑邮件内容：

| 名称   | 内容                     |
| ---- | ---------------------- |
| 收件人  | test-trigger@ifanr.com |
| 邮件标题 | 您的商品被创建啦               |
| 邮件内容 | 商品\{{name\}}被创建啦       |

邮件动作填写完成后如下图： ![邮件动作](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXnkWERd5xVUQLKD%2F73866365.jpg?generation=1546512126215464\&alt=media)

#### 测试触发器

编辑动作完成后点击保存后，我们切换到数据表模块，创建一条数据，name 字段为"我的第一件商品"，如下图： ![测试触发器](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z1zJWqA4rN-n8OA%2FWechatIMG114.png?generation=1551425236260917\&alt=media)

保存后，检查邮箱，发现收到知晓云发来的邮件了 ![测试结果](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXno82rU1awpoooV%2F57241768.jpg?generation=1546512135421247\&alt=media)

### 微信模板消息

#### 准备工作

1. 了解 BaaS JS SDK 的使用方法。
2. 绑定小程序。去应用设置页面绑定小程序，如果已经绑定可以忽略此步。
3. 获取 appSecret。
4. 在小程序后台选择微信消息模板。
5. 准备一个小程序用于测试。

如果忘记了 appSecret，可以先去微信小程序后台，重置后即可获取 appSecret，如下图： ![配置 appSecret](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXnqlMAwe5VUYHCB%2F35478909.jpg?generation=1546512124434312\&alt=media) 配置模板消息列表如下图： ![模板消息列表](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXnsUxkvY-vwiHjY%2F44812646.jpg?generation=1546512124571493\&alt=media)

#### 创建触发器

我们重新创建一个触发器，这次动作类型选择微信，这时候会出现一个弹窗，要求我们输入小程序的 appSecret，如下图： ![创建触发器](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXnuaA69d_vR6YRG%2F38955153.jpg?generation=1546512141852637\&alt=media)

配置 appSecret 完毕后，进入编辑动作页面，填写参数，如下图： ![创建触发器](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXnwWNhInXTI0mHd%2F19751164.jpg?generation=1546512134111864\&alt=media)

#### 编写小程序代码

保存后，我们打开[微信开发者工具](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html)，新建一个小程序项目，开始编写小程序代码。 第一步：在 app.js 引入 [BaaS JS SDK](https://github.com/ifanrx/hydrogen-js-sdk)，SDK 文档请[参考这里](https://doc.minapp.com/) ![编写小程序代码](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXnyhnSIz5iTBMER%2F68584271.jpg?generation=1546512133655187\&alt=media)

第二步：在index.wxml中添加一个form组件，注意这里form组件需要添加 report-submit属性，否则在回调事件对象中无法获取formId。 ![编写小程序代码](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXo-GiPnB48VFynq%2F28564044.jpg?generation=1546512123617994\&alt=media)

> **info** 发送模板消息必须提前提交 formId

第三步：在index.js文件中添加addProduct回调，保存数据行，同时提交formId。 ![编写小程序代码](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXo1LxLPTP9Dg23u%2F43025364.jpg?generation=1546512123472014\&alt=media)

最后一步，预览小程序，然后点击添加商品，不一会就可以收到微信模板消息了。 ![编写小程序代码](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoT_IQvRqpfjDjw%2F12429227.jpg?generation=1546512124092573\&alt=media)

### WebHook

#### 准备工作

搭建一个 HTTP 服务器用于接收 POST 请求。这里以 Node.js 为例，写一个简单的 demo：

1. 准备一台具有公网 IP 的服务器。
2. 安装 Node.js 环境。
3. 在当前目录下新建 `index.js`，并将下方代码块内容粘贴至`index.js`。然后执行`npm i koa jsonwebtoken`，安装依赖包。

```js
// index.js
const Koa = require('koa')
const jwt = require('jsonwebtoken')
const app = new Koa()

/**
 * 解析 POST BODY
 * @param ctx
 * @returns {Promise<any>}
 */
function parsePostData(ctx) {
  return new Promise((resolve, reject) => {
    try {
      let postdata = ''
      ctx.req.addListener('data', (data) => {
        postdata += data
      })
      ctx.req.addListener('end', function() {
        let parseData = postdata
        resolve(parseData)
      })
    } catch (err) {
      reject(err)
    }
  })
}

/**
 * 解析 JWT 数据
 * @param str
 * @param secret
 * @returns {Promise<any>}
 */
function decodeJWT(str, secret) {
  return new Promise(function(resolve, reject) {
    if (secret) {
      jwt.verify(str, secret, (err, decoded) => {
        if (err) return reject(err)
        resolve(decoded)
      })
    } else {
      resolve(Buffer.from(str.split('.')[1], 'base64').toString())
    }
  })
}

app.use(async (ctx, next) => {
  let postData = await parsePostData(ctx)
  let data = await decodeJWT(postData, ctx.query.jwt)
  console.log(ctx.header)
  console.log(data)
  ctx.body = 'ok'
})

app.listen(8088, () => {
  console.log('running...')
})
```

执行`node index.js`，启动 HTTP 服务。

#### 创建触发器

我们新建一个触发类型为数据表的触发器，条件卡片的配置如下

| 名称   | 内容       |
| ---- | -------- |
| 数据表  | product  |
| 事件类型 | create   |
| 满足条件 | 任一       |
| 条件一  | name = 1 |

我们以数据表`product`为例，在触发器中添加一个 WebHook 动作。 ![添加动作](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXo5sFmc56QhaxTU%2F70001420.jpg?generation=1546512134064929\&alt=media)

URL 格式如下

```
http://<your ip>:<port>/?jwt=<JWT KEY>
```

示例

```
http://192.168.11.11:8088/?jwt=mehXaWyZXhnzsyWYeUPhWTCOgfjGgdwN
```

\####测试触发器 我们在 product 表中创建一行 `name` 字段为 1 的记录，然后在我们搭建的 HTTP 服务器查看输出结果，可以看到我们成功收到了 POST 请求： ![触发器执行成功](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXo7Ow57Yeq9OMQ3%2F8044111.jpg?generation=1546512134582287\&alt=media)

> **info** 这里为了方便演示，将 JWT KEY 放入了query string 中，生产环境不推荐这么操作。

### 数据表操作

#### 准备工作

1. 新建两张数据表：A 表，B 表。A 表用于激活触发器，然后将结果写入 B 表。
2. 在 A 表新建一个名称为 name，类型为 string 的字段；在 B 表新建一个名称为 result ，类型为 string 的字段。

#### 创建触发器

我们创建一个触发类型为数据表的触发器。 条件卡片如下：

| 名称   | 内容        |
| ---- | --------- |
| 数据表  | A         |
| 事件类型 | create    |
| 满足条件 | 任一        |
| 条件一  | name != 1 |

接着我们添加一个数据表操作的动作

| 名称   | 内容                  |
| ---- | ------------------- |
| 动作类型 | 数据表操作               |
| 频率   | 可重复触发               |
| 数据表  | B                   |
| 操作   | 创建                  |
| 操作1  | result = \{{name\}} |

![创建触发器](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXo9AW-e1Ae8lX6g%2F91743366.jpg?generation=1546512125345913\&alt=media)

> **info** 这里我们使用了模板变量，result = \{{name\}} 的意思是将数据表 A 中 name 字段赋值给数据表 A 的 result 字段。

#### 测试触发器

我们在数据表 A 中创建一行 name = test123 的记录。 ![测试触发器](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoB0uFY1nd1grsa%2F89900278.jpg?generation=1546512134558702\&alt=media) 添加成功后，检查数据表 B，发现触发器成功地为我们添加了一行记录 ![测试触发器](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoD8MJvzkrPZitG%2F52759154.jpg?generation=1546512124146664\&alt=media)

#### 云函数

**创建云函数**

我们先创建一个云函数，如下图所示： ![创建云函数](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoFhuFHbwnvcfgo%2FWX20180614-165740.png?generation=1546512123719145\&alt=media)

代码如下：

```js
exports.main = function functionName(event, callback) {
  console.log(event.data)
  callback(null, "hello world")
}
```

**创建触发器**

我们创建一个触发器，如下图所示 ![创建触发器](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoH3cBgLjKeNKx1%2F5736585.png?generation=1546512133624840\&alt=media)

**测试触发器**

我们在数据表 A 新增一条 name='123' 的记录，稍等几秒后，我们查看下 `firstFunction` 的任务日志 ![查看日志](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoJ5UC0zz3ixn1G%2FWX20180614-170727.png?generation=1546512124102660\&alt=media)

可以看到我们的云函数被成功执行了，event.data 的内容为数据表记录 ![查看日志](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoL86227GQnp1M8%2FWX20180614-170833.png?generation=1546512141249392\&alt=media)

## 触发类型：微信支付回调

### 准备工作

1. [认证小程序，接入微信支付](https://mp.weixin.qq.com/debug/wxadoc/introduction/#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%94%B3%E8%AF%B7%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98)
2. [在知晓云配置商户号，证书等](https://github.com/ifanrx/hydrogen-js-sdk)

我们新建一个小程序，在小程序入口加载 BaaS JS SDK，请求用户授权：代码如下

```js
App({
  onLaunch: function () {
    require('./vendor/sdk-v{{book.latestVersionWechat}}.js')
    let clientID = '[[client_id]]'
    wx.BaaS.init(clientID)

    wx.BaaS.login()
  }
})
```

我们在首页增加一个按钮，在按钮上绑定 click 回调，在回调函数中使用 `wx.BaaS.pay` 来发起支付请求

```javascript
Page({
  pay: function () {
    let params = {
      totalCost: 0.1,
      merchandiseDescription: '一条支付描述'
    }

    wx.BaaS.pay(params).then(res => {
      console.log('pay')
    }, err => {
      // 未完成用户授权或发生网络异常等
      console.log(err)
    })
  }
})
```

支付成功结果： ![支付成功结果](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoNCcGr--sfsBpJ%2Fpay-success-1.jpeg?generation=1546512135400351\&alt=media) ![支付成功结果](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoPWQ3hkAyuv4zN%2Fpay-success-2.jpeg?generation=1546512140818285\&alt=media)

[下载完整 demo](https://github.com/ifanrx/hydrogen-js-sdk-doc/blob/master/support/practice/sdk-payment-demo.zip)

**下文创建的触发器都是以微信支付回调作为触发类型，相关描述将会被省略**

### 邮件-支付回调

动作创建参照上文创建邮件小节，只是这里我们把邮件相关参数改成如下：

| 名称   | 内容                                           |
| ---- | -------------------------------------------- |
| 邮件标题 | 用户支付成功                                       |
| 邮件内容 | 用户支付了\{{total\_cost\}}元， 订单号：\{{trade\_no\}} |

> **info** 这里我们使用了 `{{total_cost}}` 模板变量，用于拿到用户支付的具体金额。

随后我们测试微信支付，支付成功后，查看收件箱，如图： ![邮件-支付回调](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoRddZTi-7gcsiL%2F19040484.jpg?generation=1546512134495361\&alt=media)

### 微信模板消息-支付回调

动作创建参照上文创建微信模板消息小节。只是这里我们把参数 `keyword1` 改为 `{{total_cost}}`，这样就可以拿到用户支付的具体金额。

![微信模板消息-支付回调](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoT_IQvRqpfjDjw%2F12429227.jpg?generation=1546512124092573\&alt=media)

> **info** 发送模板消息必须提前提交 formId

### WebHook-支付回调

动作创建参照上文创建 WebHook 小节。唯一要注意的是，请求 Body 参数会不同。

### 数据表操作-支付回调

动作创建参照上文创建数据表操作小节。**注意这里可选的模板变量有所不同**。

### 云函数-支付回调

#### 创建云函数

我们创建一个云函数 `verifyPayment`，函数内容如下

```js
exports.main = function functionName(event, callback) {
  console.log(event.data)
  callback(null, '')
}
```

#### 触发云函数

支付成功后，我们查看 `verifyPayment` 的任务日志如下： ![云函数-支付回调](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoVe9V7iRSaV1_y%2FWX20180614-173124.png?generation=1546512141595612\&alt=media)

## 触发类型：定时任务

### 准备工作

我们首先创建一个云函数，如下图所示： ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2U9hSDdVQCt3C-%2F83745285.png?generation=1551425237850994\&alt=media)

### 创建触发器

我们创建一个触发类型为定时任务的触发器，触发周期为每小时，动作内容选择我们上面创建的云函数。

![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2GLtlGpfDWNbvI%2F4236952.png?generation=1551425236123028\&alt=media) ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2IB6Qr8j_jz6N7%2F80231555.png?generation=1551425237390215\&alt=media) ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2_SHX78IEHhR_D%2F96971365.png?generation=1551425238175831\&alt=media)

### 测试触发器

过几个小时后，我们查看云函数的任务日志，可以看到云函数被成功执行了 ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoecvrKdmCG6_Hq%2F99831218.jpg?generation=1546512125369688\&alt=media)

## 触发类型：文件操作

### 准备工作

我们首先创建一个云函数，如下图所示： ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2U9hSDdVQCt3C-%2F83745285.png?generation=1551425237850994\&alt=media)

### 创建触发器

我们创建一个触发类型为文件操作的触发器，触发条件为上传文件且上传成功，动作内容选择我们上面创建的云函数。

![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2OMNFBmX9okA6R%2FWechatIMG121.png?generation=1551425237660744\&alt=media) ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2QPuAcTKc9lsHU%2FWechatIMG122.png?generation=1551425238109822\&alt=media) ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2_SHX78IEHhR_D%2F96971365.png?generation=1551425238175831\&alt=media)

### 测试触发器

我们在控制台中上传一个文件：

![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXooyfIuk8qk387y%2F162203.png?generation=1546512124960536\&alt=media)

文件上传操作相关文档请[移步这里](../js-sdk/file/file)

之后，我们查看云函数的任务日志，可以看到云函数被成功执行了 ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXoqkbJP0xblR3ld%2F162046.png?generation=1546512134982599\&alt=media)

## 触发类型：IncomingWebhook

### 准备工作

我们首先创建一个云函数，如下图所示： ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2U9hSDdVQCt3C-%2F83745285.png?generation=1551425237850994\&alt=media)

### 创建触发器

我们创建一个触发类型为IncomingWebhook的触发器，动作内容选择我们上面创建的云函数。

![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2WwAwTQGzHFgAq%2FWechatIMG123.png?generation=1551425237123068\&alt=media) ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2Yfe9UMeSNGjux%2FWechatIMG124.png?generation=1551425236612399\&alt=media) ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2_SHX78IEHhR_D%2F96971365.png?generation=1551425238175831\&alt=media)

### 测试触发器

在创建好触发器之后，在这里会有一个特定的 URL： ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXp-5i4c5JDhoyeD%2F164507.png?generation=1546512141907580\&alt=media)

点击复制，然后在新浏览器窗口访问这个 URL： ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXp1oMtPvMPwFMR_%2F164720.png?generation=1546512142114907\&alt=media)

上面返回了 status: 'ok'; 说明执行成功了。我们查看云函数的任务日志，如下： ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LVIITJr35OA9llTd5pR%2F-LVIIXp3353PB_otUWfN%2F164956.png?generation=1546512125782520\&alt=media)

## 触发类型：微信消息推送

> **info** 假如你已开通客服消息功能，微信消息推送中的「客服消息事件」将统一转送至该服务处理， 如需单独处理客服消息事件，请重新授权小程序并取消「帮助小程序接受和发送客服消息」。

### 准备工作

我们首先创建一个云函数，如下图所示： ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LVIIQcUXqNvyHRGzhur%2F-LZs8UnZdk5a0kxPABQq%2F-LZs8Z2U9hSDdVQCt3C-%2F83745285.png?generation=1551425237850994\&alt=media)

### 创建触发器

我们创建一个触发类型为微信消息推送的触发器，填入小程序或公众号的 AppID，具体参数值请参考[微信文档](https://mp.weixin.qq.com/wiki?t=resource/res_main\&id=mp1451025274)，动作内容选择我们上面创建的云函数。

![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LVIIQcUXqNvyHRGzhur%2Fuploads%2Fgit-blob-1d253b58cfd73e31e2ecf41918109b1a2caadd01%2FWX20190704-143557.png?alt=media) ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LVIIQcUXqNvyHRGzhur%2Fuploads%2Fgit-blob-708547a592858f9f590f30ab7af9f35ba14940e3%2FWX20190704-143808.png?alt=media) ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LVIIQcUXqNvyHRGzhur%2Fuploads%2Fgit-blob-f644a369916269f3e7a63ff88610496e2bb583a6%2FWX20190704-143950.png?alt=media)

### 测试触发器

我们在小程序页面中添加进入客服消息按钮

```html
<button plain open-type="contact"></button>
```

在小程序页面中点击按钮进入客服会话，并发送文字消息：

![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LVIIQcUXqNvyHRGzhur%2Fuploads%2Fgit-blob-876509018531219093fc910e97ea16526a081f5b%2FWX20190704-151623.png?alt=media)

之后，我们查看云函数的任务日志，可以看到云函数被成功执行了： ![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LVIIQcUXqNvyHRGzhur%2Fuploads%2Fgit-blob-600600a14dfe015bf433921544be90c6cc4611fa%2FWX20190704-150906.png?alt=media)

## 触发类型：支付宝支付回调

### 准备工作

1. [认证小程序，接入支付宝支付](https://docs.alipay.com/mini/introduce/pay#%E6%8E%A5%E5%85%A5%E6%8C%87%E5%BC%95)
2. [在知晓云配置商户号，证书等](https://github.com/ifanrx/hydrogen-js-sdk)

### 创建触发器

我们创建一个触发类型为支付宝支付回调的触发器，触发条件为支付成功，触发动作下文只讨论`支付宝模板消息`动作类型，其他动作类型请参考上文微信支付回调。

![](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LVIIQcUXqNvyHRGzhur%2Fuploads%2Fgit-blob-08f2c258ba4af2b4256b69c80f0a6dba77e70d39%2FWX20190704-161930.png?alt=media)

> **info** 发送模板消息必须提前提交 formId

### 测试触发器

我们新建一个小程序，在小程序入口加载 BaaS JS SDK，请求用户授权：代码如下

```js
App({
  onLaunch: function () {
    require('./vendor/sdk-v{{book.latestVersionAlipay}}.js')
    let clientID = '[[client_id]]'
    my.BaaS.init(clientID)

    my.BaaS.login()
  }
})
```

我们在首页增加一个按钮，在按钮上绑定 click 回调，在回调函数中使用 `my.BaaS.pay` 来发起支付请求

```javascript
Page({
  pay: function () {
    let params = {
      totalCost: 0.01,
      merchandiseDescription: '一条支付描述'
    }

    my.BaaS.pay(params).then(res => {
      console.log('pay')
    }, err => {
      // 未完成用户授权或发生网络异常等
      console.log(err)
    })
  }
})
```

支付成功结果：

![支付成功结果](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LVIIQcUXqNvyHRGzhur%2Fuploads%2Fgit-blob-61446bd4ae3403122af192be0dd7e35c20865541%2FWX20190704-160543.png?alt=media) ![支付成功结果](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LVIIQcUXqNvyHRGzhur%2Fuploads%2Fgit-blob-4182624a97266cdc2ae6a4ba250f1985497fd89c%2FWX20190704-160641.png?alt=media)

检查触发器日志，调用触发器成功，并成功发送模板消息：

![支付宝支付回调](https://3271136903-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LVIIQcUXqNvyHRGzhur%2Fuploads%2Fgit-blob-25a11cc38dcd25cf087108639a8d6fbb69c3b0dc%2FWX20190704-162448.png?alt=media)
