Skip to content

短信业务用户:

用户登录名称 sms@1683247591077299.onaliyun.comAccessKey ID LTAI5tEB5qwx5uains3ia9Li AccessKey Secret vhwlGWI30bkIFszOmJLusHaQMv5MvL

1、了解阿里云用户权限操作

img

一、登录阿里云,进入控制台,点击右上角头像,选择 【AccessKey 管理】。

img

二、点击 【开始使用子用户 AccessKey】。

img

三、点击左侧菜单栏【用户组】,然后点击【创建用户组】,填写相关信息,点击【确认】完成用户组的创建。

用户组:用户组里面可以添加很多用户,可以给用户组分配权限,这样用户组里面的所有用户就都拥有这些权限了,避免反复分配权限!

img

img

img

四、创建好用户组后,点击用户组列表右侧的【添加权限】,然后搜索 sms,选择 AliyunDysmsFullAccess:管理短信服务(SMS)的权限,点击【确认】为用户组添加 sms 权限。

img img img

五、点击左侧菜单栏【用户】,然后点击【创建用户】,填写相关信息,勾选 编程访问,点击【确认】完成用户的创建。

img img

注意:勾选编程访问后,创建完用户会显示 AccessKey 信息并提示你保存好,一定要将AccessKey 信息妥善保存,避免用的时候找不到,AccessKey Secret只在当前页显示一次!

img 如果AccessKey 信息不小心被他人获取,可以在用户详情的认证管理对该AccessKey进行【禁用】或者【删除】。

img

六、点击【添加到用户组】,将创建好的用户添加到创建好的用户组里。

img img

可以发现用户会自动继承所属用户组的权限。

img

2、开通阿里云短信服务

一、搜索款搜索 短信服务,点击【短信服务】,进入短信服务控制台。

img

二、点击左侧菜单栏的【快速学习】,开通短信服务并快速了解短信服务相关信息。

img

可以测试短信发送,了解短信计费规则等。

img

img

3、添加短信模板

一、选择左侧菜单【国内消息】,选择【模板管理】,点击【添加模板】。

img

二、填写相关内容(申请说明,需要正当理由),填写完后等待审核。

img

4、添加签名(公司的名称)

一、选择左侧菜单【国内消息】,选择【管理】,点击【添加模板】。

img

二、填写相关内容(适用场景选择 验证码,申请说明,需要正当理由,一般是人工审核),填写完后等待审核。

img

5、编写测试代码

一、选择左侧【快速学习】,点击下方的查看【API Demo】,跳转到API Demo的页面,可以查看示例代码。

img

img

现在更新了:变成了升级版的sdk,但是原版的也不是不可以用!!

image-20221022173349153

网址:https://next.api.aliyun.com/api/Dysmsapi/2017-05-25/SendSms?spm=5176.25163407.quickstart-index-d6f48_f4003_0.d_65e2c_8da05_2.53f7bb6eAO8Vml&params={"SignName":"阿里云短信测试","TemplateCode":"SMS_154950909","PhoneNumbers":"15530612150","TemplateParam":"{\"code\"%3A\"1234\"}"}&lang=JAVA

image-20221022222643674

升级版:

image-20221022173320294

二、创建空的Springboot项目。

三、添加Maven依赖。

xml
<!-- 阿里云SDK-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.3</version>
</dependency>
<!-- json工具类 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>
<!-- Redis:验证码一定时间内需要过期,所以验证码应当放在redis里面存储一份! -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

四、编写测试代码。

image-20221022173451503

java
package com.cxy;

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.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.rmi.ServerException;
import java.util.HashMap;
import java.util.Map;

@RunWith(SpringRunner.class)
@SpringBootTest
public class AliyunSmsApplicationTests {

    @Test
    public void contextLoads() {
   
        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");

        // 自定义参数(手机号,验证码,签名,模板)
        request.putQueryParameter("PhoneNumbers", "17674102xxx"); // 手机号
        request.putQueryParameter("SignName", "xxx"); // 签名
        request.putQueryParameter("TemplateCode", "SMS_199770xxx"); // 模版Code
        // 构建一个信息的验证码
        Map<String,Object> param = new HashMap<>();
        param.put("code",569712);
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param)); //短信参数
        try {
   
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
        } catch (ClientException e) {
   
            e.printStackTrace();
        }
    }
}

6、编写可复用的微服务接口,实现验证码的发送

一、创建service接口 SendSms

java
package com.cxy.service;

import java.util.Map;

public interface SendSms {
   
    boolean send(String PhoneNumbers, String TemplateCode, Map<String,Object> code);
}

二、创建service实现类 SendSmsImpl

java
package com.cxy.service.impl;

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.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class SendSmsImpl implements SendSms {
   
	 /**
     * 发送短信
     * @param PhoneNumbers 手机号
     * @param TemplateCode 模板code
     * @param code 短信参数(验证码)
     * @return
     */
    @Override
    public boolean send(String PhoneNumbers, 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");

        // 自定义参数(手机号,签名,模板,验证码)
        request.putQueryParameter("PhoneNumbers", PhoneNumbers); // 手机号
        request.putQueryParameter("SignName", "xxx"); // 签名
        request.putQueryParameter("TemplateCode", TemplateCode); // 模版Code
        request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code)); // 短信参数(验证码)
        try {
   
            CommonResponse response = client.getCommonResponse(request);
            System.out.println(response.getData());
            return response.getHttpResponse().isSuccess();
        } catch (ClientException e) {
   
            e.printStackTrace();
        }
        return false;
    }
}

三、创建controller控制器 SmsApiController

java
package com.cxy.controller;

import com.cxy.impl.SendSms;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
public class SmsApiController {
   

    @Autowired
    private SendSms sendSms;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @GetMapping("/send/{phone}")
    public String code(@PathVariable("phone") String phone){
   
        String code = redisTemplate.opsForValue().get(phone);
        if (!StringUtils.isEmpty(code)){
   
            return phone + ":" + code + "已存在,还没有过期";
        }
        code = (int)((Math.random()*9+1)*100000) + ""; // 生成6位随机数
        Map<String,Object> param = new HashMap<>();
        param.put("code",code);
        boolean result = sendSms.send(phone, "SMS_199770xxx", param);
        if (result){
   
            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
            return phone + ":" + code + "已发送成功";
        }
        return "发送失败";
    }
}

4、打开Redis服务,启动项目,测试访问。

img

img