三大运营商没有对外开放发短信接口
可以通过阿里或腾讯进行申请
一下通过阿里进行展示
登录 阿里官网 搜索短信服务
可以进行 免费 开通
在 概览 里面进行四步操作
完成之后会生成一个秘钥
阿里官网提供了 使用的实例
阿里 Java SDK实例
/*
1.注册阿里云账户
2.开通短信服务
2.1 创建 签名
2.3 创建 模板
2.4 充值(发短信花钱)
3.创建accessKey密匙: key=value
*/
public class SendSmsUtils {
static final String product = "Dysmsapi";
// 产品域名,开发者无需替换
static final String domain = "dysmsapi.aliyuncs.com";
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
static final String accessKeyId = "自己申请的id";
static final String accessKeySecret = "自己申请的secret";
public static SendSmsResponse sendSms(String telephone, String code) throws ClientException {
setNewcode();//每次随机生成四个
code=String.valueOf(getNewcode());//获取这四个
// 初始化acsClient,暂不支持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();
// 必填:待发送手机号
request.setPhoneNumbers(telephone);
// 必填:短信签名-可在短信控制台中找到
request.setSignName("***"); //
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode("---"); //
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的用户,您的验证码为${code}"时,此处的值为
request.setTemplateParam("{\"code\":\"" + code + "\"}");
// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId("yourOutId");
// hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
System.out.println("短信发送成功!");
} else {
System.out.println("短信发送失败!");//手机号假的,签名,模板,私钥
}
return sendSmsResponse;
}
//1.提供一个方法:返回一个 4位的 随机验证码:0-9构成, 返回6个随机验证码:0-9a-z
public static String getRandCode(int length){
if(length==4){
String numbers ="0123456789";
String fourCode ="";
for (int i = 1; i <=4 ; i++) {
Double d1 = Math.random()*numbers.length();//0-9.999
Double d2 = Math.floor(d1);//0-9
int index = d2.intValue();//0-9
char c = numbers.charAt(index);
fourCode+=c;
}
return fourCode;
}
if(length==6){
String chars = "0123456789abcdefghijklmnopqrstuvwyxz";
StringBuilder sb = new StringBuilder();
for (int i = 1; i <=6 ; i++) {
//1.得到上面chars字符串的随机索引值
int index = ((Double)Math.floor(Math.random() * chars.length())).intValue();
sb.append(chars.charAt(index));
}
return sb.toString();
}
return "传递的长度有误";
}
//以下为测试代码,随机生成验证码
public static int newcode;
public static int getNewcode() {
return newcode;
}
public static void setNewcode() {//0-9A-Z
String words="0123456789abcdefhijklmnopqrstuvwxyzABCD";
//获取words字符串里面的: 四个随机字符
String str="";
for (int i = 1; i <=4 ; i++) {
int index =(int) Math.floor(Math.random()*words.length());//[0, words.length()-1]
char c = words.charAt(index);
str+=c;
}
newcode = (int) (Math.random() * 9999) + 100; //获取四个随机数 1000-9999
//把该验证码保存到redis中,设置过期时间
Jedis jedis = JedisUtil.getJedis();
jedis.set( "token" , String.valueOf(newcode));//把随机产生的四个数字存到redis数据库了
//设置session的过期时间 时间单位是秒
jedis.expire("token",60);//给四个数字设置一个过期的时间: 1分钟
}
public static void main(String[] args) throws ClientException {
//测试
SendSmsUtils.sendSms("手机号略",String.valueOf(newcode));
}
}