天天看點

java 實作阿裡雲短信接口的背景全部實作邏輯

1: 項目位址

https://gitee.com/itliulei/sms-aliyun-demo.git
           

對接阿裡短信服務,首先需要準備的有SignName ,TemplateCode ,AccessKeyId,AccessSecret,前面兩個是在阿裡短信服務裡面建立的,一個是短信簽名名稱,一個是短信要使用的模闆id,後面兩個我了解的意思就是擷取權限,給你登入的賬号密碼差不多,準備好這些,就可以寫java的背景對接邏輯了

注意:如果你時間比較急,那就重點研究SmsClient 和SmsAliYunClient ,就這倆在其作用,其他的隻是把調用發送短信流程補充完整

項目的目錄(這就是我寫的一個專門測試阿裡短信起的一個項目)

java 實作阿裡雲短信接口的背景全部實作邏輯

下面分運作順序進行代碼粘貼

loginController

@RestController
@RequestMapping("/sys")
public class loginController {
    @Autowired
    private SmsClient smsClient;
    //調用本接口測試調用阿裡接口
    @GetMapping("/getVerificationCode")
    public Result getVerificationCodeOfMember(@RequestParam String mobile){
        Result result=new Result();
        result.setSuccess(false);
        String code= RandomUtil.randomNumbers(4);
        for (;;){

            if (!code.startsWith("0")){
                break;
            }
            code=RandomUtil.randomNumbers(4);

        }
        if (StringUtils.isEmpty(mobile)){
            result.setMessage("手機号不能為空");
            return result;
        }
        VerificationCode verificationCode=new VerificationCode();
        verificationCode.setCode(code);
        //這裡就是調用好發送
        smsClient.singleSendVerificationCode(mobile,code);

        return Result.ok(verificationCode);
    }
}

           

SmsClient (短信平台)接口

public interface SmsClient {

    //單一發送驗證碼 2:尋找接口
    SendResult singleSendVerificationCode(String mobile, String code);

    @Data
    @Accessors(chain = true)
    class SendResult {

        public static final int SUCCESS_CODE = 0;
        public static final int ERROR_CODE = 1;
        public static final String SUCCESS_MESSAGE = "SUCCESS";

        /**
         * 錯誤碼
         */
        private Integer code;
        /**
         * 錯誤資訊
         */
        private String message;
        /**
         * 是否成功
         */
        private Boolean isSuccess;
    }

    /**
     * 短信發送 - 單個
     *
     * @param mobile 手機号
     * @param sign 簽名
     * @param templateCode 短信模闆code
     * @param template 短信模闆
     * @param templateParams 短信模闆 params
     * @return 發送後資訊
     */
    SendResult singleSend(String mobile, String sign, String templateCode,
                          String template, Map<String, String> templateParams);

    /**
     *
     * @param mobile
     * @param templateParams
     * @return
     */
    SendResult singleSendMsg(String mobile, Map<String, String> templateParams);

    /**
     * 短信發送 - 批量
     *
     * @param mobileList 手機号
     * @param sign 簽名
     * @param templateCode 短信模闆 code
     * @param template 短信模闆
     * @param templateParams 短信模闆params
     * @return 發送後資訊
     */
    SendResult batchSend(List<String> mobileList, String sign, String templateCode,
                         String template, Map<String, String> templateParams);
}
           

SmsAliYunClient 短信平台接口實作類

public class SmsAliYunClient implements SmsClient {

    private static final Logger LOGGER = LoggerFactory.getLogger(SmsAliYunClient.class);

    private static final String DOMAIN = "dysmsapi.aliyuncs.com";
    private static final String SUCCESS_CODE = "OK";
    private static final String SUCCESS_MESSAGE = "OK";
    /**
     * 阿裡雲短信 - 批量推送最大數 500,支援 1000
     */
    private static final int MAX_BATCH_SIZE = 500;

    @Value("${sms.aliYun.accessKeyId?:'default_value'}")
    private String accessKeyId;
    @Value("${sms.aliYun.accessSecret?:'default_value'}")
    private String accessSecret;




    @Accessors(chain = true)
    @Data
    public static class Result {
        /**
         * 發送回執ID,可根據該ID在接口QuerySendDetails中查詢具體的發送狀态。
         */
        private String BizId;
        /**
         * 請求狀态碼。
         *
         * - OK 蔡成功
         */
        private String Code;
        /**
         * 狀态碼的描述。
         */
        private String Message;
        /**
         * 請求ID。
         */
        private String RequestId;
    }

