# 电商/票务类小程序必读，如何用小程序推送消息？

- 作者：Astrian
- 发布时间：2017-02-23 12:16
- 原文：https://www.ifanr.com/minapp/790321

![](https://s3.ifanr.com/wp-content/uploads/2017/02/Featured-13.jpg)

如果你有一个电商小程序，或是一个活动报名小程序，那么你可能会遇到这样的问题：

- 当消费者购买商品后，如何通知他们东西发货了呢？
- 如果用户报名成功，怎么样快速又方便地告知他们报名结果呢？

这时候，**我们就需要用到小程序的「模板消息」接口**。

今天，知晓程序（微信号 zxcx0101）就来教你如何正确地发送模板消息。

### 什么是模板消息？

顾名思义，**模板消息是一种「套上模板的消息」**。

通常，服务方向用户推送的消息都带有通知性质，文案也相对固定。**服务方将这类固定的文案制作成模板，这些文案就可以快速重复使用。**

在发送时，服务方只需向模板内填充必要的数据（如客户名称、订单号、价格等），就可以将这条消息发送给用户了。

例如，航空公司可能会向用户发送这样的消息：

> 张三，您好，您已购买 1 月 1 日 13:00 从广州飞往上海的 AB1234 航班的机票。

从中可以得知，除了一些需要根据实际情况填写的信息，其他文案都是固定的。

那么，就可以提取这样的消息模板：

> （旅客姓名），您好，您已购买（时间）从（出发地）飞往（到达地）的（航班号）航班的机票。

当航空公司发送消息时，他们只需要根据实际情况填充信息，就可以将这条消息发送给相应的用户了。

### 微信小程序的模板消息限制

与普通的模板消息不同，**在微信小程序中发送模板消息，具有一定条件**。

官方文档中规定，**用户在小程序中进行支付或提交表单，小程序才能向用户发送模板消息**。

那么，微信如何得知用户是否有支付行为、表单提交的行为呢？

用户支付或提交表单过后，开发者可以得到模板消息的 `formID`（为了方便解释，将它叫做「发送码」），这代表着开发者有发送模板消息的权限。

开发者发送模板消息时，就需要向微信提供这样的发送码，完成模板消息的发送过程。

而且，发送码是一次性的，用一次就会作废。也就是说，如果用户只发起过一次支付或提交过一次表单，那么开发者也只能向用户发送一次消息。

除了需要用户进行支付或提交表单，小程序也不能通过模板消息接口，群发推广信息、垃圾信息等。

### 如何发送模板消息？

知道了这些，就能得知，微信小程序发送模板消息的大致步骤是：

1. 开发者在微信公众平台，创建一个新的消息模板；
2. 获取支付过程或提交过程中，微信返回的消息发送码；
3. 开发者利用消息发送码，带上模板中非固定的信息，向微信发起发送消息的请求。

那么，我们一步步开始吧。

#### 创建新的消息模板

既然是「模板消息」，那第一步当然是创建新的模板了。

- 打开 https://mp.weixin.qq.com 并登录小程序帐户；
- 点击左侧菜单中的「模板消息」；
- 进入顶部的「模板库」，从微信预置的模板中，选择一个合适的模板；
- 确定模板中所使用的关键词。

如果关键词列表中没有你希望使用的关键词，你可以点击申请一个新的关键词。但**申请新的关键词需要提交审核**。

![](https://s3.ifanr.com/wp-content/uploads/2017/02/template-1-1.jpg)

模板添加后，会获得模板 ID（`template_id`），稍后就可以用到它。

![](https://s3.ifanr.com/wp-content/uploads/2017/02/template-2.jpg)

#### 获取模板消息发送码

创建消息模板后，还需要「发送码」，才能发送模板消息。

以提交表单为例，看看发送码的获取方式。

首先，在小程序中，放置一个带有 `report-submit` 属性的表单：

```
<form bindsubmit="formSubmit" bindreset="formReset" report-submit>
  <!-- 此处是表单元素 -->
  <button formType="submit">Submit</button><!-- 提交按钮 -->
</form>

```

然后，在页面的 `Page()` 函数中，新建一个提交表单的函数。

在函数中，就能接收到 `formId`，也就是发送码了。

```
var sendercode; // 用于存储发送码

Page({
  //其他的函数
  formSubmit: function(e) {
    sendercode = e.detil.formId;)
  }
})

```

如果你想在微信发起支付请求后，获取发送码，那么你需要调用微信支付中的「统一下单」接口。

当「统一下单」接口请求成功之后，回调值中的「预支付交易会话标识」，也就是 `prepay_id`，就可以作为发送码来使用。

#### 发送模板消息

经过这么多步骤，终于可以向用户发送模板消息了。**在这一步，所有过程都是在开发者的服务器完成。**

首先，通过 GET 方式，获取到小程序的 Access Token：

```
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

```

接着，用 POST 方式，向微信提交模板消息的发送请求。

请求地址为：

```
https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN

```

请求数据的格式如下：

```
{
  "touser": "OPENID", // 接收消息的用户的 OpenId，需要使用其他接口获取
  "template_id": "TEMPLATE_ID", // 模板 ID，在第一步中可以获取到
  "page": "index", // 进入小程序时打开的页面，可以添加参数
  "form_id": "FORMID", // 一次性发送码
  "data": { // 模板中非固定字段，用于填充模板
    "keyword1": {
      "value": "张三", // 模板中，填充字段的信息
      "color": "#173177" // 字段的展示颜色
    },
    "keyword2": {
      "value": "2015 年 01 月 05 日 12:30",
      "color": "#173177"
    }
  }
}
```

当接口返回成功消息时，就代表着模板消息已经发送出去了。

有关于微信小程序模板消息接口的更多使用方法和使用限制，可以访问[官方文档](http://suo.im/3ieJrr)了解详情。

#### 往期精选文章

- [开发 \| 效率提升 100%，小程序开发应该这样做](http://www.ifanr.com/minapp/790017)
- [开发 \| 技术高人如何开发小程序？他们用这套方法](http://www.ifanr.com/minapp/787666)
- 开发 \| 小程序开发有哪些坑？这份笔记都整理出来了

**本文由知晓程序授权转载，关注微信号 zxcx0101，可获得以下内容和服务：**

- 在微信后台回复「0109」，一张图教你玩转微信小程序。
- 在微信后台回复「加群」，加入「一起发现小程序」微信交流群。
- 在微信后台回复任意关键词，还能获得相关小程序推荐，赶紧试试吧！

![zxcx&#95;0208](https://s3.ifanr.com/wp-content/uploads/2017/02/zxcx_0208.png)
