手把手教你对接阿里云短信服务

正好双十二,最近在做一个小项目需要用到短信业务,注册了新用户125买了5000条短信,有效期2年。
在这里插入图片描述
那么如何对接阿里云短信,需要做哪些操作?
可以参考https://help.aliyun.com/document_detail/59210.html

短信流程图

短信使用流程见下图:
在这里插入图片描述

入驻阿里云,阿里云注册入口:点击注册页面、然后实名认证

开通短信服务

1.开通短信服务:点击开通短信服务

2.进入控制台:点击查看控制台页面

在这里插入图片描述

获取AccessKey

1创建AccessKey: 点击创建AccessKey

2.获取AccessKey ID和AccessKey Secret:点击查看AccessKey ID和AccessKey Secret

创建签名和模版

在这里插入图片描述
1.创建签名前查看短信规则和审核规则:短信业务规则审核规则

2.创建短信签名:点击查看创建短信签名

需要审核,大概两个小时。
在这里插入图片描述

3.创建短信模版:点击查看创建短信模版

注意模板中只能包含一个占位符。如下。需要审核,大概两个小时。请记住模板Code,如:SMS_181918946。下面调用接口是需要该参数。

您的验证码为${code},该验证码有效时间为3分钟。验证码只能自己知道,打死也不能告诉别人哦!

在这里插入图片描述

短信接口配置

1.设置访问权限控制:点击访问权限控制

2.SDK及DEMO下载:点击下载SDK及DEMO

3.API文档:点击查看API文档简介

创建AccessKey

访问密钥AccessKey(AK)相当于登录密码,只是使用场景不同。AccessKey用于程序方式调用云服务API,而登录密码用于登录控制台。如果您不需要调用API,那么就不需要创建AccessKey。

背景信息

您可以使用AccessKey构造一个API请求(或者使用云服务SDK)来操作资源。AccessKey包括AccessKeyId和AccessKeySecret。

AccessKeyId用于标识用户。
AccessKeySecret是用来验证用户的密钥。AccessKeySecret必须保密。

警告 禁止使用主账号AK,因为主账号AK泄露会威胁您所有资源的安全。请使用子账号(RAM用户)AK进行操作,可有效降低AK泄露的风险。

操作步骤

云账号登录RAM控制台。在左侧导航栏的人员管理菜单下,单击用户。在用户登录名称/显示名称列表下,单击目标RAM用户名称。在用户AccessKey 区域下,单击创建新的AccessKey。首次创建时需填写手机验证码。单击确认。

1、先创建用户组,给用户组加权限【短信管理权限】;
2、创建用户,该用户可以设置登陆权限,可以有独立的密码;
3、把用户加入到用户组,该用户将拥有用户组设置的权限;

在这里插入图片描述
4、给用户生成Access Key和SecretKey;
在这里插入图片描述

上面的步骤做完后,可以参考API文档中的示例代码,调用阿里云短信接口。

我编写的代码如下:

package org.linlinjava.litemall.core.notify;

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.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.linlinjava.litemall.core.util.JacksonUtil;

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

/*
 * 阿里云短信服务
 */
public class AliyunSmsSender implements SmsSender {
    private final Log logger = LogFactory.getLog(AliyunSmsSender.class);

    private String regionId;
    private String accessKeyId;
    private String accessKeySecret;
    private String sign;

    public String getRegionId() {
        return regionId;
    }

    public void setRegionId(String regionId) {
        this.regionId = regionId;
    }

    public String getAccessKeyId() {
        return accessKeyId;
    }

    public void setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
    }

    public String getAccessKeySecret() {
        return accessKeySecret;
    }

    public void setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    @Override
    public SmsResult send(String phone, String content) {
        SmsResult smsResult = new SmsResult();
        smsResult.setSuccessful(false);
        return smsResult;
    }

    @Override
    public SmsResult sendWithTemplate(String phone, String templateId, String[] params) {
        DefaultProfile profile = DefaultProfile.getProfile(this.regionId, this.accessKeyId, this.accessKeySecret);
        IAcsClient client = new DefaultAcsClient(profile);

        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.POST);
        request.setDomain("dysmsapi.aliyuncs.com");
        request.setVersion("2017-05-25");
        request.setAction("SendSms");
        request.putQueryParameter("RegionId", this.regionId);
        request.putQueryParameter("PhoneNumbers", phone);
        request.putQueryParameter("SignName", this.sign);
        request.putQueryParameter("TemplateCode", templateId);
    
        String templateParam = "{}";
        if(params.length == 1){
            Map<String, String> data = new HashMap<>();
            data.put("code", params[0]);
            templateParam = JacksonUtil.toJson(data);
        }
        else if(params.length > 1){
            Map<String, String> data = new HashMap<>();
            data.put("code", params[0]);
            for(int i = 1; i < params.length; i++){
                data.put("code" + i, params[i]);
            }
            templateParam = JacksonUtil.toJson(data);
        }
        request.putQueryParameter("TemplateParam", templateParam);

        try {
            CommonResponse response = client.getCommonResponse(request);
            SmsResult smsResult = new SmsResult();
            smsResult.setSuccessful(true);
            smsResult.setResult(response);
            return smsResult;
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }

        SmsResult smsResult = new SmsResult();
        smsResult.setSuccessful(false);
        return smsResult;
    }
}

其中RegionId可以是cn-hangzhou、cn-beijing等;Version必须是2017-05-25;其他参数AccessKey和SecretKey为在上面申请的。

最终效果

在这里插入图片描述

发布了125 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ll837448792/article/details/103503998