跳到主要内容

如何通过连接器发送短信

1. 使用场景

短信发送是比较常见的操作,在表单或者流程的业务中,我们经常需要使用到发送短信的能力。现在,利用宜搭的连接器功能,我们可以做到轻松自动发送短信。

2. 账号注册&购买短信服务

2.1 注册阿里云官网账号

首先需要注册一个阿里云的账号,访问阿里云官网:https://www.aliyun.com/,注册好之后登录官网。如果已有阿里云账号,本步骤可忽略。

2.2 购买短信服务

我们需要在阿里云官网上面购买短信服务,有两种渠道购买,一种是购买阿里云官方的短信服务,一种是购买阿里云三方服务商的短信服务

两种渠道的优劣势如下:

项目类型

阿里云官方短信

三方服务商短信

短信签名和模板申请

提交申请流程,2小时审批。其中『签名』申请比较困难,需要提供三证合一和委托授权书。

将格式发送给客服,申请格式比较自由,生效时间很快。

短信发送量统计

有提供详细的每天发送量报表

只显示条数使用情况:200/300

短信发送记录明细

有提供,详细的发送记录(包括发送状态、发送时间、发送内容、失败的原因)

不提供,除非量非常大,可提供接口查询

短信响应时间

几乎没有延时,很快,3秒内收到

如果量小,响应会延时半小时,可申请放开限制

短信鉴权方式

阿里云短信采用的是 AK+SK 的加密方式,宜搭不支持这种动态鉴权方式,目前只能使用 FaaS 包裹一下,提供新的连接器

提供了 AppKey、AppSecret、AppCode 等参数和 https 接口,可以直接鉴权

2.2.1 购买阿里云官方短信服务

访问下面链接,按照自身的需求购买相对应的短信服务。

点击此处进行购买

购买成功后,在 短信服务工作台 就可以看到已经购买的套餐包余量。

按照阿里云的官方文档,设置短信“模板”和短信“签名”。需要审核,一般2小时内完成。

模板和签名审核通过之后,可以在签名和模板管理中看到。

2.2.2 购买阿里云三方服务商的短信服务

访问下面链接,按照自身的需求购买相对应的短信服务。

点击此处购买短信服务

购买成功之后,在 云市场工作台 可以看到购买成功的服务。

添加客服为好友联系

访问产品购买页面:https://market.aliyun.com/products/57126001/cmapi030445.html?#sku=yuncode2444500003

找到对应的服务商联系信息,添加联系人为好友,可以选择钉钉联系。

设置短信的内容

访问订单列表地址:点击此处查看订单列表

将刚购买的短信服务订单编号告知客服。

制定自己要发的短信模板,短信模板包括“签名+模板”,完整的示例如下:

【钉峰会】尊敬的嘉宾,您好!您已成功报名会议,期待与您相聚${location}! 以下是您现场签到二维码链接 :${url},会议签到时间:${time},会议地址:${address}。诚邀您莅临!

标注:

  1. 【钉峰会】这个是签名;
  2. ${location}、${url}、${time}、${address} 这些是变量,到时候可动态替换成其它文案;
  3. 短信内容不宜过长,需要控制长度。


效果:

【钉峰会】尊敬的嘉宾,您好!您已成功报名会议,期待与您相聚苏州!以下是您现场签到二维码链接:https://c.tb.cn/v.6rQ87G,会议签到时间:2022-12-23 10:00,会议地址:苏州市大观园酒店5层301贵宾厅。诚邀您莅临!

将“短信服务订单编号”和“短信模板”告知给客服,让他们帮忙添加,添加成功后,他们会通知。

3. 创建宜搭应用和报名页面

3.1 创建宜搭应用

访问 https://www.aliwork.com 宜搭官网,然后用钉钉扫码登录相对应的组织,创建一个宜搭应用,用于大会用户报名短信通知使用。

2.2 创建报名页面

进入刚刚创建的宜搭应用,点击+号创建一个“普通表单”,取名为“XXX报名”

3.3 搭建报名页面

在表单设计器中,拖入需要使用的字段、图片、文字等。其中联系方式字段(手机号)必填,否则短信无法发送。

3.4 设置报名页短链

切换到“页面发布”的tab,然后打开“公开访问”的开关,填入短链接名字。

这样,访问:https://ycu74v.aliwork.com/o/message_test,即可看到报名页的实际效果。

4. 配置短信连接器

因为阿里云官方短信和三方服务商短信提供的加密方式不一样,导致连接器的配置方式也不一样。

其中阿里云官方使用的是 AK+SK 的动态认证方式,目前宜搭连接器不支持这种认证方式,所以需要使用到 FaaS 连接器来解决。

