阿里雲短信業務實戰

我們經常會有註冊手機號填驗證碼的需求,現在我們就通過阿里雲短信業務來實現

一 準備

1. 創建用戶組和用戶

  • 我們登錄到阿里雲,先預先充值一些錢,測試的話充1塊差不多了,因爲短信不是免費的,計價如下:

  •  進入控制檯,hover頭像選擇accesskey管理,進入到如下頁面,選擇右邊的選項

  • 點擊用戶組管理,點擊創建用戶組,信息隨便填,我之前已經創建過了

 

  • 創建完後點擊進入用戶組,選擇權限管理,

  • 添加sms管理權限

 

  •  點擊用戶管理,創建用戶,創建好後立即保存彈出key和secret

  • 創建完後進入,加入到剛創建的用戶組,就自動繼承了權限,要記住權限管理裏accesskey

 

2. 開通短信服務,配置短信模板和簽名 

  • 搜索進入短信服務頁,選擇同意開通
  • 選擇國內消息的簽名管理

點擊【簽名管理】 ,進入到如下編輯頁,選擇驗證碼,則下面都不需要填,簽名和申請說明要正式

點擊模板管理的【添加模板】 ,進入到如下頁,模板名稱最好正式一點,不要亂填,模板內容使用其示例即可,申請說明要正當,不然無法審覈通過,如網站註冊驗證碼測試使用。

審覈都通過,就成功做好準備,可以進行開發了。

二  官方示例測試SMS

1. 先新建一個springboot項目

 2. 導入依賴,sms短信服務所需的sdk,fastjson和redis(因爲短信驗證碼過幾分鐘會刷新)

<!--導入sms依賴-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.1</version>
</dependency>

<!--導入fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.61</version>
</dependency>

<!--導入redis依賴-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

 3. 測試使用,在test里加入如下官方示例:

 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("RegionId", "cn-hangzhou");
        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }

其中accessKeyId和accessSecret換成自己的。

4. 我們需要添加自定義的一些參數,如發送的手機號、簽名、模板和驗證碼,爲了方便,驗證碼先寫死,在request.setSysAction下添加

 //自定義參數

    request.putQueryParameter("PhoneNumbers", "填手機號");
    request.putQueryParameter("SignName","填剛審覈通過的簽名");
    request.putQueryParameter("TemplateCode","填審覈通過的模板code");
    
    //構建短信驗證碼
    Map<String,Object> map = new HashMap<>();
    map.put("code",1212);
    request.putQueryParameter("TemplateParam", JSONObject.toJSONString(map));

5. 運行測試,即可受到短信(第一條)

 

 三 自己寫一個發送驗證碼服務

1. 新建service,有send方法,參數分別爲手機號,簽名,短信模板code和驗證碼

package com.example.demo.service;

import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public interface SendSmsService {

  public boolean send(String phoneNumber,String signName, String templateCode, Map<String,Object> code);
}

 2. 寫service的實現類,寫法參照官方示例,我們返回值時boolean來表示發送成功還是失敗

package com.example.demo.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.example.demo.service.SendSmsService;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class SendSmsServiceImpl implements SendSmsService {


  @Override
  public boolean send(String phoneNumber, String signName, String templateCode, Map<String, Object> code) {
    //連接阿里雲
    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4GABjAibZprzH3n5hEnw", "u86tmFbCLdfyYTLtesuLAPTkFXBjxT");
    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", phoneNumber);
    request.putQueryParameter("SignName",signName);
    request.putQueryParameter("TemplateCode",templateCode);
    request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));
    try {
      CommonResponse response = client.getCommonResponse(request);
      System.out.println(response.getData());
      return response.getHttpResponse().isSuccess();
    } catch (ServerException e) {
      e.printStackTrace();
    } catch (ClientException e) {
      e.printStackTrace();
    }
    return false;
  }
}

3. 寫一個controller控制層來控制,將隨機生成的驗證碼緩存到redis中,並設置5分鐘失效

package com.example.demo.controller;

import com.example.demo.service.SendSmsService;
import org.apache.commons.codec.binary.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
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.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
@CrossOrigin
public class SmsController {

  @Autowired
  private SendSmsService sendSmsService;

  @Autowired
  private RedisTemplate<String,String> redisTemplate;

  @GetMapping("/send/{phone}")
  public String sendCode(@PathVariable("phone") String phone){

    String code = redisTemplate.opsForValue().get(phone);
    if(code!=null&&!code.equals("")){
      return "驗證碼還可使用";
    }
    code = UUID.randomUUID().toString().substring(0,4);
    //構建短信驗證碼
    Map<String,Object> map = new HashMap<>();
    map.put("code",code);

    boolean isSend = sendSmsService.send("手機號","簽名","模板code",map);
    if(isSend){
      redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
      return "接受到驗證碼:"+code;
    }
    return "發送失敗";
  }

}

4. 訪問這個地址,就能收到驗證碼了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章