整合篇:零基础学习与使用SMS

配套资料,免费下载
链接:https://pan.baidu.com/s/1jA217UgqXpONi_fV-aOzqw
提取码:bm2g
复制这段内容后打开百度网盘手机App,操作更方便哦

1、产品介绍

阿里云短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力。支持向国内和国际快速发送验证码、短信通知和推广短信,服务范围覆盖全球200多个国家和地区。国内短信支持三网合一专属通道,与工信部携号转网平台实时互联。电信级运维保障,实时监控自动切换,到达率高达99%。完美支撑双11期间20亿短信发送,6亿用户触达。

2、收费标准

2.1、计费方式

短信服务是按量计费模式,同时支持国内短信套餐包,根据短信模板的不同,进行梯度计费。

  • 国内短信:支持按量付费和国内短信套餐包。更多信息,请参见国内短信定价
  • 国际/港澳台短信:支持按量付费和国际/港澳台短信套餐包。更多信息,请参见国际/港澳台短信定价

若短信发送5分钟后还未返回状态,将先扣费,实际返回状态后根据失败条数进行短信量返补。国内短信接口调用失败及运营商返回失败状态,都不会扣费;国际短信按导入号码成功计费,即运营商反馈失败也要计费。

国内短信月消费金额=月累计短信成功发送量所在的档位×月累计短信发送成功量。例如:1~10万单价是0.045元/条,10~30万单价是0.04元/条,若您当月累计用了15万,则消费金额为15万×0.04元/条。

2.2、计费规则

费用统计标准资费

  • 当月消费金额仅供参考,最终以月底结算账单为准。最终抵扣代金券的结算费用,请前往阿里云费用中心消费总览查看。
  • 当月计费单价仅供参考,该计费单价只表示当月的平均单价,计费单价=当月金额÷当月计费量,且计费单价会精确到小数点后四位,所以会出现计费单价×当月计费量和当月消费金额有误差的情况,最终以月底结算账单为准。
  • 计费单价根据当月发送总量实时变动,自动跨档。跨档后当月发送总量按新阶梯价计算,请注意刷新,查看短信服务定价详情。
  • 每个自然月最后一天24:00:00结算当月收到回执的所有短信的账单,下月收到回执将计入下月账单中。

短信计费规则说明

  • 短信服务产品属于后付费产品,即发送短信成功才会开始计费。不同短信模板的单价不同,产生费用后,进行累计计费,每5分钟出账一次,每个月月底进行扣费。
  • 短信服务采用的是T+2的模式,即当月出具账单后,在下下个月可以申请发票。例如,10月31日出具10月完整账单,12月申请10月的发票。
  • 阿里云账户余额为0,或阿里云账户处于欠费状态时,即使国内短信套餐包仍有余量也无法发送短信。

发送量统计和计费统计规则说明

  • 短信是按照运营商回执状态报告计费,即发送成功计费,月底出账。
  • 短信发送量统计是按照提交给运营商的短信查询,计费是按照运营商回执状态报告计费,所以发送量统计和计费数据会存在误差。

2.3、字数计算

国内短信内容长度计算规则

  • 短信长度(字数)=短信模版内容字数+签名字数。

  • 汉字、字母、数字、符号(不区分全角和半角),都按照一个字计算。

  • 短信长度不超过70个字,按照一条短信计费;超过70个字,即为长短信,按照67字/条拆分成多条计费。

    例如:短信长度为160个字,将会被分隔成67字、67字、26字三条进行计费。

国际/港澳台短信内容长度计算规则

  • 短信长度(字数)=短信模版内容字数+签名字数。

  • 纯英文。

    • 字母、数字、符号(不区分全角和半角),都按照一个字计算。

    • 短信长度不超过140字时,按照1条短信计费。超过140字时为长短信,按134字/条分隔成多条计费(纯英文签名符号为[ ])。

      例如:短信长度为300个字,将会被分隔成134字、134字、32字三条进行计费。

  • 非纯英文。

    • 汉字、字母、数字、符号(不区分全角和半角),都按照一个字计算。

    • 短信长度不超过70个字,按照一条短信计费;超过70个字,即为长短信,按照67字/条拆分成多条计费。

      例如:短信长度为160个字,将会被分隔成67字、67字、26字三条进行计费。