    @Data
    private class  VerificationCode{
        private String mobile;
        private String code;

        public VerificationCode(String mobile, String code) {
            this.mobile = mobile;
            this.code = code;
        }
    }
    //單一發送驗證碼 3:接口的實作類
    @Override
    public SendResult singleSendVerificationCode(String mobile,String code) {

        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.POST);
        request.setDomain(DOMAIN);
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
        request.putQueryParameter("PhoneNumbers", mobile);//接收短信的手機号碼。
        request.putQueryParameter("SignName","然***" ); //短信簽名名稱。請在控制台簽名管理頁面簽名名稱一列檢視。說明 必須是已添加、并通過稽核的短信簽名。
        request.putQueryParameter("TemplateCode", "S*S_15*******5");//短信模闆ID。請在控制台模闆管理頁面模闆CODE一列檢視。
        request.putQueryParameter("TemplateParam", "{code:"+code+"}");//短信模闆變量對應的實際值,JSON格式。
        // 發送請求
        return doSend(request);
    }

    @Override
    public SendResult singleSend(String mobile, String sign, String templateCode,
                                 String template, Map<String, String> templateParams) {
        // params
        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.POST);
        request.setDomain(DOMAIN);
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
        request.putQueryParameter("PhoneNumbers", mobile);
        request.putQueryParameter("SignName", sign);//短信簽名名稱。請在控制台簽名管理頁面簽名名稱一列檢視。說明 必須是已添加、并通過稽核的短信簽名。
        request.putQueryParameter("TemplateCode", templateCode);//短信模闆ID。請在控制台模闆管理頁面模闆CODE一列檢視。
        request.putQueryParameter("TemplateParam", JSON.toJSONString(templateParams));//短信模闆變量對應的實際值,JSON格式。

        // 發送請求
        return doSend(request);
    }

    @Override
    public SendResult singleSendMsg(String mobile, Map<String, String> templateParams) {
        // params
        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.POST);
        request.setDomain(DOMAIN);
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
        request.putQueryParameter("PhoneNumbers", mobile);
        request.putQueryParameter("SignName", "然***");
        request.putQueryParameter("TemplateCode", "SMS_15********5");
        request.putQueryParameter("TemplateParam", JSON.toJSONString(templateParams));

        // 發送請求
        return doSend(request);
    }

    @Override
    public SendResult batchSend(List<String> mobileList, String sign, String templateCode,
                                String template, Map<String, String> templateParams) {

        // 最大發送數為 1000,我們設定為 500 個, 分段發送
        int maxSendSize = MAX_BATCH_SIZE;
        int maxSendSizeCount = mobileList.size() % maxSendSize == 0
                ? mobileList.size() / maxSendSize
                : mobileList.size() / maxSendSize + 1;

        SendResult sendResult = null;
        for (int i = 0; i < maxSendSizeCount; i++) {
            // 分批發送
            List<String> batchSendMobile = mobileList
                    .subList(i * maxSendSize, (i + 1) * maxSendSize);

            // params
            CommonRequest request = new CommonRequest();
            request.setMethod(MethodType.POST);
            request.setDomain(DOMAIN);
            request.setVersion("2017-05-25");
            request.setAction("SendBatchSms");
            request.putQueryParameter("PhoneNumberJson", JSON.toJSONString(batchSendMobile));
            request.putQueryParameter("SignNameJson", JSON.toJSONString(Collections.singletonList(sign)));
            request.putQueryParameter("TemplateCode", templateCode);
            request.putQueryParameter("TemplateParamJson", JSON.toJSONString(Collections.singletonList(templateParams)));

            // 發送請求
            sendResult = doSend(request);
        }
        return sendResult;
    }
    //單一發送驗證碼 4:調用發送方法
    private SendResult doSend(CommonRequest request) {
        // 擷取 client
        IAcsClient client = getClient();
        try {
            CommonResponse response = client.getCommonResponse(request);
            Result result = JSON.parseObject(response.getData(), Result.class);
            if (!SUCCESS_CODE.equals(result.getCode())) {

                LOGGER.info("發送驗證碼失敗 params {} res {}", JSON.toJSON(request), JSON.toJSON(result));

                // 錯誤發送失敗
                return new SendResult()
                        .setIsSuccess(false)
                        .setCode(SendResult.ERROR_CODE)
                        .setMessage(result.getMessage());
            } else {
                LOGGER.info("發送驗證碼成功 params {} res", JSON.toJSON(request), JSON.toJSON(result));

                // 發送成功
                return new SendResult()
                        .setIsSuccess(true)
                        .setCode(SendResult.SUCCESS_CODE)
                        .setMessage(result.getMessage());
            }
        } catch (ClientException e) {
            LOGGER.error("發送驗證碼異常 {}", ExceptionUtils.getMessage(e));
            return new SendResult()
                    .setIsSuccess(false)
                    .setCode(SendResult.ERROR_CODE)
                    .setMessage(ExceptionUtils.getMessage(e));
        }
    }

    /**
     * 擷取 client
     *
     * @return
     */
    //AccessKeyId和AccessSecret在阿裡雲的RAM通路控制添加AccessKey擷取
    //拿到AccessKeyId(主賬号AccessKey的ID。示例:LTAIP00vvvvvvvvv) 和 AccessSecret
    private IAcsClient getClient() {
        return new DefaultAcsClient(DefaultProfile.getProfile("default", "LTA************NJ8", "qJdL******************3Kiv"));
    }
           

