提示:以下是本篇文章正文内容,下面案例可供参考
一、环境要求
最低要求Java 8。
二、导入依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.24</version>
</dependency>
导入依赖后,立即mvn clean package
三、配置
1.yml配置
aliyun:
sms:
region-id: cn-hangzhou
key-id: 自己的keyId
key-secret: 自己的keySecret
template-code: 可以填写自己的,也可以和我一样,直接用阿里测试的,和我一样的可以不用填写
sign-name: 可以填写自己的,也可以和我一样,直接用阿里测试的,和我一样的可以不用填写
2.properties读取配置类
package com.zzyl.properties;
import lombok.Data;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(value = "aliyun.sms")
public class SmsProperties implements InitializingBean {
private String regionId;
private String keyId;
private String keySecret;
public static String REGION_Id;
public static String KEY_ID;
public static String KEY_SECRET;
//当私有成员被赋值后,此方法自动被调用,从而初始化常量
@Override
public void afterPropertiesSet() throws Exception {
REGION_Id = regionId;
KEY_ID = keyId;
KEY_SECRET = keySecret;
}
}
四、工具类
生成随机验证码工具类
package com.zzyl.utils;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
/**
* 获取随机数工具类
* @author Li.HS
*/
public class RandomUtil {
private static final Random random = new Random();
private static final DecimalFormat fourdf = new DecimalFormat("0000");
private static final DecimalFormat sixdf = new DecimalFormat("000000");
public static String getFourBitRandom() {
return fourdf.format(random.nextInt(10000));
}
public static String getSixBitRandom() {
return sixdf.format(random.nextInt(1000000));
}
//给定数组,抽取n个数据
public static ArrayList getRandom(List list, int n) {
Random random = new Random();
HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
// 生成随机数字并存入HashMap
for (int i = 0; i < list.size(); i++) {
int number = random.nextInt(100) + 1;
hashMap.put(number, i);
}
// 从HashMap导入数组
Object[] robjs = hashMap.values().toArray();
ArrayList r = new ArrayList();
// 遍历数组并打印数据
for (int i = 0; i < n; i++) {
r.add(list.get((int) robjs[i]));
System.out.print(list.get((int) robjs[i]) + "\t");
}
System.out.print("\n");
return r;
}
}
五、Controller层
1.版本1
package com.zzyl.controller;
import com.zzyl.base.ResponseResult;
import com.zzyl.service.MsmService;
import com.zzyl.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@CrossOrigin
@RestController
@RequestMapping("/aliyun/msm")
public class MsmController {
@Autowired
private MsmService msmService;
@GetMapping("send")
public ResponseResult sendMsm() throws Exception {
String code;
//生成随机数,传递阿里云进行发送
code = RandomUtil.getFourBitRandom();
Map<String, Object> param = new HashMap<>();
param.put("code",code);
//调用service的方法,发送
boolean isSend = msmService.send(param);
if (isSend) {
return ResponseResult.success();
}else
return ResponseResult.error();
}
}
2.版本2
package com.zzyl.controller;
import com.zzyl.base.ResponseResult;
import com.zzyl.service.MsmService;
import com.zzyl.utils.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@CrossOrigin
@RestController
@RequestMapping("/aliyun/msm")
public class MsmController {
@Autowired
private MsmService msmService;
@GetMapping("aliyun/{phone}")
public R sendMsm(@PathVariable String phone){
String code;
//生成随机数,传递阿里云进行发送
code = RandomUtil.getFourBitRandom();
Map<String, Object> param = new HashMap<>();
param.put("code",code);
//调用service的方法,发送
boolean isSend = msmService.send(param,phone);
if (isSend) {
return R.ok();
}else
return ResponseResult.error();
}
}
六、service和serviceImpl层
1.service层版本1
package com.zzyl.service;
import java.util.Map;
public interface MsmService {
boolean send(Map<String, Object> param) throws Exception;
}
2.service层版本2
package com.zzyl.service;
import java.util.Map;
public interface MsmService {
boolean send(Map<String, Object> param, String phone) throws Exception;
}
3.serviceIMpl层版本1
package com.zzyl.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.zzyl.properties.SmsProperties;
import com.zzyl.service.MsmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map;
@Transactional
@Service
public class MsmServiceImpl implements MsmService {
@Autowired
private SmsProperties smsProperties;
@Override
public boolean send(Map<String, Object> param) throws Exception {
//创建客户端
Client client = new Client(new Config()
.setEndpoint("dysmsapi.aliyuncs.com")
.setAccessKeyId(smsProperties.getKeyId())
.setAccessKeySecret(smsProperties.getKeySecret()));
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setPhoneNumbers("自己在阿里云绑定的测试手机号")
//我用的测试模板,不需要自己申请资质,直接复用即可
.setSignName("阿里云短信测试")
.setTemplateParam(JSONObject.toJSONString(param))
.setTemplateCode("SMS_154950909")
.setSmsUpExtendCode("90999")
.setOutId("abcdefgh");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
client.sendSmsWithOptions(sendSmsRequest, runtime);
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
return true;
}
}
4.serviceIMpl层版本2
package com.zzyl.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.zzyl.properties.SmsProperties;
import com.zzyl.service.MsmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map;
@Transactional
@Service
public class MsmServiceImpl implements MsmService {
@Autowired
private SmsProperties smsProperties;
@Override
public boolean send(Map<String, Object> param, String phone) throws Exception {
//创建客户端
Client client = new Client(new Config()
.setEndpoint("dysmsapi.aliyuncs.com")
.setAccessKeyId(smsProperties.getKeyId())
.setAccessKeySecret(smsProperties.getKeySecret()));
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setPhoneNumbers(phone)
.setSignName("自己申请的测试签名")
.setTemplateParam(JSONObject.toJSONString(param))
.setTemplateCode("自己申请的模板")
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
client.sendSmsWithOptions(sendSmsRequest, runtime);
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
return true;
}
}
总结
步骤
1.初始化配置对象 com.aliyun.teaopenapi.models.Config 。 Config 对象存放 AccessKeyId、AccessKeySecret 、endpoint 等配置,Endpoint 如示例中的 dysmsapi.aliyuncs.com 。
Config config = new Config()
// 您的AccessKey ID
.setAccessKeyId(accessKeyId)
// 您的AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// 访问的域名
config.endpoint = "dysmsapi.aliyuncs.com";
2.实例化一个客户端,从 com.aliyun.dysmsapi20170525.Client 类生成对象 client 。 后续 request、response 从 com.aliyun.dysmsapi20170525.models 中获得。
Client client = new Client(config);
3.创建对应 API 的 Request 。 类的命名规则为 API 方法名加上 Request 。例如:
SendSmsRequest request = new SendSmsRequest();
4.设置请求类 request 的参数。 通过 request 类的属性设置必要的信息,即 API 中必须要提供的信息。
request.PhoneNumbers = "your_value"; // 该参数值为假设值,请您根据实际情况进行填写
request.SignName = "your_value"; // 该参数值为假设值,请您根据实际情况进行填写
5.通过 client 对象获得对应 request 响应 response 。
SendSmsResponse response = client.sendSms(request);
System.out.println(new Gson().toJson(response.Body));
6.调用 response 中对应的属性获得返回的参数值。 假设您需要获取 requestId :
String requestId = response.Body.requestId;
7.使用 catch() 处理报错。
String requestId = response.Body.requestId;