# 发送微信消息使用说明

文档类型：模块 API 事实页
是否可直接用于生成代码：是，但 `userid`、`username`、模板标题、模板关键字含义和真实通知内容必须来自用户需求或项目上下文
遇到不确定时：[index.md](index.md)、调用侧账户体系文档、项目实际接口说明、天软科技服务号模板列表

本页整理通过“天软科技服务号”发送微信模板消息的接口事实。它负责告诉智能体“该调用哪个函数、参数顺序是什么、同步和异步怎么选择、状态如何查询”，不负责替用户创造账户、授权关系、模板映射或通知内容。

## 智能体微信消息决策规则

- 用户要“发送微信通知 / 微信消息 / 微信告警 / 微信模板消息 / 查询微信发送状态”时，优先使用本页。
- 紧急通知、需要立刻知道发送结果时，默认使用 `send_wechat_message(...)`。
- 非紧急通知、批量通知、发送后可稍后查询状态时，默认使用 `send_wechat_message_async(...)`。
- 用户要求查询异步状态时，生成 `get_wechat_message_status(userid, username, wechat_message_id)`；三个实参必须来自参数、已知变量或项目上下文。
- 参数必须严格按接口顺序传入；所有参数按字符串处理。
- `url` 是固定位置参数；无详情地址时传空字符串 `""`。
- `k1` 到 `k6` 的含义由模板标题决定；只按模板映射或用户输入填充，不要发明关键字含义。
- 用户要求“通知第一眼看到”的内容时，放入带字段名的 `kN` 参数；`first` 和 `remark` 只作为点入通知后的详情文本。
- 给他人发消息时，必须使用接收者授权给发送者的 `userid`，不要把发送者自己的 `userid` 当成接收者标识。
- 不要发明 `userid`、`username`、项目封装函数、模板标题、模板关键字、授权关系或账号映射。

## 前置条件

| 条件                            | 说明                                                                                   |
| ------------------------------- | -------------------------------------------------------------------------------------- |
| 已绑定服务号                    | 首次使用需要关注并绑定“天软科技服务号”，绑定后取得 `userid`                            |
| 已取得 `userid`                 | `userid` 与用户账户和微信绑定关系相关，应由调用侧提供                                  |
| 给他人发送时已授权              | 接收者绑定后在服务号 `userid` 页面授权发送者账号，发送者使用接收者提供的 `userid` 发送 |
| 查询异步状态时已取得 `username` | `username` 是账号名，脚本查询发送状态时需要；来源以项目账户体系为准                    |

## 接口总览

| 函数                                                                                     | 用途             | 返回值                                            |
| ---------------------------------------------------------------------------------------- | ---------------- | ------------------------------------------------- |
| `send_wechat_message(userid, url, title, first, remark[, k1, k2, k3, k4, k5, k6])`       | 同步发送模板消息 | 成功返回字符串 `success`；失败返回错误信息        |
| `send_wechat_message_async(userid, url, title, first, remark[, k1, k2, k3, k4, k5, k6])` | 异步发送模板消息 | 返回 16 位字符串消息 ID                           |
| `get_wechat_message_status(userid, username, wechat_message_id)`                         | 查询异步发送结果 | 成功返回字符串 `成功`；否则返回状态信息或错误信息 |

## 同步发送

签名：

```text
send_wechat_message(userid, url, title, first, remark[, k1, k2, k3, k4, k5, k6])
```

参数表：

| 参数位置 | 参数名   | 必填     | 接收类型 | 说明                                                              |
| -------- | -------- | -------- | -------- | ----------------------------------------------------------------- |
| 1        | `userid` | 是       | 字符串   | 绑定账户后取得的用户标识；给他人发送时使用接收者授权后的 `userid` |
| 2        | `url`    | 是       | 字符串   | 详情地址；没有详情地址时传 `""`                                   |
| 3        | `title`  | 是       | 字符串   | 模板消息标题，例如 `监控报告通知`                                 |
| 4        | `first`  | 是       | 字符串   | 详情页开头文本；不作为通知列表首屏字段                            |
| 5        | `remark` | 是       | 字符串   | 详情页结尾备注；不作为通知列表首屏字段                            |
| 6        | `k1`     | 条件必填 | 字符串   | 模板关键字 1；带字段名的 `kN` 行属于首屏展示字段                  |
| 7        | `k2`     | 条件必填 | 字符串   | 模板关键字 2；带字段名的 `kN` 行属于首屏展示字段                  |
| 8        | `k3`     | 否       | 字符串   | 模板关键字 3；部分模板需要                                        |
| 9        | `k4`     | 否       | 字符串   | 模板关键字 4；部分模板需要                                        |
| 10       | `k5`     | 否       | 字符串   | 模板关键字 5；部分模板需要                                        |
| 11       | `k6`     | 否       | 字符串   | 模板关键字 6；部分模板需要                                        |

