一、在阿里雲官網上配置一些信息
阿里雲官網:https://help.aliyun.com/
1.獲取您的 AccessKey 和 AccessKey Secert
RAM控制台網址:https://ram.console.aliyun.com/overview
1. 雲賬號登錄RAM控制台
2.在左側導航欄的人員管理菜單下,單擊用戶。
3.在用戶登錄名稱/顯示名稱列表下,單擊目標RAM用戶名稱。
4.在用戶AccessKey 區域下,單擊創建新的AccessKey。
首次創建時需填寫手機驗證碼。
5.單擊確認。
- AccessKeySecret只在創建時顯示,不提供查詢,請妥善保管。
- 若AccessKey泄露或丟失,則需要創建新的AccessKey,最多可以創建2個AccessKey。
2.給剛新增的用戶授權短信服務
注意:如果不授權調用短信服務會返回信息:沒有訪問權限
1.新增授權
2.添加權限
3.短信服務創建簽名和模板
二、SpringBoot--接入阿里雲短信服務
1.打開pom.xml
文件,添加依賴
<!--sms--> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.4.6</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>2.1.0</version> </dependency>
說明:阿里雲的 sdk依賴可在阿里雲幫助文檔中進行獲取
2.修改application.yml
配置文件
aliyun: accessKeyID: *** 你的accessKeyID accessKeySecret: *** 你的accessKeySecret domain: dysmsapi.aliyuncs.com 固定不變 regionId: cn-hangzhou 固定不變 templateCode: *** 你的模板code signName: *** 你的簽名
3.service層
package com.chinaums.sms.service; public interface SendSmsService { /** * 發送短信的接口 * * @param phoneNum 手機號 * @param message 消息 * @return */ boolean sendSms(String phoneNum, String message); }
4.serviceImpl實現層
package com.chinaums.sms.service.impl; import com.alibaba.fastjson.JSON; import com.aliyuncs.CommonRequest; import com.aliyuncs.CommonResponse; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.chinaums.sms.service.SendSmsService; import lombok.Data; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; @Service @Data public class SendSmsServiceImpl implements SendSmsService { private static final Logger logger = LoggerFactory.getLogger(SendSmsServiceImpl.class); //aliyuncs的參數 @Value("${aliyun.accessKeyID}") private String accessKeyID; @Value("${aliyun.accessKeySecret}") private String accessKeySecret; //短信api的請求地址 固定 @Value("${aliyun.domain}") private String domain; //指定地域名稱 短信API的就是 cn-hangzhou 不能改變 @Value("${aliyun.regionId}") private String regionId; //您的申請簽名 @Value("${aliyun.signName}") private String signName; //你的模板 @Value("${aliyun.templateCode}") private String templateCode; /** * 發送短信接口 * * @param phoneNum 手機號 * @param message 消息 * @return */ @Override public boolean sendSms(String phoneNum, String message) { // 指定地域名稱 短信API的就是 cn-hangzhou 不能改變 后邊填寫您的 accessKey 和 accessKey Secret DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyID, accessKeySecret); IAcsClient client = new DefaultAcsClient(profile); // 創建通用的請求對象 CommonRequest request = new CommonRequest(); // 指定請求方式 request.setSysMethod(MethodType.POST); // 短信api的請求地址 固定 request.setSysDomain(domain); //簽名算法版本 固定 request.setSysVersion("2017-05-25"); //請求 API 的名稱 request.setSysAction("SendSms"); //指定地域名稱 request.putQueryParameter("RegionId", regionId); // 要給哪個手機號發送短信 指定手機號 request.putQueryParameter("PhoneNumbers", phoneNum); // 您的申請簽名 request.putQueryParameter("SignName", signName); // 您申請的模板 code request.putQueryParameter("TemplateCode", templateCode); Map<String, Object> params = new HashMap<>(); //這里的key就是短信模板中的 ${xxxx} params.put("code", message); // 放入參數 需要把 map轉換為json格式 使用fastJson進行轉換 request.putQueryParameter("TemplateParam", JSON.toJSONString(params)); try { CommonResponse response = client.getCommonResponse(request); logger.info(JSON.parseObject(response.getData(), Map.class).get("Message").toString()); return response.getHttpResponse().isSuccess(); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } return false; } }
5.controller控制層
package com.chinaums.sms.controller; import com.chinaums.common.utils.R; import com.chinaums.sms.service.SendSmsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class SendSmsController { @Autowired private SendSmsService sendSmsService; @RequestMapping(value = "/sendSms") public R sendSms() { boolean sendFlag = sendSmsService.sendSms("131****9522","123456"); if (sendFlag){ return R.ok(); }else { return R.error("發送消息{123456}失敗!"); } } }
說明:1.如果使用短信驗證碼格式的簽名:code只能是 符合規則[a-zA-Z0-9] ,否則報錯信息:params must be [a-zA-Z0-9] for verification sms。
2.短信服務里面選擇不同的簽名格式,請求的模板也可以不同,具體情況具體對待。
3.如果控制台返回信息:短信所使用簽名場景非法,那么說明:簽名的試用場景與短信類型不匹配。解決:檢查下創建簽名時選擇的適用場景是驗證碼還是通用,如果是驗證碼,把場景改為通用即可。
4.如果控制台返回信息:賬戶余額不足。則需要充值一點錢。
6.可以在頁面或者postman測試短信是否發送成功(直接調用控制層controller)注意:發送短信是收費的,收費標准看阿里雲官網短信服務。
控制返回:OK,則說明短信已經發送成功。