SpringBoot -- 調用整合阿里雲短信服務


一、在阿里雲官網上配置一些信息

阿里雲官網:https://help.aliyun.com/

1.獲取您的 AccessKey 和 AccessKey Secert

     RAM控制台網址:https://ram.console.aliyun.com/overview

    1. 雲賬號登錄RAM控制台

    2.在左側導航欄的人員管理菜單下,單擊用戶。

    3.在用戶登錄名稱/顯示名稱列表下,單擊目標RAM用戶名稱。

    4.在用戶AccessKey 區域下,單擊創建新的AccessKey。

        首次創建時需填寫手機驗證碼。

    5.單擊確認。

  • AccessKeySecret只在創建時顯示,不提供查詢,請妥善保管。
  • 若AccessKey泄露或丟失,則需要創建新的AccessKey,最多可以創建2個AccessKey。

 

 2.給剛新增的用戶授權短信服務

     注意:如果不授權調用短信服務會返回信息:沒有訪問權限

     1.新增授權

      

 

     2.添加權限

     

 

       

 

 3.短信服務創建簽名和模板

    

 

 

 

 

 二、SpringBoot--接入阿里雲短信服務

1.打開pom.xml文件,添加依賴

       <!--sms-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.4.6</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>2.1.0</version>
        </dependency>

說明:阿里雲的 sdk依賴可在阿里雲幫助文檔中進行獲取

2.修改application.yml配置文件

aliyun:
  accessKeyID: ***                    你的accessKeyID
  accessKeySecret: ***                你的accessKeySecret
  domain: dysmsapi.aliyuncs.com       固定不變
  regionId: cn-hangzhou               固定不變
  templateCode: ***                   你的模板code
  signName: ***                       你的簽名

3.service層

package com.chinaums.sms.service;

public interface SendSmsService {

    /**
     * 發送短信的接口
     *
     * @param phoneNum 手機號
     * @param message     消息
     * @return
     */
    boolean sendSms(String phoneNum, String message);
}

4.serviceImpl實現層

package com.chinaums.sms.service.impl;


import com.alibaba.fastjson.JSON;
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.chinaums.sms.service.SendSmsService;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

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


@Service
@Data
public class SendSmsServiceImpl implements SendSmsService {
    private static final Logger logger = LoggerFactory.getLogger(SendSmsServiceImpl.class);
    //aliyuncs的參數
    @Value("${aliyun.accessKeyID}")
    private String accessKeyID;
    @Value("${aliyun.accessKeySecret}")
    private String accessKeySecret;
    //短信api的請求地址  固定
    @Value("${aliyun.domain}")
    private String domain;
    //指定地域名稱 短信API的就是 cn-hangzhou 不能改變
    @Value("${aliyun.regionId}")
    private String regionId;
    //您的申請簽名
    @Value("${aliyun.signName}")
    private String signName;
    //你的模板
    @Value("${aliyun.templateCode}")
    private String templateCode;

    /**
     * 發送短信接口
     *
     * @param phoneNum 手機號
     * @param message     消息
     * @return
     */
    @Override
    public boolean sendSms(String phoneNum, String message) {

        // 指定地域名稱 短信API的就是 cn-hangzhou 不能改變  后邊填寫您的  accessKey 和 accessKey Secret
        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyID, accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);

        // 創建通用的請求對象
        CommonRequest request = new CommonRequest();
        // 指定請求方式
        request.setSysMethod(MethodType.POST);
        // 短信api的請求地址  固定
        request.setSysDomain(domain);
        //簽名算法版本  固定
        request.setSysVersion("2017-05-25");
        //請求 API 的名稱
        request.setSysAction("SendSms");
        //指定地域名稱
        request.putQueryParameter("RegionId", regionId);
        // 要給哪個手機號發送短信  指定手機號
        request.putQueryParameter("PhoneNumbers", phoneNum);
        // 您的申請簽名
        request.putQueryParameter("SignName", signName);
        // 您申請的模板 code
        request.putQueryParameter("TemplateCode", templateCode);

        Map<String, Object> params = new HashMap<>();
        //這里的key就是短信模板中的 ${xxxx}
        params.put("code", message);

        // 放入參數  需要把 map轉換為json格式  使用fastJson進行轉換
        request.putQueryParameter("TemplateParam", JSON.toJSONString(params));

        try {
            CommonResponse response = client.getCommonResponse(request);
            logger.info(JSON.parseObject(response.getData(), Map.class).get("Message").toString());
            return response.getHttpResponse().isSuccess();

        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }

        return false;
    }
}

5.controller控制層

package com.chinaums.sms.controller;

import com.chinaums.common.utils.R;
import com.chinaums.sms.service.SendSmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SendSmsController {
    @Autowired
    private SendSmsService sendSmsService;

    @RequestMapping(value = "/sendSms")
    public R sendSms() {
        boolean sendFlag = sendSmsService.sendSms("131****9522","123456");
        if (sendFlag){
            return R.ok();
        }else {
            return R.error("發送消息{123456}失敗!");
        }
    }
}

說明:1.如果使用短信驗證碼格式的簽名:code只能是 符合規則[a-zA-Z0-9] ,否則報錯信息:params must be [a-zA-Z0-9] for verification sms。

           2.短信服務里面選擇不同的簽名格式,請求的模板也可以不同,具體情況具體對待。

           3.如果控制台返回信息:短信所使用簽名場景非法,那么說明:簽名的試用場景與短信類型不匹配。解決:檢查下創建簽名時選擇的適用場景是驗證碼還是通用,如果是驗證碼,把場景改為通用即可。

           4.如果控制台返回信息:賬戶余額不足。則需要充值一點錢。

6.可以在頁面或者postman測試短信是否發送成功(直接調用控制層controller)注意:發送短信是收費的,收費標准看阿里雲官網短信服務。

 

 

 

 

  控制返回:OK,則說明短信已經發送成功。

 


免責聲明!

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



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