一、阿里云账号准备
1、注册阿里云账号:支付宝/淘宝/手机号等方式登录即可;
2、登录成功后,
① 在首页搜索短信服务
② 打开第一个搜索结果
③ 免费开通
③ 可以根据提示立即更新个人/公司信息(即新增资质),也可以点击取消(根据个人需求选择,如果是自己玩,跳过即可。如果是项目集成,请立即补充,因为实际项目发短信必须要资质)
注:资质名称即短信 开头【】中的名称 :
【阿里云】您正在登录阿里云账号,请您....!
④ 新增资质:根据图中红框标识,查看申请说明(建议了解规则,避免新增资质失败)
二、短信服务控制台
1、打开快速学习和测试
注:红框标识中的步骤必须完成!后两个步骤属于实际项目中的防护操作!
2、测试
① api测试:绑定手机号,选择测试模板(如果已申请短信模板,选择相应的模板测试即可),点击调用API发送短信,测试手机号收到短信!
② 控制台测试(此种方式优先推荐测试):选择测试模板,模板选择验证码(通知类型经测试也是默认验证码短信内容,要想实现自定义效果,需要先申请模板),自行输入接收短信的手机号
③ api调用测试:控制台测试中,有查看API demo 按钮,点击即可跳转
注:此种方式调用,需要准备好签名、短信模板才可以!
④ 代码测试:选择sdk示例,根据需求选择相应开发语言代码的示例到本地,写个测试方法
注:此种方式调用,需要准备好签名、短信模板、秘钥才可以!
三、秘钥准备
1、点击头像,选择AccessKey 管理
2、如果没有账号,选择开始使用子用户(细化权限,互不影响使用)
① 使用AccessKey 管理
② 选择开始使用子用户
1》选择创建用户
2》创建用户
注意:名称格式为英文字母、数字、.、_或-。
3》 下载文件/获取秘钥信息
注:可以从下载的CSV文件中获取,也可以直接复制AccessKey ID / AccessKey Secret
4》子用户管理
添加用户组:
用户组可能以项目为维度,比如用户组1为电商项目,用户组2为教培项目。
也可能以用户权限维度,比如用户组1,只能读,用户组2只能写。
添加用户权限:
具体到该用户有哪些权限:
总之按需选择,比如我们只需要短信,查找sms相关的选择即可:
四、短信服务相关准备
1、资质管理
需要新增
2、签名管理:资质通过后,会有赠送的签名,如果不满足需求,可以新增签名!
3、模板管理
注:只要开通短信服务,会赠送一个短信验证码模板
① 验证码模板申请:
② 通知模板申请:
注意点:变量命名,以及变量类型选择!
项目集成
1、引入依赖
官方文档-集成阿里云短信服务
<dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>3.0.0</version></dependency>
2、测试类:引入官方代码示例测试
packagecom.aliyun.sample;importcom.aliyun.teaopenapi.models.Config;importcom.aliyun.dysmsapi20170525.Client;importcom.aliyun.dysmsapi20170525.models.SendSmsRequest;importcom.aliyun.dysmsapi20170525.models.SendSmsResponse;importstaticcom.aliyun.teautil.Common.toJSONString;publicclassSample{publicstaticClientcreateClient()throwsException{Config config =newConfig()// 配置 AccessKey ID.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))// 配置 AccessKey Secret.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));// 配置 Endpoint
config.endpoint ="dysmsapi.aliyuncs.com";returnnewClient(config);}publicstaticvoidmain(String[] args)throwsException{// 初始化请求客户端Client client =Sample.createClient();// 构造请求对象,请填入请求参数值SendSmsRequest sendSmsRequest =newSendSmsRequest().setPhoneNumbers("<YOUR_VALUE>").setSignName("<YOUR_VALUE>").setTemplateCode("<YOUR_VALUE>").setTemplateParam("<YOUR_VALUE>");// 获取响应对象SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);// 响应包含服务端响应的 body 和 headersSystem.out.println(toJSONString(sendSmsResponse));}}
我们进行修改:
privatestaticfinalString accessKeyId ="输入你的accessKeyId ";privatestaticfinalString accessKeySecret ="输入你的accessKeySecret ";// 一般默认Endpoint 请参考 https://api.aliyun.com/product/DysmsapiprivatestaticfinalString endpoint ="dysmsapi.aliyuncs.com";// 签名名称(申请签名后,加需要测试的签名名称即可))privatestaticfinalString signName ="阿里云短信测试";publicstaticcom.aliyun.dysmsapi20170525.ClientcreateClient()throwsException{com.aliyun.teaopenapi.models.Config config =newcom.aliyun.teaopenapi.models.Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret);
config.endpoint = endpoint;returnnewcom.aliyun.dysmsapi20170525.Client(config);}publicstaticvoidmain(String[] args_)throwsException{com.aliyun.dysmsapi20170525.Client client =createClient();com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest =newcom.aliyun.dysmsapi20170525.models.SendSmsRequest().setTemplateCode("你的测试模板code").setPhoneNumbers("你的测试手机号").setSignName(signName)// 短信验证码只能是数字,随机数/自定义数字即可.setTemplateParam("{\"code\":\"6688\"}");com.aliyun.teautil.models.RuntimeOptions runtime =newcom.aliyun.teautil.models.RuntimeOptions();try{System.out.println("发送短信请求参数:\n"+JSONUtil.toJsonPrettyStr(sendSmsRequest));SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);System.out.println("发送短信响应参数:\n"+JSONUtil.toJsonPrettyStr(sendSmsResponse));}catch(TeaException error){System.out.println(error.getMessage());System.out.println(error.getData().get("Recommend"));com.aliyun.teautil.Common.assertAsString(error.message);}catch(Exception _error){TeaException error =newTeaException(_error.getMessage(), _error);System.out.println(error.getMessage());System.out.println(error.getData().get("Recommend"));com.aliyun.teautil.Common.assertAsString(error.message);}}
正式项目集成:
官方sdk文档说明
1、配置文件
# 命名规则可以是小驼峰,也可以是小写+下划线
aliyun:
sms:
# 从你的阿里云accessKey管理中获取
accessKeyId:
accessKeySecret:
# 域名(一般默认) Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
endpoint: dysmsapi.aliyuncs.com
# 签名名称
signName: 阿里云短信测试
# 验证码短信模板code
smsCodeTemplateCode:
2、配置类(获取秘钥等信息创建客户端)
备注:可以优化配置类,读取配置参数,比如读取统一前缀优化等!
@ComponentpublicclassSmsClientConfig{//阿里云账号的accessKeyId@Value("${aliyun.sms.accessKeyId}")privateString accessKeyId;//阿里云账号的accessKeySecret@Value("${aliyun.sms.accessKeySecret}")privateString accessKeySecret;//短信服务访问的域名@Value("${aliyun.sms.endpoint}")privateString endpoint;@Bean("smsClient")publicClientcreateClient()throwsException{Config config =newConfig().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret);
config.endpoint = endpoint;returnnewClient(config);}}
3、集成代码
① 创建接口
publicinterfaceSendCodeService{/**
* 发送短信验证码
* @param phoneNumbers
*/voidsendSmsCode(String phoneNumbers);/**
* 发送短信通知
* @param phoneNumbers
* @param notifyTypeCode
*/voidsendSmsNotify(String phoneNumbers,Integer notifyTypeCode);}
② 创建接口实现类
@Service@Slf4jpublicclassSendCodeServiceImplimplementsSendCodeService{@AutowiredprivateClient smsClient;@Value("${aliyun.sms.signName}")privateString signName;@Value("${aliyun.sms.smsCodeTemplateCode}")privateString smsCodeTemplateCode;@OverridepublicvoidsendSmsCode(String phoneNumbers){String randomCode =String.valueOf(RandomUtil.randomInt(100000,999999));HashMap<Object,Object> templateParamMap =Maps.newHashMap();
templateParamMap.put("code",randomCode);/**
* 必输字段
*/SendSmsRequest sendSmsRequest =newSendSmsRequest();
sendSmsRequest.setPhoneNumbers(phoneNumbers);
sendSmsRequest.setSignName(signName);
sendSmsRequest.setTemplateCode(smsCodeTemplateCode);
sendSmsRequest.setTemplateParam(JSONUtil.toJsonStr(templateParamMap));try{SendSmsResponse sendSmsResponse = smsClient.sendSmsWithOptions(sendSmsRequest,newRuntimeOptions());// 200为成功SendSmsResponseBody body = sendSmsResponse.getBody();// code和message为OK成功String code = body.getCode();String message = body.getMessage();if(StrUtil.equals("OK", code)&&StrUtil.equals("OK", message)){
log.info("向 手机号:{} 用户发送短信验证码成功!", phoneNumbers);}else{
log.warn("向 手机号:{} 用户发送短信验证码失败!", phoneNumbers);}}catch(Exception e){thrownewRuntimeException(e);}}@OverridepublicvoidsendSmsNotify(String phoneNumbers,Integer notifyTypeCode){// 通知短信模板code(多个通知模板时,此处建议创建通知模板枚举类,根据notifyTypeCode来获取枚举信息)String templateCode ="你申请的通知短信模板code";// 根据短信模板中的变量,传入对应的参数值,以下为示例:模板内容:亲爱的${name},您的订单${orderId}已发货,快递公司${company},快递单号${number},收货地址${location}。HashMap<Object,Object> templateParamMap =Maps.newHashMap();
templateParamMap.put("name","淘宝昵称(变量)");
templateParamMap.put("orderId","订单(变量)");
templateParamMap.put("company","快递公司(变量)");
templateParamMap.put("number","快递单号(变量)");
templateParamMap.put("location","收货地址(变量)");/**
* 必输字段
*/SendSmsRequest sendSmsRequest =newSendSmsRequest();
sendSmsRequest.setPhoneNumbers(phoneNumbers);
sendSmsRequest.setSignName(signName);
sendSmsRequest.setTemplateCode(templateCode);
sendSmsRequest.setTemplateParam(JSONUtil.toJsonStr(templateParamMap));try{SendSmsResponse sendSmsResponse = smsClient.sendSmsWithOptions(sendSmsRequest,newRuntimeOptions());// 200为成功SendSmsResponseBody body = sendSmsResponse.getBody();// code和message为OK成功String code = body.getCode();String message = body.getMessage();if(StrUtil.equals("OK", code)&&StrUtil.equals("OK", message)){
log.info("向 手机号:{} 用户发送短信通知成功!", phoneNumbers);}else{
log.warn("向 手机号:{} 用户发送短信通知失败!", phoneNumbers);}}catch(Exception error){
log.error("发送短信验证码异常:{}",error);// 注意点:此处是否需要异常处理,需要根据实际情况进行修改TeaException teaError =newTeaException(error.getMessage(), error);com.aliyun.teautil.Common.assertAsString(teaError.message);}}}
四、高级配置
1、短信发送回执设置
2、国内消息设置(发送频率、联系人设置等)
五、短信服务注意点
1、发送频率:每分钟/每小时/每日 防刷
2、发送条数限制:同一模板下,同一手机号每日50条!(特殊场景会涉及)
版权归原作者 Kwan95 所有, 如有侵权,请联系我们删除。