springboot實現短信驗證碼的發送


我使用的是阿里雲短信服務

代碼前的准備

1. 申請阿里雲的短信服務

2. 添加簽名,這里需要等待審核通過

3. 在模板管理設置自己的短信模板


下面添加模板,選擇驗證碼,模板內容可以直接使用輸入框內的示例,點擊F12,通過Search Element箭頭就可以找到textarea標簽的內容

示例:您的驗證碼為:${code},該驗證碼 5 分鍾內有效,請勿泄漏於他人。

4.點擊自己右上角的頭像,進入Access Key管理

5. 它會跳出一個選項,這里建議使用子用戶AccessKey,避免直接使用最高權限的賬戶,就像數據庫那樣,不可以直接把最高權限程序猿吧.

6.首先創建一個用戶組


6.接着在用戶組里面添加成員

強調一下,這里一定要把編程訪問勾選上,接着再為該用戶授予權限,

創建后,它會為你分配一個AccessKeyID和AccessKey Secret,這里一定要把它們保存到本地,一旦關閉頁面,這些東西都不會再顯示.

這里授予管理短信服務的權限即可

代碼實現

1.創建service層,serviceImpl層,controller層


service層代碼

package com.wfszmg.demo.service;

import java.util.Map;

/**
 * @author 無法手執玫瑰
 * 2020/07/0022 13:19
 */

public interface SmsSend {
    public boolean send(String phoneNum, String templateCode, Map<String,Object> code);
}

serviceImpl層代碼

package com.wfszmg.demo.service.imlp;

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.wfszmg.demo.service.SmsSend;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @author 無法手執玫瑰
 * 2020/07/0022 13:21
 */
@Service
public class SmsSendImpl implements SmsSend {

    @Override
    public boolean send(String phoneNum, String templateCode, Map<String, Object> code) {
        //連接阿里雲
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "自己用戶的AccessKeyId", "AccessKey Secret");
        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", "無法手執玫瑰"); //填自己申請的名稱
        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;
    }

}

controller層

package com.wfszmg.demo.controller;

import com.wfszmg.demo.service.SmsSend;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
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.ResponseBody;

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

/**
 * @author 無法手執玫瑰
 * 2020/07/0022 13:24
 */
@Controller
@CrossOrigin  //跨域支持
public class smsController {

    @Autowired
    private SmsSend smsSend;


    @GetMapping("/send/{phone}")
    @ResponseBody
    public String code(@PathVariable("phone") String phone){
        String code = UUID.randomUUID().toString().substring(0,5);
        Map<String,Object> map = new HashMap<>();
        map.put("code",code);

        boolean isSend = smsSend.send(phone,"自己短信模板的模板CODE(以SMS_開頭的)",map);
        System.out.println(phone);
        if(isSend){
            return "發送成功";
        }else{
            return "發送失敗";
        }
    }

}

體驗吧

對了,你還要往賬戶里面充點錢!

我這里直接訪問 http://localhost:8088/send/158********(電話號碼)

最后貼一下Test的代碼吧,這樣更把握整體的代碼

package com.wfszmg.demo.utils;

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 org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

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

import static org.junit.Assert.*;

/**
 * @author 無法手執玫瑰
 * 2020/07/0022 10:33
 */
@SpringBootTest
public class SmsTest {
    @Test
    public void contextLoads(){
        //連接阿里雲
        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "自己用戶的AccessKeyId", "AccessKey Secret");
        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", "無法手執玫瑰");
        request.putQueryParameter("TemplateCode", "自己短信模板的模板CODE(以SMS_開頭的)");

        //構建短信驗證碼
        Map<String, Object> map = new HashMap<>();
        map.put("code",123456);
        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();
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM