通过API发送短信

更新时间:2025-02-08 06:16:53

短信服务提供短信发送、发送状态查询等API接口,您可以通过调用API接口申请签名和模板,并给目标用户发送短信。

您可以根据业务需要和自身情况选择合适的方式调用短信服务API:

  • 阿里云OpenAPI 开发者门户

    适用于习惯交互式操作界面的场景,或者初次使用阿里云产品的开发者用户。您可以在OpenAPI开发者门户中调试和获取SDK请求示例。

  • 短信服务SDK

    支持多种编程语言,包括JavaGoC#PHPNode.js/TypeScriptPython。使用SDK集成短信服务,可提升您使用短信服务的开发效率。

  • 自定义封装API调用(不推荐)

    阿里云SDK已经封装了签名、超时、重试等机制,我们建议您使用SDK进行集成,降低开发成本。如果您需要自行封装请求来进行API调用,请参见SendSms签名示例

本文将以SDK的方式引导您使用短信服务。您可以先通过OpenAPI 开发者门户,查看、体验短信服务API后,根据本文指引开始集成短信服务API。

准备工作

准备事项

说明

相关文档

准备事项

说明

相关文档

账号注册

实名认证

个人认证和企业认证可使用的功能不完全相同,发送推广短信、国际/港澳台短信必须为企业认证

  • 个人认证表示账号持有者是个人,以个人身份使用短信服务

  • 企业认证表示账号持有者是企业或政府部门,以企业身份使用短信服务。

使用须知

服务开通

登录短信服务控制台,开通短信服务。

资质申请

根据运营商实名发送短信的要求,请登录控制台资质管理,提交资质申请并等待审核通过。

说明

申请资质仅可通过控制台操作,并不代表使用API无需申请资质。

申请资质

用户权限

说明

阿里云主账号拥有较高权限,建议您通过RAM用户进行API调用和日常运维。

请确保您所调用APIRAM用户已有短信服务相关权限:

  • AliyunDysmsFullAccess:管理短信服务的权限。

如果您需要新建自定义权限,请参见授权信息

创建RAM用户

RAM用户授权

AccessKey ID

您可以登录RAM控制台,单击RAM用户名称查看。

创建AccessKey

AccessKey Secret

创建后不支持查看。若本地无备份,建议重新创建一对AccessKey使用。

设置预警

为保障您的业务稳定和资金安全,建议您登录控制台通用设置-国内消息设置页面,设置联系人并开启和配置验证码防盗刷监控发送量预警套餐包余量预警发送频率预警等。当触发预警时,平台会通知到联系人,联系人可第一时间收到预警通知后及时处理。

说明

建议您阅读验证码防盗刷,了解更多验证码盗刷的防御方式。

发送量预警

套餐包余量预警

发送频率预警

环境配置

本文以Java语言为例,进行后续操作。更多语言及其SDK安装方式,请参见安装与使用教程

  1. 检查Java环境:您的Java版本需高于Java 8。Java环境配置的方法,请参见Windows搭建Java开发环境

  2. 安装SDK:请通过配置Maven依赖,完成短信服务SDK的安装。

    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>dysmsapi20170525</artifactId>
      <version>3.1.1</version>
    </dependency>
  3. 配置环境变量:为避免在代码中显式地编码访问密钥(AccessKey)而造成泄露,建议您把AccessKey配置到环境变量,通过环境变量进行读取。环境变量配置方法,请参见Linux、macOSWindows系统配置环境变量

  4. 配置代理(可选):如果您需要通过代理服务器访问,可通过SDK进行配置,请参见代理配置

API基本信息

短信服务所提供的API基本信息参见如下:

接口版本

2017-05-25

接口风格

RPC

服务接入点

(Endpoint)

公网接入地址 dysmsapi.aliyuncs.com

HTTP调用使用端口为80,HTTPS调用使用端口为443

建议您在调用API接口前,阅读接口参数规范与使用说明。在线调试 | API文档

API调用流程