用到的一個實體類

@Data
public class VerificationCode {
    private String code;
}
           

用到的傳回結果分裝類

Result

public class Result<T> implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * 成功标志
	 */
	private boolean success = true;

	/**
	 * 傳回處理消息
	 */
	private String message = "操作成功!";

	/**
	 * 傳回代碼
	 */
	private Integer code = 0;
	
	/**
	 * 傳回資料對象 data
	 */
	private T result;
	
	/**
	 * 時間戳
	 */
	private long timestamp = System.currentTimeMillis();

	public Result() {
		
	}
	
	public Result<T> error500(String message) {
		this.message = message;
		this.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
		this.success = false;
		return this;
	}
	
	public Result<T> success(String message) {
		this.message = message;
		this.code = CommonConstant.SC_OK_200;
		this.success = true;
		return this;
	}
	
	
	public static Result<Object> ok() {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(CommonConstant.SC_OK_200);
		r.setMessage("成功");
		return r;
	}
	
	public static Result<Object> ok(String msg) {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(CommonConstant.SC_OK_200);
		r.setMessage(msg);
		return r;
	}
	
	public static Result<Object> ok(Object data) {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(CommonConstant.SC_OK_200);
		r.setResult(data);
		return r;
	}
	
	public static Result<Object> error(String msg) {
		return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);
	}
	
	public static Result<Object> error(int code, String msg) {
		Result<Object> r = new Result<Object>();
		r.setCode(code);
		r.setMessage(msg);
		r.setSuccess(false);
		return r;
	}
	
	/**
	 * 無權限通路傳回結果
	 */
	public static Result<Object> noauth(String msg) {
		return error(CommonConstant.SC_JEECG_NO_AUTHZ, msg);
	}
}
           

使用的依賴

<!--調用阿裡短信使用的依賴-->
     <properties>
        <java.version>1.8</java.version>
        <!--調用阿裡短信使用的依賴版本-->
        <commons.version>2.6</commons.version>
        <aliyun-java-sdk-core.version>4.1.0</aliyun-java-sdk-core.version>
        <aliyun-java-sdk-dysmsapi.version>1.0.0</aliyun-java-sdk-dysmsapi.version>
        <!--調用阿裡短信使用的依賴版本-->
    </properties>
	<dependencies>
        <!-- 阿裡雲短信 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>${aliyun-java-sdk-dysmsapi.version}</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>${aliyun-java-sdk-core.version}</version>
        </dependency>
        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--随機數-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.5.11</version>
        </dependency>
        <!-- commons -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${commons.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>${commons.version}</version>
        </dependency>
        <!-- json -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.56</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
    <!--調用阿裡短信使用的依賴-->
 </dependencies>
           

阿裡擷取簽名等的截圖

java 實作阿裡雲短信接口的背景全部實作邏輯
java 實作阿裡雲短信接口的背景全部實作邏輯
java 實作阿裡雲短信接口的背景全部實作邏輯