返回值：

| 返回值     | 含义         |
| ---------- | ------------ |
| `success`  | 同步发送成功 |
| 其他字符串 | 错误信息     |

使用规则：

- 同步发送会阻塞当前程序，必须等待发送函数执行完毕后才进入下一步。
- 紧急通知优先使用同步发送。
- 返回值不是 `success` 时，按错误信息处理。

## 异步发送

签名：

```text
send_wechat_message_async(userid, url, title, first, remark[, k1, k2, k3, k4, k5, k6])
```

参数表：

| 参数位置 | 参数名   | 必填     | 接收类型 | 说明                                                              |
| -------- | -------- | -------- | -------- | ----------------------------------------------------------------- |
| 1        | `userid` | 是       | 字符串   | 绑定账户后取得的用户标识；给他人发送时使用接收者授权后的 `userid` |
| 2        | `url`    | 是       | 字符串   | 详情地址；没有详情地址时传 `""`                                   |
| 3        | `title`  | 是       | 字符串   | 模板消息标题                                                      |
| 4        | `first`  | 是       | 字符串   | 详情页开头文本；不作为通知列表首屏字段                            |
| 5        | `remark` | 是       | 字符串   | 详情页结尾备注；不作为通知列表首屏字段                            |
| 6        | `k1`     | 条件必填 | 字符串   | 模板关键字 1；带字段名的 `kN` 行属于首屏展示字段                  |
| 7        | `k2`     | 条件必填 | 字符串   | 模板关键字 2；带字段名的 `kN` 行属于首屏展示字段                  |
| 8        | `k3`     | 否       | 字符串   | 模板关键字 3；部分模板需要                                        |
| 9        | `k4`     | 否       | 字符串   | 模板关键字 4；部分模板需要                                        |
| 10       | `k5`     | 否       | 字符串   | 模板关键字 5；部分模板需要                                        |
| 11       | `k6`     | 否       | 字符串   | 模板关键字 6；部分模板需要                                        |

返回值：

| 返回值      | 含义                                                       |
| ----------- | ---------------------------------------------------------- |
| 16 位字符串 | 异步消息 ID；前 10 位为 1900 年以来的秒数，后 6 位为随机数 |

使用规则：

- 异步发送把命令提交给服务器后立即返回，不等待最终发送结果。
- 非紧急通知优先使用异步发送。
- 需要最终结果时，保存返回的 `wechat_message_id`，再调用 `get_wechat_message_status(...)` 查询。

## 查询异步发送状态

签名：

```text
get_wechat_message_status(userid, username, wechat_message_id)
```

参数表：

| 参数位置 | 参数名              | 必填 | 接收类型 | 说明                                                 |
| -------- | ------------------- | ---- | -------- | ---------------------------------------------------- |
| 1        | `userid`            | 是   | 字符串   | 发送时使用的用户标识                                 |
| 2        | `username`          | 是   | 字符串   | 账号名；脚本执行查询时需要，来源以项目账户体系为准   |
| 3        | `wechat_message_id` | 是   | 字符串   | `send_wechat_message_async(...)` 返回的 16 位消息 ID |

返回值：

| 返回值     | 含义               |
| ---------- | ------------------ |
| `成功`     | 异步消息发送成功   |
| 其他字符串 | 状态信息或错误信息 |

调用规则：

- 状态查询用于异步发送后的结果确认。
- `username` 按账号名参数、已知变量或项目上下文传入，不写字面量 `"username"`。
- `wechat_message_id` 使用 `send_wechat_message_async(...)` 的返回值。

## 模板展示规则

| 模板片段                            | 展示位置               | 生成规则                                         |
| ----------------------------------- | ---------------------- | ------------------------------------------------ |
| `字段名：{{kN}}`                    | 通知列表首屏可见       | 用户要求“第一眼看到”的信息放到对应 `kN`          |
| `{{first}}`                         | 点入通知后的详情页开头 | 放说明、背景、摘要引导；不承载首屏必须展示的信息 |
| `{{remark}}`                        | 点入通知后的详情页结尾 | 放补充说明、处理建议、联系人等尾部信息           |
| 字面标题行，例如 `监控报告通知`     | 模板固定内容           | 不作为接口参数；接口参数 `title` 仍使用模板标题  |
| 动态标签行，例如 `{{k5}}幅：{{k6}}` | 通知列表首屏可见       | `k5` 填字段标签的一部分，`k6` 填对应数值         |

生成规则：

