必定要保管好這個accesskey
不要泄露,選擇使用子用戶的點擊建立用戶組,而後根據提示填寫便可java
建立完成以後點擊新建的用戶組進去web
找到權限管理,添加權限redis
輸入SMS點擊管理短信服務,跳到有邊,點擊肯定便可spring
根據提示填寫就能夠編程
編程訪問必定要勾選上,由於咱們是經過代碼操做的json
點擊肯定便可api
建立用戶以後點擊進入會看到這個用戶的全部信息跨域
這裏的accesskeyid accessSecret 必定要妥善保管,由於一旦建立了用戶以後就看不到密碼了,若是泄露,要即便禁用或者刪除app
而後點擊加入的組,將剛纔建立好的用戶組添加進去便可dom
該子用戶會繼承用戶組的權限
短信服務
便可 ,點擊進入根據提示填寫就能夠,必定不要亂寫,填寫正當理由,審覈未經過接着審覈就行
${code}
這個必定要有,不要修改他,要經過這個將驗證碼的變量傳進去
第一次進去的時候驗證碼是能夠選用的,選用驗證碼就行,由於我申請過了,因此不能在選擇了
必定要等審覈經過了才能夠使用
這個幫助文檔有api參考,能夠自行了解
進入官方的demo中
pom.xml 在pom.xml中導入如下依賴
<!--導入依賴sms 發送短信的核心依賴--> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.3</version> </dependency> <!--FastJson 對於數據的處理的依賴--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.73</version> </dependency> <!--redis 由於短信驗證碼都是幾分鐘後沒法使用,因此放在redis中--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.3.2.RELEASE</version> </dependency>
先測試一下能不能使用,直接將官方的demo代碼複製放到測試類中測試一下
/** * <accessKeyId> 你本身的 accessKeyId 至關於帳號 * accessSecret 在建立用戶時的 accessSecret 至關於密碼 */ @Test void contextLoads() { DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>"); IAcsClient client = new DefaultAcsClient(profile); //構建請求 CommonRequest request = new CommonRequest(); request.setSysMethod(MethodType.POST); request.setSysDomain("dysmsapi.aliyuncs.com");//不能改 改了就會報錯 request.setSysVersion("2017-05-25");//不能改 改了就會報錯 request.setSysAction("SendSms");//通常也不會該改 //自定義的參數(手機號,驗證碼,模板,簽名) //參數名稱不要亂寫 //手機號 request.putQueryParameter("PhoneNumbers", "接受短信的手機號"); //簽名名稱 request.putQueryParameter("SignName", "剛纔定義好的簽名名稱"); //模板code request.putQueryParameter("TemplateCode", "自定義短信模板的模板CODE編碼"); //構建一個短信驗證碼 Map<String,Object> map = new HashMap<>(); map.put("code","1234"); //將定義好的驗證碼放入進去 //短信驗證碼 request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map)); try { CommonResponse response = client.getCommonResponse(request); //控制檯打印返回的信息 System.out.println(response.getData()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } }
在導包的時候必定不要導錯了,導阿里雲的,有些包是重名的
測試發送短信
{"Message":"OK","RequestId":"D12E6D53-3A2B-4342-87CE-8B78C9A5A8FC","BizId":"174403396982142436^0","Code":"OK"}
在控制檯看到這句話就證實短信發送成功了
是否是已經收到短信了!
發送短信的正式代碼
controller
package com.mango.controller; import com.mango.Service.SendSmsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.UUID; import java.util.concurrent.TimeUnit; /** * @Author: * @Date: 2020/8/9 22:11 * @CrossOrigin//跨域支持 */ @RestController @CrossOrigin public class SendSmsApiController { @Autowired private SendSmsService sendSmsService; /** * 使用redis的模板 */ @Autowired private RedisTemplate<String,String> redisTemplate; @GetMapping("/send/{phone}") public String sendSms(@PathVariable("phone")String phone){ //調用發送短信的方法(使用redis) //獲取redis中的手機號 String code = redisTemplate.opsForValue().get(phone); //判斷當前的code的不爲空 if(!StringUtils.isEmpty(code)){ return phone+":"+code +"已存在,尚未過時"; } //不然就是沒有驗證碼,生成驗證碼而且存儲到redis中,設置他的過時時間 //生成隨機驗證碼 code = UUID.randomUUID().toString().substring(0, 4); HashMap<String, Object> map = new HashMap<>(); map.put("code",code); //發送短信 boolean isSend = sendSmsService.sendSms(phone, "自定義短信模板的模板CODE編碼", map); if(isSend){ //若是短信發送成功就放入到redis中,設置5分鐘以後過時 redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES); return phone+":"+code +"發送成功"; }else { return "發送成功"; } } }
service
package com.mango.Service; import java.util.Map; /** * @Author: * @Date: 2020/8/9 22:12 */ public interface SendSmsService { /** * @param phoneNum 發送的手機號 * @param TemplateCode 短信模板的code * @param code 驗證碼 * @return */ public boolean sendSms(String phoneNum, String TemplateCode , Map<String,Object> code); }
servcieImpl
package com.mango.Service.impl; import com.alibaba.fastjson.JSONObject; 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.mango.Service.SendSmsService; import org.springframework.stereotype.Service; import java.util.Map; /** * @Author: * @Date: 2020/8/9 22:12 */ @Service public class SendSmsImpl implements SendSmsService { /** * @param phoneNum 發送的手機號 * @param TemplateCode 短信模板的code * @param code 驗證碼 * @return */ @Override public boolean sendSms(String phoneNum, String TemplateCode, Map<String, Object> code) { DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>"); IAcsClient client = new DefaultAcsClient(profile); //構建請求 CommonRequest request = new CommonRequest(); //不要改 request.setSysMethod(MethodType.POST); //不能改 改了就會報錯 request.setSysDomain("dysmsapi.aliyuncs.com"); //不能改 改了就會報錯 request.setSysVersion("2017-05-25"); //通常也不會該改 request.setSysAction("SendSms"); //自定義的參數(手機號,驗證碼,模板,簽名) //參數名稱不要亂寫 //手機號 request.putQueryParameter("PhoneNumbers", phoneNum); //簽名名稱 request.putQueryParameter("SignName", "剛纔定義好的簽名名稱"); //模板code request.putQueryParameter("TemplateCode", TemplateCode); //短信驗證碼 request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code)); try { CommonResponse response = client.getCommonResponse(request); //這個是他自帶的判斷他發送的是否成功,成功就直接返回 return response.getHttpResponse().isSuccess(); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } return false; } }
application.yml
server: port: 8090 # redis 我這裏使用的是本地的redis spring: redis: host: 127.0.0.1 port: 6379
如今看下是否是已經發送成功了!