1. 程式人生 > 其它 >簡訊驗證筆記(狂神說)

簡訊驗證筆記(狂神說)

1. 瞭解阿里雲使用者許可權操作

狂神說視訊 :https://space.bilibili.com/95256449/channel/detail?cid=146244

筆記來源:https://blog.csdn.net/weixin_44449838/article/details/109325198


需要通過個人賬戶獲得 授權碼(id、密碼),再通過這些資訊獲得服務

阿里雲網址 : https://www.aliyun.com/

  1. 登入 / 註冊 阿里雲
  2. 點選 AccessKey 管理

  3. 建立一個使用者
  1. 為新建的使用者新增許可權

2. 開通阿里雲簡訊服務

  1. 進入簡訊服務後臺
  2. 瞭解計費規則

3. 新增簡訊模板

  • 看到每條簡訊是需要簡訊費用的,所以如果需要使用該功能,需要充點錢備用。

4. 添加簽名

這可太煩了啊


5. 編寫測試程式碼

  • 可以檢視 API Demo ,修改即可

  1. 新建一個 Spring-boot 專案 sms-verification
  2. 引入依賴
	<!--aliyun-->
	<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-->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-redis</artifactId>
	</dependency>
  1. 編寫一個測試類,就把剛剛的 API Demo 複製過來進行修改
// 注意這裡所有的包都是 aliyuncs 包下的
@Test
void contextLoads() {
	// 這裡的 AccessKey ID 、 Secret就是 阿里雲使用者對於的值,複製過來即可
	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");
	// 上面不需要改
	// 自定義引數 :
	// 手機號,這裡 Value 就填使用者的手機號,實際應用須要從表單獲取
	request.putQueryParameter("PhoneNumbers", "138XXXXXXXX");
	// 簽名,這裡的 Value 就是在阿里雲上申請的 簽名
	request.putQueryParameter("SignName", "XXXX");
	// 模板,這裡的 Value 就是在阿里雲上申請的模板的 模版CODE 值
	request.putQueryParameter("TemplateCode", "XXXX");
	// 驗證碼,真實應用需要自動構建驗證碼
	HashMap<String, Object> map = new HashMap<>();
	map.put("code", 112233);
	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();
	}
}

  1. 最後就可以得到簡訊了
  • 注意:

    如果上面自定義的引數名寫錯,不會成功

    如果 模板、簽名 沒有通過稽核會報錯

6. 模板

  1. 新建幾個資料夾

  2. 編寫介面 SendSmsService

public interface SendSmsService {
    /**
     * 用於傳送簡訊
     * @param phoneNumber :手機號
     * @param templateCode :模板編號
     * @param code :驗證碼
     * @return 是否傳送成功
     */
    public boolean send(String phoneNumber, String templateCode, Map<String, Object> code);
}

  1. 編寫實現類 SendSmsServiceImpl
public class SendSmsServiceImpl implements SendSmsService {
    @Override
    public boolean send(String phoneNumber, 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");
        // 上面不需要改
        // 自定義引數 :
        // 手機號,這裡 Value 就填使用者的手機號,實際應用須要從表單獲取
        request.putQueryParameter("PhoneNumbers", phoneNumber);
        // 簽名,這裡的 Value 就是在阿里雲上申請的 簽名
        request.putQueryParameter("SignName", "XXXX");
        // 模板,這裡的 Value 就是在阿里雲上申請的模板的 模版CODE 值
        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;
    }
}
  1. 編寫配置檔案,連線 Redis :application.yml
server:
  port: 8088
# 配置 Redis
spring:
  redis:
    host: 192.168.142.120
    port: 6379
    password: 123456

  1. 編寫呼叫介面
@RestController
@CrossOrigin // 跨域的支援
public class SmsApiController {
    @Autowired
    private SendSmsService sendSmsService;

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("send/{phone}")
    public String sendSms(@PathVariable("phone") String phoneNumber){
        // 呼叫傳送發放(模擬真實業務,整合 Redis)

        // 判斷當前手機號是否儲存在 Redis 中
        // 如果沒有則傳送簡訊
        // 如果有表示上一個驗證碼還未過期,不用傳送
        String code = (String) redisTemplate.opsForValue().get(phoneNumber);
        if (!StringUtils.isEmpty(code)){
            return "[手機號: "+phoneNumber + "],[驗證碼: " + code +"],還未過期";
        }

        // 生成驗證碼
        code = UUID.randomUUID().toString().substring(0,6);
        HashMap<String, Object> map = new HashMap<>();
        map.put("code",code);

        sendSmsService.send(phoneNumber,"XXXX",map);

		// 如果傳送成功,就放入 Redis
        if (isSend){
            redisTemplate.opsForValue().set(phoneNumber,code,5, TimeUnit.MINUTES);
            return "[手機號: "+phoneNumber + "],[驗證碼: " + code +"],傳送成功";
        }else {
            return "[手機號: "+phoneNumber + "],[驗證碼: " + code +"],傳送失敗";
        }
    }
    
}