而三方服务商使用的是 AppCode 的加密认证方式,可以直接使用宜搭的普通连接器。接下来,讲解两种连接器的配置方式。

4.1 阿里云官方短信 FaaS 连接器配置

操作路径如下

连接器创建入口:宜搭官网 -> 平台管理 -> 连接器工厂 -> 连接器管理 -> 创建连接器 -> FaaS 自定义连接器

点击“确定”后,输入“连接器显示名称”和“连接器介绍”,再点击“下一步”。

填写“名称”,然后将下列代码复制到 Body 中,并点击“解析 Body”。

{
"phoneNumbers": "15915915901",
"signNum": "sign",
"templateCode": "code",
"templateParam": "param",
"accessKeyId": "ak",
"accessKeySecret": "as"
}

其中“accessKeyId”和“accessKeySecret”是必填选项,填入自己在阿里云注册的账号的 AK 和 SK 即可。解析 Body 后点击“保存”。

将下列代码复制到 Response Body 中,并点击“解析 Body”。解析 Body 后点击“保存”。

{
"success": true,
"message": "",
"code": ""
}

如何获取 AK 和 SK 呢?访问页面地址:https://usercenter.console.aliyun.com/?#/manage/ak

保存成功之后,点击“前往云 IDE 开发”按钮,跳转到阿里云 FaaS 云端开发设计器。

修改设计器中的 pom.xml 和 src/FaasEntry.java 两个文件。

  • pom.xml 中新增依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.9</version>
</dependency>

  • src/FaasEntry.java 代码完全替换成下面这一份
package com.alibaba.work.faas;

import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import com.alibaba.work.faas.common.AbstractEntry;
import com.alibaba.work.faas.common.FaasInputs;
import com.alibaba.work.faas.util.DingOpenApiUtil;
import com.alibaba.work.faas.util.YidaConnectorUtil;

import com.aliyun.fc.runtime.Context;
import com.aliyun.tea.*;
import com.aliyun.dysmsapi20170525.*;
import com.aliyun.dysmsapi20170525.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;

/**
* @Description 宜搭Faas连接器函数入口,FC handler:com.alibaba.work.faas.FaasEntry::handleRequest
* @Version 2.0
* @Author bufan
**/
public class FaasEntry extends AbstractEntry {

@Override
public JSONObject execute(FaasInputs faasInputs, Context context) {
context.getLogger().info("faasInputs: " + JSON.toJSONString(faasInputs));
/**
*用于调用钉钉开放平台OpenAPI的accessToken, 宜搭提供的, 仅申请了钉钉开放平台的部分OpenAPI的调用权限
*如果此accessToken不满足您的需求, 可在钉钉开放平台创建您自己的钉钉应用并获取appKey和APPSecret并使用com.alibaba.work.faas.util.DingOpenApiUtil获取您自己的accessToken
* @see com.alibaba.work.faas.util.DingOpenApiUtil#getCustomAccessTokenThenCache(String, String)
*/
String accessToken = (String)faasInputs.getYidaContext().get("accessToken");
//设置钉开放平台访问token, 后续无需再设置
DingOpenApiUtil.setAccessToken(accessToken);
/**
*调用宜搭的前端消费接口时使用
*/
String consumeCode = (String)faasInputs.getYidaContext().get("consumeCode");
//设置连接器消费码, 后续无需再设置
YidaConnectorUtil.setConsumeCode(consumeCode);

Map<String,Object> input = faasInputs.getInputs();
String ak = (String)input.get("accessKeyId");
String as = (String)input.get("accessKeySecret");
String phoneNumbers = (String)input.get("phoneNumbers");
String signNum = (String)input.get("signNum");
String templateCode = (String)input.get("templateCode");
String templateParam = (String)input.get("templateParam");

JSONObject result = new JSONObject();
result.put("success",true);
result.put("message","");
result.put("code","");

try {
com.aliyun.dysmsapi20170525.Client client = createClient(ak, as);
SendSmsRequest sendSmsRequest = new SendSmsRequest();
// 复制代码运行请自行打印 API 的返回值
sendSmsRequest.setPhoneNumbers(phoneNumbers);
sendSmsRequest.setSignName(signNum);
sendSmsRequest.setTemplateCode(templateCode);
sendSmsRequest.setTemplateParam(templateParam);
SendSmsResponse res = client.sendSms(sendSmsRequest);
String resCode = res.getBody().getCode();
if ("ok".equalsIgnoreCase(resCode)) {
return result;
}
else {
System.out.println("invoke failed:" + JSON.toJSONString(res));
result.put("success",false);
result.put("message",res.getBody().getMessage());
result.put("code",resCode);
return result;
}
}
catch(Exception ex) {
System.out.println("meet errot");
ex.printStackTrace();
result.put("success",false);
result.put("message",ex.getMessage());
return result;
}
}

private static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
Config config = new Config()
// 您的AccessKey ID
.setAccessKeyId(accessKeyId)
// 您的AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// 访问的域名
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}


}