- `title` 决定模板，`k1` 到 `k6` 按模板字段名依次填入。
- 有名称的 `kN` 行是首屏展示字段；需要首屏展示的信息优先放入 `kN`。
- `first` 和 `remark` 是详情页内容；不要把“第一眼必须看到”的核心字段放入 `first` 或 `remark`。
- 模板未列出的 `kN` 不主动传入；需要扩展字段时先换模板或由用户提供模板映射。

## 模板关键字映射

### 系统监控类

| 模板标题             | `k1`         | `k2`         | `k3`         | `k4` | `k5` | `k6` |
| -------------------- | ------------ | ------------ | ------------ | ---- | ---- | ---- |
| `系统运行简报`       | 系统名称     | 简报内容     | 发布时间     |      |      |      |
| `监控报告通知`       | 运行状态     | 时间         |              |      |      |      |
| `监控结果通知`       | 监控项目     | 内容         | 时间         |      |      |      |
| `告警通知`           | 告警内容     | 告警发生时间 |              |      |      |      |
| `故障恢复通知`       | 故障信息     | 恢复时间     |              |      |      |      |
| `服务器异常监控通知` | 监控通知     | 监控通知类型 | 监控通知内容 |      |      |      |
| `服务器宕机通知`     | 故障时间     | 故障原因     |              |      |      |      |
| `服务器恢复通知`     | 故障停止时间 | 故障持续时间 |              |      |      |      |

### 交易通知类

| 模板标题       | `k1`     | `k2`     | `k3`     | `k4`     | `k5`     | `k6`     |
| -------------- | -------- | -------- | -------- | -------- | -------- | -------- |
| `交易成功通知` | 交易金额 | 交易类型 | 交易时间 | 交易单号 |          |          |
| `交易完成通知` | 股票简称 | 股票代码 | 股票价格 | 交易状态 | 股票数量 |          |
| `交易下单通知` | 交易品种 | 下单方向 | 下单价格 | 止损价格 | 下单时间 |          |
| `成交回报提示` | 证券名称 | 证券代码 | 买卖标识 | 成交价格 | 成交数量 | 成交时间 |
| `委托成交提醒` | 数量     | 价格     | 时间     |          |          |          |

### 策略通知类

| 模板标题           | `k1`     | `k2`       | `k3`         | `k4`       | `k5`                      | `k6`   |
| ------------------ | -------- | ---------- | ------------ | ---------- | ------------------------- | ------ |
| `投资策略更新提醒` | 策略名称 | 操作风格   | 目前策略收益 |            |                           |        |
| `股票调仓通知`     | 股票名称 | 操作类型   | 调仓时间     | 调仓价格   | 调仓仓位                  |        |
| `实时建仓提醒`     | 品种     | 方向       | 仓位         | 价格       | 止盈止损                  |        |
| `个股到价通知`     | 股票名   | 当前成交价 | 预警价       |            |                           |        |
| `个股涨跌幅通知`   | 股票名   | 当前成交价 | 对比日期     | 对比收盘价 | 动态标签，组成 `{{k5}}幅` | 动态值 |

### 其他通知类

| 模板标题           | `k1`     | `k2`     | `k3` | `k4` | `k5` | `k6` |
| ------------------ | -------- | -------- | ---- | ---- | ---- | ---- |
| `账号绑定成功通知` | 账号名称 | 绑定时间 |      |      |      |      |
| `服务开启通知`     |          |          |      |      |      |      |
| `授权请求通知`     | 申请人   | 请求权限 |      |      |      |      |

`服务开启通知` 当前只记录模板标题，未固定 `k1` 到 `k6` 的字段映射。

## 发送示例

同步发送系统运行简报：

```tsl
function SendSystemBrief(user_id);
begin
    url := "";
    title := "系统运行简报";
    first := "系统运行情况如下。";
    k1 := "风控服务";
    k2 := "运行正常";
    dateTimeToString(k3, "YYYY-MM-DD HH:NN:SS", now());
    remark := "如有疑问请联系值班人员。";

    return send_wechat_message(user_id, url, title, first, remark, k1, k2, k3);
end;
```

异步发送并保留消息 ID：

```tsl
function SendSystemBriefAsync(user_id);
begin
    url := "";
    title := "系统运行简报";
    first := "系统运行情况如下。";
    k1 := "风控服务";
    k2 := "运行正常";
    dateTimeToString(k3, "YYYY-MM-DD HH:NN:SS", now());
    remark := "如有疑问请联系值班人员。";

    return send_wechat_message_async(user_id, url, title, first, remark, k1, k2, k3);
end;
```

查询异步发送结果：

```tsl
function QueryWechatMessageStatus(user_id, username, wechat_message_id);
begin
    return get_wechat_message_status(user_id, username, wechat_message_id);
end;
```