image
  1. 申请短信签名:使用CreateSmsSign接口,签名信息需遵守短信签名规范

  2. 申请短信模板:使用CreateSmsTemplate接口,模板内容需遵守短信模板规范

    申请短信模板时关联的签名仅供审核使用,与实际发送短信时使用的签名无关。

    国内短信模板与国际/港澳台短信模板不通用。

  3. 等待审核:申请的签名和模板,均审核通过后才可以发送短信。您可使用接口或回执消息查看签名和模板的审核状态。

    API接口

    使用GetSmsSignGetSmsTemplate接口查询签名和模板的审核状态。

    您也可以使用QuerySmsSignListQuerySmsTemplateList接口查询签名和模板列表,根据出参AuditStatus判断。

    回执消息

    通过配置回执并开发对接,具体操作请参见配置回执消息,仅支持HTTP批量推送模式。

    SignSmsReport(签名审核状态)TemplateSmsReport(模板审核状态)

  4. 发送短信:使用SendSms接口,或使用SendBatchSms接口批量发送短信。

    发送短信前确保您账户余额充足。更多详情,请参见计费概述

    重要

    应工信部及各级运营商要求,短信发送需在运营商侧进行实名制报备,阿里云已按照运营商要求持续向运营商发起报备动作。若部分运营商网关未报备,可能导致短信发送被拦截。

    实名制报备将在您执行短信发送操作后自动进行,无需您手动发起,预计3-5个工作日报备生效。建议您:

    • 检查您使用的签名是否提交了真实的企业实名制信息,如尚未提供请在资质管理页面提交并等待审核通过; 如您已提供企业实名制信息,阿里云会尽快推动运营商实名制报备进展。

    • 在测试阶段,对三大运营商手机号进行少量多次发送,以便覆盖多条通道的报备,可提高正式发送短信时的成功率。

  5. 查看短信发送详情:您可使用接口或回执消息查看短信发送详情。

    API接口

    使用QuerySendDetails接口查询短信发送状态。

    回执消息

    通过配置回执并开发对接,具体操作请参见配置回执消息。支持以下两种方式:

    SmsReport(状态报告接收):轻量消息队列消费模式 | HTTP批量推送模式

  6. 获取用户回复内容:您发送短信后,用户回复的短信内容即为上行短信,需配置回执消息获取。

    回执消息

    通过配置回执并开发对接,具体操作请参见配置回执消息。支持以下两种方式:

    SmsUp(上行消息接收):轻量消息队列消费模式 | HTTP批量推送模式

更多接口信息,请参见API概览

代码示例

使用SDK发送短信(调用SendSms接口)的代码示例如下,请根据注释完成参数填写。

package com.aliyun.sample;

import com.aliyun.teaopenapi.models.Config;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import static com.aliyun.teautil.Common.toJSONString;

public class Sample {
    public static Client createClient() throws Exception {
        Config config = new Config()
                // 配置 AccessKey ID,请确保代码运行环境设置了环境变量。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 配置 AccessKey Secret,请确保代码运行环境设置了环境变量。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
                // System.getenv()方法表示获取系统环境变量,请配置环境变量后,在此填入环境变量名称,不要直接填入AccessKey信息。
        
        // 配置 Endpoint
        config.endpoint = "dysmsapi.aliyuncs.com";

        return new Client(config);
    }

    public static void main(String[] args) throws Exception {
        // 初始化请求客户端
        Client client = Sample.createClient();

        // 构造请求对象,请填入请求参数值
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers("1390000****")
                .setSignName("阿里云")
                .setTemplateCode("SMS_15305****")
                .setTemplateParam("{\"name\":\"张三\",\"number\":\"1390000****\"}");

        // 获取响应对象
        SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);

        // 响应包含服务端响应的 body 和 headers
        System.out.println(toJSONString(sendSmsResponse));
    }
}

您可以访问 OpenAPI 门户,查看各语言 SDK 请求完整示例。如果您需要自行封装请求来进行API调用,请参见SendSms签名示例

常见问题

视频教程

通过API发送短信

  • 本页导读 (1)
  • 准备工作
  • 环境配置
  • API基本信息
  • API调用流程
  • 代码示例
  • 常见问题
  • 视频教程