正好双十二,最近在做一个小项目需要用到短信业务,注册了新用户125买了5000条短信,有效期2年。

手把手教你对接阿里云短信服务_验证码

那么如何对接阿里云短信,需要做哪些操作?

可以参考https://help.aliyun.com/document_detail/59210.html

短信流程图

短信使用流程见下图:

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

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

开通短信服务

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

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

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

获取AccessKey

1创建AccessKey: 点击创建AccessKey

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

创建签名和模版

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

1.创建签名前查看短信规则和审核规则:短信业务规则,审核规则

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

需要审核,大概两个小时。

手把手教你对接阿里云短信服务_验证码_05

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

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


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


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

短信接口配置

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、把用户加入到用户组,该用户将拥有用户组设置的权限;

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

4、给用户生成Access Key和SecretKey;

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

上面的步骤做完后,可以参考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​​为在上面申请的。

最终效果

手把手教你对接阿里云短信服务_模版_09