在用这个阿里大于发送短信的时候,首先应该详细的去阅读阿里短信服务的说明,我之前自己写的时候是用用于企业发送短信的,用的是企业账号申请的签名和短信模板,个人好像不可以使用,即便可以使用但是签名必须是自己的真实姓名才可以。
接下来说一下基本步骤:
首先阅读阿里短信服务官方文档,然后申请accesskeyId和accessKeySecret,接着去申请短信签名,这个需要网址域名获取企业的三证合一证件。接下来申请模板,一般都是短信模板(只带验证码)还有就是其他类型的短信模板(比如说一些通知提示类短信).
短信模板申请下来之后请记得短信模板CODE如图:
这些都有之后附上阿里大于发送短信的java代码:
首先引入jar包:
1 <!--阿里短信--> 2 <dependency> 3 <groupId>com.aliyun</groupId> 4 <artifactId>aliyun-java-sdk-core</artifactId> 5 <version>3.7.1</version> 6 </dependency> 7 <dependency> 8 <groupId>com.aliyun</groupId> 9 <artifactId>aliyun-java-sdk-dysmsapi</artifactId> 10 <version>1.1.0</version> 11 </dependency>
接下来是代码:
1 import com.alibaba.fastjson.JSONObject; 2 import com.aliyuncs.DefaultAcsClient; 3 import com.aliyuncs.IAcsClient; 4 import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; 5 import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; 6 import com.aliyuncs.exceptions.ClientException; 7 import com.aliyuncs.exceptions.ServerException; 8 import com.aliyuncs.http.MethodType; 9 import com.aliyuncs.profile.DefaultProfile; 10 import com.aliyuncs.profile.IClientProfile; 11 12 import java.util.logging.Logger; 13 14 /** 15 * @author kabuqinuo 16 * @date 2018/7/18 9:01 17 */ 18 /*发送短信模板(使用阿里大于)*/ 19 public class ShortmsgUtils { 20 21 22 private static Logger logger = Logger.getLogger(String.valueOf(ShortmsgUtils.class)); 23 24 25 static ShortmsgUtils shortmsgUtils; 26 27 public static ShortmsgUtils getInstance() { 28 if (shortmsgUtils == null) { 29 shortmsgUtils = new ShortmsgUtils(); 30 } 31 return shortmsgUtils; 32 } 33 34 /** 35 * 发送验证码 36 * @param phonenumm 手机号 37 * @param smsverificationcode 随机生成的要发送的验证码 38 */ 39 public void getShortMessage(String phonenumm, int smsverificationcode){ 40 //设置超时时间-可自行调整 41 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); 42 System.setProperty("sun.net.client.defaultReadTimeout", "10000"); 43 //初始化ascClient需要的几个参数 44 final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改) 45 final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改) 46 //替换成你的AK 47 final String accessKeyId = Parameter.APPKEY;//你的accessKeyId 48 final String accessKeySecret =Parameter.SECRET;//你的accessKeySecret 49 //初始化ascClient,暂时不支持多region(请勿修改) 50 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, 51 accessKeySecret); 52 try { 53 DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); 54 } catch (ClientException e1) { 55 // TODO Auto-generated catch block 56 e1.printStackTrace(); 57 } 58 IAcsClient acsClient = new DefaultAcsClient(profile); 59 //组装请求对象 60 SendSmsRequest request = new SendSmsRequest(); 61 //使用post提交 62 request.setMethod(MethodType.POST); 63 64 //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000” 65 request.setPhoneNumbers(phonenumm); 66 //必填:短信签名-可在短信控制台中找到申请的签名 67 request.setSignName(""); 68 //必填:短信模板-可在短信控制台中找到 69 request.setTemplateCode(SmsModel.SMS_YZM); 70 //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 71 //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败 72 request.setTemplateParam("{code:'" + smsverificationcode + "'}"); 73 //可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段) 74 //request.setSmsUpExtendCode("90997"); 75 //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 76 // request.setOutId("yourOutId"); 77 //请求失败这里会抛ClientException异常 78 SendSmsResponse sendSmsResponse = null; 79 try { 80 sendSmsResponse = acsClient.getAcsResponse(request); 81 } catch (ServerException e) { 82 // 异常 83 e.printStackTrace(); 84 } catch (ClientException e) { 85 // 异常 86 e.printStackTrace(); 87 } 88 if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) { 89 logger.info("发送验证码成功!"); 90 //请求成功 91 } 92 } 93 94 /**带参数通知短信模板*/ 95 /** 96 * 97 * @param phonenumm//手机号 98 * @param sms//封装的要带的参数 99 */ 100 public static void getShortMessages(String phonenumm,smsParamVo sms){ 101 //设置超时时间-可自行调整 102 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); 103 System.setProperty("sun.net.client.defaultReadTimeout", "10000"); 104 //初始化ascClient需要的几个参数 105 final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改) 106 final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改) 107 //替换成你的AK 108 final String accessKeyId = Parameter.APPKEY;//你的accessKeyId,参考本文档步骤2 109 final String accessKeySecret =Parameter.SECRET;//你的accessKeySecret,参考本文档步骤2 110 //初始化ascClient,暂时不支持多region(请勿修改) 111 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, 112 accessKeySecret); 113 try { 114 DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); 115 } catch (ClientException e1) { 116 // TODO Auto-generated catch block 117 e1.printStackTrace(); 118 } 119 IAcsClient acsClient = new DefaultAcsClient(profile); 120 //组装请求对象 121 SendSmsRequest request = new SendSmsRequest(); 122 //使用post提交 123 request.setMethod(MethodType.POST); 124 125 //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000” 126 request.setPhoneNumbers(phonenumm); 127 //必填:短信签名-可在短信控制台中找到 128 request.setSignName(""); 129 //必填:短信模板-可在短信控制台中找到 130 request.setTemplateCode(SmsModel.SMS_TZDX); 131 //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 132 //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败 133 request.setTemplateParam(JSONObject.toJSONString(sms)); 134 //可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段) 135 //request.setSmsUpExtendCode("90997"); 136 //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 137 // request.setOutId("yourOutId"); 138 //请求失败这里会抛ClientException异常 139 SendSmsResponse sendSmsResponse = null; 140 try { 141 sendSmsResponse = acsClient.getAcsResponse(request); 142 } catch (ServerException e) { 143 // 异常 144 e.printStackTrace(); 145 } catch (ClientException e) { 146 // 异常 147 e.printStackTrace(); 148 } 149 if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) { 150 logger.info("短信通知发送成功!"); 151 //请求成功 152 } 153 } 154 }
上面基本每一步都有相应的注释,在一些必要参数都获取成功之后这端代码可直接拿来调用。