2.4、欠费与扣费

  • 账单出账时间通常在当前计费周期结束后4小时内。系统会自动从您账户余额中扣除账单金额,账户余额不足时,转为欠费状态。当账号余额不足时,系统会给账号的注册手机发送短信通知。
  • 当账户余额不足以支付账单金额,短信服务处于欠费状态时,阿里云将暂停为您提供服务,不允许发送短信和使用资源包。建议您在欠费后及时补足欠费,以免服务停止,对您的业务造成损失。当您充值并补足欠费后,服务会自动开启,可以继续使用。
  • 欠费停服后,请于7天内及时充值补足欠费,服务会自动恢复。欠费超过7天,将视为您主动放弃服务,数据会被清理且不可恢复。

2.5、发送限制

在实际业务场景中,例如APP或网站登录时,可能会有用户频繁获取短信验证码或者通过短信通知方式找回密码的操作,为了限制平台短信被恶意调用、在短时间内大量发起短信发送请求,阿里云对短信发送行为进行以下流控限制。

限制项 限制说明 备注
短信验证码 使用同一个签名,默认情况下对同一个手机号码发送短信验证码,1条/分钟,5条/小时,10条/天。您可以在控制台系统设置>国内消息设置中修改发送频率。一个手机号码通过阿里云短信服务平台只能收到40条/天。 若在发送验证码时提示业务限流,建议根据以上业务调整接口调用时间。
短信通知 使用同一个签名和同一个短信模版ID,对同一个手机号码发送短信通知,最多支持50条/日。 若在发送短信通知时提示业务限流,建议根据以上业务调整接口调用时间。
推广短信 使用同一个签名和同一个短信模版ID,对同一个手机号码发送推广短信,最多支持50条/日。 若在发送推广短信时提示业务限流,建议根据以上业务调整接口调用时间。

3、账号注册

我们需要使用阿里云提供的SMS(短信服务),因此首先我们需要注册一个账号,如果不想注册,也可以使用淘宝、支付宝账号登录。

注册地址:https://account.aliyun.com/register/register.htm

登录地址:https://account.aliyun.com/login/login.htm

4、实名认证

在使用阿里云提供的各项服务之前,我们需要实名认证。

第一步:进入控制台

第二步:在右上角找到用户头像,把鼠标放上去,会弹出一个下拉菜单,里边就有实名认证选项

image-20210114152015348

5、账号充值

我们为了学习发送短信,不至于要去买很贵的短信包,没有必要,我们采用按量付费,也就是发送一条花一条短信的钱,这样,我们的学习成本就大大降低了,为了保证短信能够发送成功,请往自己的账户充值一些金额,多少都可以,建议1元就行了。

第一步:进入控制台

第二步:在搜索框旁边找到费用,把鼠标放上去,会弹出一个下拉菜单,里边就有充值选项

image-20210114152308767

6、获取AccessKey

访问密钥AccessKey(AK)相当于登录密码,只是使用场景不同。AccessKey用于程序方式调用云服务API,而登录密码用于登录控制台。如果您不需要调用API,那么就不需要创建AccessKey。

  1. 使用云账号登录RAM控制台

  2. 在左侧导航栏的人员管理菜单下,单击用户

  3. 用户登录名称/显示名称列表下,创建一个测试用户。第一次登录肯定没有用户,请自行创建一个用户。创建时请勾选上“编程访问”。

image-20210114153851886

image-20210114154249302

注意:AccessKey Secret只在创建时显示,不提供查询,请妥善保管。如果AccessKey泄露或丢失,则需要创建新的AccessKey,最多可以创建2个AccessKey。