切换到“源代码管理”界面,点击“暂存并提交代码”,将代码推送到远程 Git 仓库中保存。

切换到“设置WB”,然后选择“线上环境”,点击“部署”,将 FaaS 服务部署到线上去。

点击“继续部署”按钮。

上述操作完成后,一个 FaaS 连接器就 OK 了。

4.2 三方服务商短信连接器配置

如果购买的是三方服务商的短信服务,那么他们会提供相对应的 API 调用和简单身份认证调用方式。

访问地址:https://market.aliyun.com/products/57126001/cmapi030445.html?#sku=yuncode2444500001

操作路径如下

连接器创建入口:宜搭官网 -> 平台管理 -> 连接器工厂 -> 连接器管理 -> 创建连接器 -> HTTP 自定义连接器

填写供应商给的 API 相关配置,“保存”并点击“下一步”。

身份验证类型选择“阿里云API网关”,然后点击“下一步”

根据三方提供的 API,进行参数填写。

“保存”信息之后,然后切换到“鉴权管理”页面“添加鉴权模板”。

其中连接器选择刚刚新建的“三方服务商短信”,“App Code”将服务商给的 Code 复制过来。

切换到“连接器管理”页面,找到刚刚新建的“三方服务商短信”,然后点击“测试”按钮进行测试。

填入“短信内容”和“手机号”,点击“测试操作”,下面 RESPONSE 会提示发送是否成功。

如果按照预期的返回,那么短信发送就会成功。

5. 使用短信连接器

5.1 阿里云官方短信 FaaS 连接器使用

首先,访问“集成&自动化”。

点击“从空白新建”,然后输入名称,选择触发表单,点击“确认”。

配置表单事件触发为“创建成功”。

新增一个“连接器”节点。

选择“自定义”连接器中,自己新建的“短信发送”的连接器。

将连接器需要的参数配置进去,点击“保存”,然后“发布”。

消息参数:

【钉峰会】尊敬的嘉宾,您好!您已成功报名会议,期待与您相聚${location}! 以下是您现场签到二维码链接 :${url},会议签到时间:${time},会议地址:${address}。诚邀您莅临!
{"location":"苏州","name":"https://c.tb.cn/v.6rQ87G","time":"2022-12-23 10:00","address":"苏州市大观园酒店5层301贵宾厅"}

在表单提交一条数据,输入自己姓名和手机号。

提交成功之后,如果连接器配置和功能都没问题的话,就会收到一条短信。

5.2 三方服务商短信连接器使用

首先,访问“集成&自动化”。

点击“从空白新建”,然后输入名称,选择触发表单,点击“确认”。

配置表单事件触发为“创建成功”。

新增一个“连接器”节点。

选择“自定义”连接器中,自己新建的“发送短信”的连接器。

将连接器需要的参数配置进去,点击“保存”,然后“发布”。

消息参数参考如下:

在表单提交一条数据,输入自己姓名和手机号。

提交成功之后,如果连接器配置和功能都没问题的话,就会收到一条短信。

5.3 如何排查短信发送失败的原因

如果短信没有发送成功,可能属于配置错误导致,此时可以通过日志来进行排查。

路径:进入对应应用 >> 集成&自动化 >> 更多 >> 运行日志

运行日志可以看到连接器执行是否成功,若执行失败,可查看具体失败原因,并及时修正连接器的配置。

执行成功的情况。

6. 常见问题

6.1 已购买的短信服务非阿里云平台,如何实现发送短信?

如果购买的是其它平台或者自有平台的短信服务,只要提供了公网短信服务 API(接口),并且符合宜搭连接器的几种鉴权方式之一,则可以参考文档中的【阿里云三方服务商短信服务】的方式配置,原理一致。

7. 附录

7.1 内网穿透之 HTTP 穿透

短信服务需要公网服务,开发者在临时体验开发时往往没有公网域名或者公网 IP,本工具提供了一个公网代理服务,目的是方便开发测试。

工具地址:点击此处

--------------------获取宜搭最新信息,欢迎关注我们--------------------

Copyright © 2024钉钉(中国)信息技术有限公司和/或其关联公司浙ICP备18037475号-4