本文为您介绍JAVA调用短信发送API的操作流程。
注意 使用短信服务新版SDK调用API接口,请查看新版SDK参考和API参考。
为了访问短信服务,您需要有一个阿里云账号。如果没有,可首先按照如下步骤创建阿里云账号:
为了使用短信发送API-JAVA SDK,您必须申请阿里云的访问密钥。
阿里云访问秘钥是阿里云为用户使用 API(非控制台)来访问其云资源设计的“安全口令”。您可以用它来签名 API 请求内容以通过服务端的安全验证。
该访问秘钥成对(AccessKeyId 与 AccessKeySecret)生成和使用。每个阿里云用户可以创建多对访问秘钥,且可随时启用(Active)、禁用(Inactive)或者删除已经生成的访问秘钥对。
您可以通过阿里云控制台的秘钥管理页面创建、管理所有的访问秘钥对,且保证它处于“启用”状态。由于访问秘钥是阿里云对 API 请求进行安全验证的关键因子,请妥善保管你的访问秘钥。如果某些秘钥对出现泄漏风险,建议及时删除该秘钥对并生成新的替代秘钥对。
短信签名
根据用户属性来创建符合自身属性的签名信息。企业用户需要上传相关企业资质证明,个人用户需要上传证明个人身份的证明。
注意 短信签名需要审核通过后才可以使用。
短信模板
短信模板,即具体发送的短信内容。
短信模板可以支持验证码、短信通知、推广短信、国际/港澳台消息四种模式。验证码和短信通知,通过变量替换实现个性短信定制。推广短信不支持在模板中添加变量。国际/港澳台消息只能使用国际/港澳台短信模版发送短信。
说明 短信模板需要审核通过后才可以使用。
为了成功发送一条短信通知,您至少需要完成以下步骤
参数名称 | 参数类型 | 必填与否 | 样例取值 | 参数说明 |
---|---|---|---|---|
PhoneNumbers | String | 必须 | 15000000000 | 短信接收号码,支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为:国际区号+号码,如“85200000000”。 |
SignName | String | 必须 | 云通信 | 短信签名。 |
TemplateCode | String | 必须 | SMS_0000 | 短信模板ID,发送国际/港澳台消息时,请使用国际/港澳台短信模版。 |
TemplateParam | String | 可选 | {"code":"1234","product":"ytx"} | 短信模板变量替换JSON串,友情提示:如果JSON中需要带换行符,请参照标准的JSON协议。 |
SmsUpExtendCode | String | 可选 | 90999 | 上行短信扩展码,无特殊需要此字段的用户请忽略此字段。 |
OutId | String | 可选 | abcdefgh | 外部流水扩展字段。 |
出参名称 | 出参类型 | 样例取值 | 参数说明 |
---|---|---|---|
RequestId | String | 8906582E-6722 | 请求ID。 |
Code | String | OK | 状态码。返回OK代表请求成功,其他错误码详见错误码列表。 |
Message | String | 请求成功 | 状态码的描述。 |
BizId | String | 134523^4351232 | 发送回执ID,可根据该ID查询具体的发送状态。 |
package com.demo.config;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(SmsProperties.class)
public class SmsConfiguration {
private SmsProperties smsProperties;
public SmsConfiguration(SmsProperties smsProperties) {
this.smsProperties = smsProperties;
}
/**
* 发送验证码
*
* @param phone 手机号
* @param code 验证码
* @param templateCode 短信模板
* @param param 模板中的变量替换参数
*/
public void sendSms(String phone, int code, String templateCode, String param) {
try {
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", smsProperties.getAccessKeyId(), smsProperties.getAccessKeySecret());
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", smsProperties.getProduct(), smsProperties.getDomain());
IAcsClient acsClient = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
//必填:待发送手机号
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName(smsProperties.getSignName());
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(templateCode);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam("{\"" + param + "\":\"" + code + "\"}");
//hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
//请求成功
if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 生成验证码
*
* @param len 长度
* @return
*/
public int randomNum(int len) {
StringBuffer sb = new StringBuffer("1");
for (int i = 0; i < len; i++) {
sb.append("0");
}
int value = Integer.parseInt(sb.toString());
return (int) (Math.random() * (value * 0.9) + (value * 0.1));
}
}
package com.demo.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
/**
* 短信API产品名称
*/
private String product;
/**
* 短信API产品域名
*/
private String domain;
/**
* 你的accessKeyId,参考本文档步骤2
*/
private String accessKeyId;
/**
* 你的accessKeySecret,参考本文档步骤2
*/
private String accessKeySecret;
/**
* 短信签名-可在短信控制台中找到
*/
private String signName;
}
package com.demo.config;
/**
* 短信模板枚举
*/
public enum TemplateEnum {
/**
* 登录确认验证码
*/
LOGIN_NOTARIZE("code", "SMS_179870077", 101),
/**
* 登录异常验证码
*/
LOGIN_ABNORMITY("code", "SMS_179870076", 102),
/**
* 身份验证验证码
*/
AUTHENTICATION("code", "SMS_179870078", 103),
/**
* 用户注册验证码
*/
USER_REGISTER("code", "SMS_179870075", 104),
/**
* 修改密码验证码
*/
UPDATE_PASSWORD("code", "SMS_179870074", 105),
/**
* 信息变更验证码
*/
UPDATE_MSG("code", "SMS_179870073", 106);
private String param;
private String templateCode;
private Integer code;
TemplateEnum(String param, String templateCode, Integer code) {
this.param = param;
this.templateCode = templateCode;
this.code = code;
}
public String getParam() {
return param;
}
public String getTemplateCode() {
return templateCode;
}
public Integer getCode() {
return code;
}
public static TemplateEnum getTemplateEnum(Integer code) {
if (null != code) {
for (TemplateEnum templateenum : TemplateEnum.values()) {
if (code == templateenum.getCode()) {
return templateenum;
}
}
}
return null;
}
}
package com.demo.controller;
import com.demo.config.TemplateEnum;
import com.demo.config.SmsConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SmsController {
@Autowired
private SmsConfiguration smsConfiguration;
@RequestMapping("/sendSms")
public void sendSms(
@RequestParam("phone") String phone,
@RequestParam("code") int code
) {
smsConfiguration.sendSms(phone, smsConfiguration.randomNum(6), TemplateEnum.getTemplateEnum(code).getTemplateCode(), TemplateEnum.getTemplateEnum(code).getParam());
}
}
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
#阿里云短信配置
sms:
product: Dysmsapi #短信API产品名称
domain: dysmsapi.aliyuncs.com #短信API产品域名
accessKeyId: #你的accessKeyId,参考本文档步骤2
accessKeySecret: #你的accessKeySecret,参考本文档步骤2
signName: #短信签名-可在短信控制台中找到
4.0.0
org.example
springboot-sms
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.4.3
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-configuration-processor
com.aliyun
aliyun-java-sdk-core
4.0.6
com.aliyun
aliyun-java-sdk-dysmsapi
1.1.0
org.projectlombok
lombok