用户是创建好了,可以创建多个用户,这样方便给不同的人使用,但是现在创建的账户没有任何权限,我们需要给这个账户赋予使用”短信服务“的权限。

image-20210114193941149

image-20210114194013548

image-20210114194041953

image-20210114194403847

7、创建短信签名

短信签名就类似于那个短信的标题,如何创建,请打开短信控制台,在左侧导航栏找到国内消息

image-20210114155629899

您好,由于国家政策监管要求,云通信短信服务审核管理规则升级,自2020年12月17日起,未上线业务不支持申请验证码签名使用。

目前个人业务只有个人已备案的可以核实业务的网站、个人开发的已经上架的app可以申请签名使用。其他场景是企业相关的,个人申请时需要提供企业的营业执照和授权委托书来申请的。

建议您有已备案的可以核实业务的网站,或者有已经上架的app之后再申请签名使用。

这里必须要重点说明一下,现在国家为了防止短信诈骗,对短信的申请非常的严格,不像前两年你随便都能申请,现在企业申请肯定是没问题的,因为你出问题了,能最快速度找到你的企业,但是对于个人来说,基本上你申请百分之九十都是失败的,不过,没有关系,申请失败以后(大概率会不通过),你需要提交一个工单,这个工单的作用就是用来和阿里云的售后那边进行沟通,如果你不会提交工单也也没有关系,你可以找在线人工客服,你和他聊,他就知道你什么意思了,最好你能给他个电话,你俩电话聊一下,他会带着你一步一步帮你提交工单并且帮你的工单审核进行加速处理,还是很不错的。

接下来短信模板会存在和短信签名一样的问题,请使用我提供的两种方法自行解决,如果都不能解决,那就没办法了,先看看代码吧,这个创建问题先遗留下来。

image-20210114173136656

申请成功以后会是这样子,这是我以前的一个账号,就先给大家进行展示了

image-20210114180754075

你申请成功短信签名的就不要往下看了,没有申请成功的,继续往下走:

如何提交工单:

第一步:打开阿里云控制台,在搜索框的右侧找到“工单”,把鼠标放上去,会弹出一个小框,点击第一个“提交工单

image-20210114173926025

第二步:在输入框输入“人工”,发送两次,才会弹出“联系人工”这个按钮

image-20210114174121974

第三步:在弹出的对话框中输入“短信服务”进行搜索,然后点击审核问题”,然后确定

image-20210114174314656

image-20210114174358915

第四步:按照我提供的格式来填写,这是我跟客服沟通过以后,他让我这么写的,工单的处理可能会有点慢,这个得看处理速度了,时间上很大的不确定性,如果你联系客服,他可能会帮你加速,点击“确定”提交工单,然后就等着就行了

image-20210114174705885

image-20210114174916436

如何联系人工:

第一步:打开阿里云官网,点击这个小图标,如下所示:

image-20210114175050956

第二步:找到“服务”这一项,下边会有各种联系方式,看你自己选哪个了,但是一般是红色框框那一行用的比较多,在弹出的对话框页面中,输入人工就行了。

image-20210114175116496

8、创建短信模板

短信模板就短信的正文内容,如何创建,请打开短信控制台,在左侧导航栏找到国内消息。找到“模板管理”,然后点击创建即可。

image-20210114175622938

image-20210114175842941

申请成功以后会是这样子,这是我以前的一个账号,就先给大家进行展示了

image-20210114180851448

9、编码发送短信

9.1、导入依赖

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>4.5.3</version>
</dependency>

9.2、发送短信

