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,则说明短信已经发送成功。

 

posted @ 2020-07-22 16:19  巴适的哼  阅读(3159)  评论(2编辑  收藏  举报