1、首先我们要确定用哪一个第三方短信接口平台,多数这样的平台都会有免费试用的通知短信,我建议是使用阿里云短信服务,因为只需充1元就可以测无数的短信,所以我演示的是阿里云短信服务。至于秒滴,网建什么的,不是需要企业执照的,就是发送短信的时间太长。
2、我们先到阿里云注册一个账号,也可以直接使用支付宝号登陆,然后找到短信服务管理平台,我们可以看到一个国内消息,点击会出现签名管理、模板管理等,
我先添加一个短信模板,添加之后等待审核,一般这个很快就可以审核通过,
接下来,添加签名管理,这个可能运气不好,就要多申请几次啦,总通过的,我就申请了好多次才通过。
3、上述准备做好的话,我就可以在阿里云的平台下载一个demo文件,里面会有发送手机验证码的代码,不下也可以我里提供,前提可以要导入maven依赖
<!-- 阿里云短信服务所需 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 -->
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.dysmsapi.transform.v20170525.SendSmsResponseUnmarshaller;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.HttpResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
/**
* Created on 17/6/7.
* 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过
* 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
* 工程依赖了2个jar包(存放在工程的libs目录下)
* 1:aliyun-java-sdk-core.jar
* 2:aliyun-java-sdk-dysmsapi.jar
*
* 备注:Demo工程编码采用UTF-8
* 国际短信发送请勿参照此DEMO
*/
public class SmsDemo {
//产品名称:云通信短信API产品,开发者无需替换
static final String product = "Dysmsapi";
//产品域名,开发者无需替换
static final String domain = "dysmsapi.aliyuncs.com";
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
static final String accessKeyId = "LTAI4FdqZDrhtpfog5sZMzJy";
static final String accessKeySecret = "LhC5M92HNciVfqWBNywotzuEYjxnPI";
public static SendSmsResponse sendSms(String phone,String authcode) throws ClientException {
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化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(phone);
//必填:短信签名-可在短信控制台中找到
request.setSignName("尚筹");
//必填:短信模板-可在短信控制台中找到
request.setTemplateCode("SMS_174985391");
/**
* 生成随机整数
*/
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
request.setTemplateParam("{\"password\":\""+authcode+"\"}");
//选填-上行短信扩展码(无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选: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;
}
public static QuerySendDetailsResponse querySendDetails(String bizId) throws ClientException {
//可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
QuerySendDetailsRequest request = new QuerySendDetailsRequest();
//必填-号码
request.setPhoneNumber("15000000000");
//可选-流水号
request.setBizId(bizId);
//必填-发送日期 支持30天内记录查询,格式yyyyMMdd
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
request.setSendDate(ft.format(new Date()));
//必填-页大小
request.setPageSize(10L);
//必填-当前页码从1开始计数
request.setCurrentPage(1L);
//hint 此处可能会抛出异常,注意catch
QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
return querySendDetailsResponse;
}
public static void main(String[] args) throws ClientException, InterruptedException {
//发短信
SendSmsResponse response = sendSms("17346974342","123233");
System.out.println("短信接口返回的数据----------------");
System.out.println("Code=" + response.getCode());
System.out.println("Message=" + response.getMessage());
System.out.println("RequestId=" + response.getRequestId());
System.out.println("BizId=" + response.getBizId());
/*Thread.sleep(3000L);
//查明细
if(response.getCode() != null && response.getCode().equals("OK")) {
QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId());
System.out.println("短信明细查询接口返回数据----------------");
System.out.println("Code=" + querySendDetailsResponse.getCode());
System.out.println("Message=" + querySendDetailsResponse.getMessage());
int i = 0;
for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
{
System.out.println("SmsSendDetailDTO["+i+"]:");
System.out.println("Content=" + smsSendDetailDTO.getContent());
System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
System.out.println("OutId=" + smsSendDetailDTO.getOutId());
System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
}
System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
}*/
}
}
在这里插入代码片
4、接下来就可以用那个类里面的main方法测试,就可以发送成功,下面是我写前端jsp代码,
5、此jsp代码使用了bootstrap,及js,仅供参考
<form class="form-signin" role="form">
<h2 class="form-signin-heading"><i class="glyphicon glyphicon-log-in"></i> 用户注册</h2>
<div class="form-group has-success has-feedback">
<input type="text" class="form-control" id="floginacct" placeholder="请输入登录账号" name="loginacct" onkeyup="sel()" autofocus>
<span class="glyphicon glyphicon-user form-control-feedback"></span>
</div>
<div class="form-group has-success has-feedback">
<input type="password" class="form-control" id="fuserpswd" placeholder="设置密码" name="userpswd" style="margin-top:10px;">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
<div class="form-group has-success has-feedback">
<input type="password" class="form-control" id="fuserpswd2" placeholder="确认密码" name="userpswd2" style="margin-top:10px;">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
<div class="form-group has-success has-feedback">
<input type="email" class="form-control" id="femail" placeholder="请输入邮箱地址" name="email" style="margin-top:10px;">
<span class="glyphicon glyphicon glyphicon-envelope form-control-feedback"></span>
</div>
<div class="form-group has-success has-feedback">
<input type="email" class="form-control" id="fphone" placeholder="请输入您的手机号" name="tel" style="margin-top:10px;">
<span class="glyphicon glyphicon-phone-alt form-control-feedback"></span>
</div>
<div class="form-group has-success has-feedback">
<input type="email" class="form-control" id="authcode" placeholder="验证码" name="authcode" style="margin-top:10p;width: 195px;display: inline;">
<input type="button" class="btn btn-default" id="btn" name="btn" value="发送验证码" onclick="sendMessage()" style="margin-top:10p;"/>
</div>
<div class="form-group has-success has-feedback">
<select class="form-control" id="ftype">
<option value="0">企业</option>
<option value="1" selected="selected" >个人</option>
</select>
</div>
<div class="checkbox">
<label>
忘记密码
</label>
<label style="float:right">
<a href="${APP_PATH }/login.htm">我有账号</a>
</label>
</div>
<!-- <input type="button" class="btn btn-lg btn-success btn-block" οnclick="doreg()" value="注册" id="reg"> -->
<a class="btn btn-lg btn-success btn-block" onclick="doreg()"> 注册</a>
</form>
<script type="text/javascript">
function sel(){
var floginacct=document.getElementById("floginacct").value;
$.ajax({
type:"post",
url:"${APP_PATH}/selreg.do",
data:{
floginacct:"floginacct"
},
success:function(result){
if(result.success){
}else{
}
},
error:function(){
layer.msg("注册失败!",{time:1000, icon:5, shift:6});
}
});
}
var loadingIndex = -1 ;
function sendMessage() {
var fphone=document.getElementById("fphone").value;
alert("11");
$.ajax({
type : "POST",
data :{
"phone":fphone
},
url : "${APP_PATH}/verification.do",
async : false,//默认为true 异步
beforeSend : function(){
alert("dsagad");
return true;
},
success : function(result){
layer.close(loadingIndex);
alert("发送成功"+result.success);
if(result.success){
layer.msg("发送成功", {time:1000, icon:6, shift:6});
}else{
layer.msg(result.message, {time:1000, icon:5, shift:6});
}
},
error : function(){
layer.msg("发送失败!", {time:1000, icon:5, shift:6});
}
});
}
function doreg() {
var authcode=$("#authcode");
alert("验证码:"+authcode);
var floginacct=$("#floginacct");
var fuserpswd=$("#fuserpswd");
var fuserpswd2=$("#fuserpswd2");
var femail=$("#femail");
var ftype=$("#ftype");
var fphone=$("#fphone");
//对于表单数据而言不能用null进行判断,如果文本框什么都不输入,获取的值是"" $.trim去空格
if($.trim(floginacct.val()) == ""){
//alert("用户账号不能为空,请重新输入!");
layer.msg("用户账号不能为空,请重新输入!",{time:1000, icon:5, shift:6}, function () {
floginacct.val("");
floginacct.focus();
//return false ;不能结束if,只是结束msg
});
return false ;
}
if($.trim(fuserpswd.val()) == ""){
//alert("密码不能为空,请重新输入!");
layer.msg("用户密码不能为空,请重新输入!",{time:2000, icon:5, shift:6}, function () {
fuserpswd.val("");
fuserpswd.focus();
});
return false ;
}
if($.trim(fuserpswd2.val()) == ""){
//alert("密码不能为空,请重新输入!");
layer.msg("确认密码不能为空,请重新输入!",{time:2000, icon:5, shift:6}, function () {
fuserpswd2.val("");
fuserpswd2.focus();
});
return false ;
}
if(document.getElementById("fuserpswd2").value != document.getElementById("fuserpswd").value){
//alert("密码不能为空,请重新输入!");
layer.msg("两次不能不一致,请重新输入!",{time:2000, icon:5, shift:6}, function () {
fuserpswd2.val("");
fuserpswd2.focus();
});
return false ;
}
if($.trim(femail.val()) == ""){
//alert("密码不能为空,请重新输入!");
layer.msg("用户邮箱不能为空,请重新输入!",{time:1000, icon:5, shift:6}, function () {
femail.val("");
femail.focus();
});
return false ;
}
if($.trim(fphone.val()) == ""){
//alert("密码不能为空,请重新输入!");
layer.msg("手机号码不能为空,请重新输入!",{time:1000, icon:5, shift:6}, function () {
fphone.val("");
fphone.focus();
});
return false ;
}
var loadingIndex=-1;
$.ajax({
type:"POST",
url:"${APP_PATH}/doreg.do",
data:{
"loginacct":floginacct.val(),
"userpswd":fuserpswd.val(),
"email":femail.val(),
"type":ftype.val(),
"tel":fphone.val(),
"authcode":authcode.val()
},
beforeSend:function(){
//一般做表单数据校验
//函数的使用
setTimeout(function(){
loadingIndex = layer.msg("正在注册,请稍后。。。", {icon: 16});
},2000)
return true;
},
success:function(result){//{"success":true}或{"success":false,"message":"登录失败!"}
layer.close(loadingIndex);//关闭层
if(result.success){
setTimeout(function(){
loadingIndex = layer.msg("注册成功,3秒后跳转。。。", {icon: 16});
//跳转主页面
window.location.href="${APP_PATH}/login.htm";
},3000);
}else{
layer.msg(result.message,{time:1000, icon:5, shift:6});
}
},
error:function(){
layer.msg("注册失败!",{time:1000, icon:5, shift:6});
}
});
}
</script>