公司要在项目上添加短信验证码,实现修改密码功能。要求是比较便宜,方便介接入,且平台不能太小(怕不够持久,突然倒闭)。在进行了几个公司的对比后最后选择了阿里云短信平台,原因是:
1、相对来说倒闭是暂时不可能的了(逗比)
2、与腾讯比10到30万条短信稍微便宜一丢丢,(一丢丢也是钱,一分钱难倒英雄汉)
3、公司服务器使用的是阿里的,不用重新注册,只需认证即可
4、接入相对简单(单从导包数量就少了一半,阿里2个jar ;腾讯4个jar)
在进行操作之前阅读了阿里整个操作文档,阿里也提供了很多资料,并且提供了demo,使用时下载需要的demo然后进行其他操作。
下面介绍一下我的操作流程:
先登陆阿里云----》控制台 ----》产品服务----》短信服务
进入短信使用页面
然后按照文档进行开通操作即可
接下来
、首先看下你需要准备哪些参数
-
/**********需要准备的参数**************/
-
public static String accessKey="";//需要修改
-
public static String accessSecret="";//需要修改
-
public static String code="SMS_41635111";//需要修改
-
public static String signName="测试99";//需要修改
创建和查看Access Key
https://ak-console.aliyun.com/#/accesskey/
3、开通短信服务成功后,需要配置短信签名和短信模板,配置完后,需要审核,审核过后就拿了code和signName两个参数
4、创建短信签名
注意
审核成功
5、创建短信模板
审核成功
这里面有一个不成功,原因是我想用短信通知来发验证码
sms01: ${name},哈哈,现在时间是${time}
sms02: ${name},我用短信通知发送验证码不行啊,验证码为${code},时间${time},祝生活愉快。
6、短信签名和短信模板审核通过后就可以开发了
主要代码是
package com.kp.sms; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.sms.model.v20160927.SingleSendSmsRequest; import com.aliyuncs.sms.model.v20160927.SingleSendSmsResponse; /** * @author: py * @version:2017年1月13日 下午2:40:28 * com.kp.sms.TestSms.java * @Desc */ public class TestSms { public static String regionId="cn-hangzhou";//机房信息,可以不用更改 /**********需要准备的参数**************/ public static String accessKey="";//需要修改 public static String accessSecret="";//需要修改 public static String code="SMS_41635111";//需要修改 public static String signName="测试99";//需要修改 /**********************************/ public static void main(String[] args) { String phone="15589895656"; String time =getChinaDateByMM(System.currentTimeMillis()); //根据自己定义的短信模板,修改 String jsonStr="{"name":"小明","code":"12312","time":""+time +""}"; test(phone, jsonStr,code,signName); } public static void test(String phone, String jsonStr, String code, String signName) { try { IClientProfile profile = DefaultProfile.getProfile(regionId, accessKey, accessSecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "Sms", "sms.aliyuncs.com"); IAcsClient client = new DefaultAcsClient(profile); SingleSendSmsRequest request = new SingleSendSmsRequest(); //管理控制台中配置的短信签名(状态必须是验证通过) request.setSignName(signName); //管理控制台中配置的审核通过的短信模板的模板CODE(状态必须是验证通过) request.setTemplateCode(code); // 短信模板中的变量;数字需要转换为字符串;个人用户每个变量长度必须小于15个字符。 // 例如:短信模板为:“接受短信验证码${no}”,此参数传递{“no”:”123456”},用户将接收到[短信签名]接受短信验证码123456 request.setParamString(jsonStr); //目标手机号,多个手机号可以逗号分隔 request.setRecNum(phone); // request.setVersion(version); SingleSendSmsResponse httpResponse = client.getAcsResponse(request); String requestId = httpResponse.getRequestId(); System.err.println("requestId:"+requestId); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } /** * 使用毫秒转换为中文日期 * @param tmpDateInt * @return */ public static String getChinaDateByMM(long time){ String ret_date = ""; java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy年MM月dd日"); ret_date = formatter.format(time); return ret_date; } }
参考链接:
https://blog.csdn.net/u014520797/article/details/54411392
我在参考阿里文档和本连接内容后开始动手操作:
1、下载对应的java版demo,把两个jar包从java demo中取出放到项目的lib中
2、把java demo 中的SmsDemo.java中的内容复制到项目的util文件夹里的SmsUtil.java中
SmsDemo.java路径
SmsUtil.java所在文件目录
这几个文件的代码如下:
package com.xxxx.util.index; 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.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import java.text.SimpleDateFormat; import java.util.Date; public class SmsUtil { //产品名称:云通信短信API产品,开发者无需替换 static final String product = "Dysmsapi"; //产品域名,开发者无需替换 static final String domain = "dysmsapi.aliyuncs.com"; // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) static final String accessKeyId = "LTAILlPgh5mWKmRm"; static final String accessKeySecret = "HU9qWuoWOzqnvrmczOP2FOfgE07poi"; public static SendSmsResponse sendSms(Note note) 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(note.getPhoneNumber()); //必填:短信签名-可在短信控制台中找到 request.setSignName("中国青年网"); //必填:短信模板-可在短信控制台中找到 request.setTemplateCode("SMS_140727456"); //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 request.setTemplateParam("{"code":""+note.getCode()+""}"); //选填-上行短信扩展码(无特殊需求用户请忽略此字段) //request.setSmsUpExtendCode("90997"); //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 request.setOutId("123456789"); //hint 此处可能会抛出异常,注意catch SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); 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("13164334652"); //可选-流水号 request.setBizId("111"); //必填-发送日期 支持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 { Note note=new Note(); note.setPhoneNumber("13164363646"); note.setTemplateCode("SMS_140715144"); note.setCode("90999"); note.setProduct("中国普法网"); note.setId("123456"); SendSmsResponse response = sendSms(note); 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()); //发短信 // SendSmsResponse response = sendSms(); *//* 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()); } }*/ }
package com.xxxx.util.index; public class Note { private String id; private String phoneNumber; private String templateCode; private String product; private String code; private String templateParam; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public String getTemplateCode() { return templateCode; } public void setTemplateCode(String templateCode) { this.templateCode = templateCode; } public String getProduct() { return product; } public void setProduct(String product) { this.product = product; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getTemplateParam(){ return templateCode; } public void setTemplateParam(String templateParam){ this.templateParam=templateParam; } }
package com.xxxx.util.index; public class CheckCode { private Integer Id;//id private String Userid;//memberid private String code;//验证码 private String creatTime;//验证码创建时间 private String phone; private String username; public Integer getId() { return Id; } public void setId(Integer id) { Id = id; } public String getUserid() { return Userid; } public void setUserid(String userid) { Userid = userid; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getCreatTime() { return creatTime; } public void setCreatTime(String creatTime) { this.creatTime = creatTime; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getUsername(){ return username; } public void setUsername(String username){ this.username=username; } }
以上便是主要获取短信的核心代码
如果只获取代码的话只需SmsUtil这个类中的代码,略微修改一下信息就可在main函数中获得短信,其他两个类是我们在后台操作 时保存信息用的实体类。