@Test
public void sendSms() {
    /**
     * regionId:cn-hangzhou
     * accessKeyId:之前申请过
     * accessSecret:之前申请过
     */
    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
    IAcsClient client = new DefaultAcsClient(profile);

    CommonRequest request = new CommonRequest();
    request.setSysMethod(MethodType.POST);//请求方式,无需改变
    request.setSysDomain("dysmsapi.aliyuncs.com");//请求地址,无需改变
    request.setSysVersion("2017-05-25");//请求版本,无需改变
    request.setSysAction("SendSms");//请求动作,可以改变
    request.putQueryParameter("PhoneNumbers", "15633029014");//接收短信的电话号码
    request.putQueryParameter("SignName", "果然新鲜");//发送短信的短信签名
    request.putQueryParameter("TemplateCode", "SMS_174989915");//发送短信的短信模板
    request.putQueryParameter("TemplateParam", "{'code':123456}");//发送短信的模板参数(也就是验证码)
    try {
        CommonResponse response = client.getCommonResponse(request);
        System.out.println(response.getData());
    } catch (ServerException e) {
        e.printStackTrace();
    } catch (ClientException e) {
        e.printStackTrace();
    }
}
{"RequestId":"3F615F5F-346F-4764-AFBF-0CE5C95CD5D8","Message":"OK","BizId":"502813610623272119^0","Code":"OK"}

9.3、查询详情

分页查询:

@Test
public void QuerySendDetails() {
    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessSecret>");
    IAcsClient client = new DefaultAcsClient(profile);

    CommonRequest request = new CommonRequest();
    request.setSysMethod(MethodType.POST);//请求方式,无需改变
    request.setSysDomain("dysmsapi.aliyuncs.com");//请求地址,无需改变
    request.setSysVersion("2017-05-25");//请求版本,无需改变
    request.setSysAction("QuerySendDetails");//请求动作,可以改变
    request.putQueryParameter("PhoneNumber", "15633029014");//要查询的电话号码
    request.putQueryParameter("SendDate", "20210114");//要查询的发送日期
    request.putQueryParameter("PageSize", "20");//要查询的记录条数
    request.putQueryParameter("CurrentPage", "1");//要查询的当前页数
    try {
        CommonResponse response = client.getCommonResponse(request);
        System.out.println(response.getData());
    } catch (ServerException e) {
        e.printStackTrace();
    } catch (ClientException e) {
        e.printStackTrace();
    }
}
{
	"TotalCount": 2,
	"Message": "OK",
	"RequestId": "DCCDC131-AC7D-42A6-9EBF-3C436BEEA60A",
	"Code": "OK",
	"SmsSendDetailDTOs": {
		"SmsSendDetailDTO": [{
			"TemplateCode": "SMS_174989915",
			"ReceiveDate": "2021-01-14 19:21:15",
			"PhoneNum": "15633029014",
			"Content": "【果然新鲜】您的验证码123456,该验证码5分钟内有效,请勿泄漏于他人!",
			"SendStatus": 3,
			"SendDate": "2021-01-14 19:21:12",
			"ErrCode": "DELIVERED"
		}, {
			"TemplateCode": "SMS_174989915",
			"ReceiveDate": "2021-01-14 19:12:09",
			"SendDate": "2021-01-14 19:12:04",
			"ErrCode": "DELIVERED"
		}]
	}
}

指定查询

@Test
public void QuerySendDetailsByBizId() {
    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "1");//要查询的当前页数
    request.putQueryParameter("BizId", "502813610623272119");//要查询的BizId
    try {
        CommonResponse response = client.getCommonResponse(request);
        System.out.println(response.getData());
    } catch (ServerException e) {
        e.printStackTrace();
    } catch (ClientException e) {
        e.printStackTrace();
    }
}
{
	"TotalCount": 1,
	"RequestId": "E48785A6-D2DE-43E2-B088-0407193866A3",
			"ErrCode": "DELIVERED"
		}]
	}
}

相关文章

Nacos 中的参数有很多,如:命名空间、分组名、服务名、保护...
Nacos 支持两种 HTTP 服务请求,一个是 REST Template,另一...
Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提...
Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决...
在 Nacos 的路由策略中有 3 个比较重要的内容:权重、保护阈...
前两天遇到了一个问题,Nacos 中的永久服务删除不了,折腾了...