阿里云的短信服务平台
照着文档,开通秘钥,设置短信签名、模板等
之前照着其他博客添加了两个maven依赖,但运行时都会报错。有说是把jar包下载后自己导入项目。
最后下面三个依赖成功了
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-cms</artifactId>
<version>5.0.4</version>
</dependency>
messageUtils 需要填写自己的短信模板签名
package com.jubao.jubaobase.util;
import org.junit.Test;
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.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
public class MessageUtils {
/**
* 发送短信消息方法,返回验证码
*
* @param phone
* @return
*/
public static String sendMsg(String phone) throws Exception {
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient需要的几个参数
final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
//替换成你的AK
String access = PropertiesUtil.getValue("aliyun_access_key_id");//这里是读取properties工具类,我把变量写到配置文件类里了
String secret = PropertiesUtil.getValue("aliyun_access_key_secret");
final String accessKeyId = access;//你的accessKeyId,参考本文档步骤2
final String accessKeySecret = secret;//你的accessKeySecret,参考本文档步骤2
//初始化ascClient,暂时不支持多region(请勿修改)
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
SendSmsRequest request = new SendSmsRequest();
//使用post提交
request.setMethod(MethodType.POST);
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式
request.setPhoneNumbers(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName(" ");
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode(" ");
String checkCode = CoreUtils.randomString(6, true);//此处是生成6位数验证码工具类
//request.setTemplateParam("{\"code\":\"123\"}");//测试用,此处json一定要严格按照json格式书写
request.setTemplateParam("{\"code\":\""+checkCode+"\"}");
//可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId("yourOutId");
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
//请求成功
System.out.println(sendSmsResponse.getCode());
return checkCode;
}
return null;
}
//测试发送短信
@Test
public void test1() throws Exception {
String s = this.sendMsg("156xxxxxxxx");//手机号
System.out.println(s);
}
}
读取配置文件中的秘钥,在配置文件中写aliyun_access_key_id和aliyun_access_key_secret,在阿里云中查
package com.jubao.jubaobase.util;
import java.io.IOException;
import java.util.Properties;
public class PropertiesUtil {
private static Properties p = new Properties();
/**
* 读取properties配置文件信息
*/
static{
try {
p.load(PropertiesUtil.class.getClassLoader().getResourceAsStream("global.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 根据key得到value的值
*/
public static String getValue(String key)
{
return p.getProperty(key);
}
}
生成验证码的工具类
package com.jubao.jubaobase.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.Random;
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
/**
* 关于字符串和日期相关的工具
*
* @author Ray & coffeefoam@126.com & http://github.com/coffeefoam
* @(#)CoreUtils.java 1.0 06/08/2017
*/
public class CoreUtils {
/**
* 生成随机字符串
*
* @param length
* @return
*/
public static String randomString(int length, boolean isNumeric) {
String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
if (isNumeric) {
base = "0123456789";
}
Random random = new Random();
StringBuffer buffer = new StringBuffer(length);
for (int i = 0; i < length; i++) {
buffer.append(base.charAt(random.nextInt(base.length())));
}
return buffer.toString();
}
/**
* 不重复的参数进行拼装,返回查询条件字符串
*
* @param parameters 参数map
* @param sort 是否按照字典排序
* @return
*/
public static String generateQueryString(Map<String, Object> parameters, boolean sort) {
ArrayList<String> list = new ArrayList<String>();
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
// log.debug("参数:{}", entry.getKey());
if (!"".equals(entry.getValue())) {
list.add(entry.getKey() + "=" + entry.getValue());
}
}
String[] arrayToSort = list.toArray(new String[list.size()]);
if (sort) {
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
}
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
buffer.append(arrayToSort[i]);
if (i < (list.size() - 1)) {
buffer.append("&");
}
}
return buffer.toString();
}
/**
* 根据参数获得相关签名
*
* @param params 加密参数,ASCII 码从小到大排序(字典序)
* @param encrypt 加密方式 SHA1 MD5
* @return
*/
public static String signature(String buffer, String encrypt, boolean toUpperCase) {
String sign = "";
if ("MD5".equals(encrypt)) {
// MD5加密
sign = Hashing.md5().hashString(buffer, Charsets.UTF_8).toString();
} else if ("SHA1".equals(encrypt)) {
// SHA1加密
sign = Hashing.sha1().hashString(buffer, Charsets.UTF_8).toString();
}
if (toUpperCase) {
sign = sign.toUpperCase();
}
return sign;
}
/**
* 根据参数获得相关签名
*
* @param params 加密参数,ASCII 码从小到大排序(字典序)
* @param encrypt 加密方式 SHA1 MD5
* @return
*/
public static String signature(Map params, String encrypt, boolean toUpperCase) {
String sign = "";
// 拼接字符串,按照字典排序
String buffer = generateQueryString(params, true);
// log.debug("待加密的字符串 => {}", buffer.toString());
if ("MD5".equals(encrypt)) {
// MD5加密
sign = Hashing.md5().hashString(buffer, Charsets.UTF_8).toString();
} else if ("SHA1".equals(encrypt)) {
// SHA1加密
sign = Hashing.sha1().hashString(buffer, Charsets.UTF_8).toString();
}
// log.debug("加密后的字符串 <=> {}", sign);
if (toUpperCase) {
sign = sign.toUpperCase();
}
return sign;
}
}