一、阿里云短信服务核心概念:企业级通信能力
阿里云短信服务(Short Message Service)是阿里云提供的一种稳定可靠、高到达率的企业级通信服务。它支持调用API或使用群发助手发送验证码、通知类和营销类短信,国内验证短信秒级触达,到达率最高可达99%;国际/港澳台短信覆盖200多个国家和地区,安全稳定,广受出海企业选用。
阿里云短信服务历经双十一等极端场景考验,为全球数百万企业提供稳定可靠的通信服务,是国内短信服务领域的标杆产品。
二、阿里云短信服务接入流程:从准备工作到发送短信
2.1 准备工作
1. 注册阿里云账号:访问阿里云官网,https://www.aliyun.com 注册阿里云账号
2. 实名认证:必须完成企业认证(个体工商户通常也算企业认证)。个人认证账号功能受限,无法发送营销短信,且可能影响签名审核通过率
3. 开通服务:在阿里云短信板块:https://www.aliyun.com/product/sms 找到并开通“短信服务”(DYSMS)。
选择自己想要的资源包
付款即可。
4. 获取AccessKey:这是调用API的凭证。强烈建议使用RAM子用户的AccessKey,并授予其 <AliyunDysmsFullAccess> 权限策略。这比直接使用主账号的AK更安全。创建AccessKey后,务必妥善保管AccessKey ID和AccessKey Secret
4.1,流程如下:首先到用户管理板块创建子用户:https://ram.console.aliyun.com/users
4.2,然后为该子用户设置对应的权限,这里推荐给他设置<AliyunDysmsFullAccess> 短信管理权限
4.3,获取该子用户的AccessKey ID和AccessKey Secret
登录主账号,打开创建accesskey板块:https://ram.console.aliyun.com/overview?activeTab=workflow
输入你要设置的子账号,
点击执行配置,即可获取该子用户的AccessKey ID和AccessKey Secret
2.2 申请资质
根据工信部要求,发送国内短信需提供短信签名归属方的企业资质证件(如营业执照)进行备案。此资质审核是后续申请签名的基础,预计需2个工作日。
需要填写的信息是:单位名称,单位法人姓名,单位法人身份证号,有效期,单位管理人手机号
需要上传的信息是:单位营业执照,单位法人身份证正反面,单位管理人身份证正反面
2.3 申请短信签名
1. 签名定义:是出现在短信开头的标识,用于告知用户短信来源,例如【阿里云】。它必须能明确代表您的企业或品牌
2. 命名规范:需遵守平台规则,通常要求是已备案的企业名称、产品名、网站名等
3. 关键步骤 - 运营商报备:签名在阿里云审核通过后,还会自动或手动提交给运营商进行最终实名报备。这是最容易卡顿、最耗时的环节,通常需要7到10个工作日或更长时间。在报备成功前,使用此签名发送短信可能会失败,并返回错误码 <isv.PORT_NOT_REGISTERED> (端口未注册)
2.4 申请短信模板
1. 模板内容:即短信正文。若内容中有可变部分(如验证码、订单号),需使用变量,比如:您注册阿里云的的验证码为{code},5分钟内有效
2. 模板类型:分为验证码、通知短信和推广短信。类型不同,审核标准和资费可能不同。创建时需选择正确的类型并与已审核通过的签名关联
3. 审核流程:模板也需通过平台审核(约2小时)后才可使用
2.5 发送短信
1. 发送方式:可通过控制台的“群发助手”或调用 **<SendSms> ** API实现
2. API调用核心参数:
– <PhoneNumbers>: 接收手机号
– <SignName>: 已审核通过并报备成功的签名名称
– <TemplateCode>: 已审核通过的模板CODE
– <TemplateParam>: 替换变量的JSON字符串,如 {"code":"123456"}
2.6 查询发送详情与回复
1. 查询发送状态:可通过API(如QuerySendDetails)或配置回执消息(SmsReport)来查询每条短信的发送状态(成功/失败)
2. 接收回复短信:若需接收用户的回复短信(上行短信),需配置SmsUp回执消息
2.7 设置预警
为避免盗刷或资金耗尽,建议在控制台设置预警,如:
• 套餐包余量预警
• 发送频率预警
• 验证码防盗刷预警
三、以Java为例阿里云短信服务代码实现:从依赖引入到发送短信
3.1 引入依赖
<dependency> <groupId>com.aliyun</groupId> <artifactId>dysmsapi20170525</artifactId> <!-- 请将 'the-latest-version' 替换为最新版本号:https://mvnrepository.com/artifact/com.aliyun/dysmsapi20170525 --> <version>the-latest-version</version> </dependency>
3.2 配置参数
在application.yml配置文件中引入阿里云短信服务的配置,相关内容需要在阿里云控制台按指引申请。
# 阿里云key aliyun: sms: accessKeyId: xxxxxxxxxxxxxxx accessSecret: xxxxxxxxxxxxxxxxxxxx endpoint: dysmsapi.aliyuncs.com signName: 签名
3.3 编写公共发送工具类
import com.aliyun.dysmsapi20170525.Client; import com.aliyun.dysmsapi20170525.models.SendSmsRequest; import com.aliyun.dysmsapi20170525.models.SendSmsResponse; import com.aliyun.teaopenapi.models.Config; import com.aliyun.teautil.models.RuntimeOptions; import com.b2bwings.nry.app.business.web.param.message.SmsSendParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; (prefix = "aliyun.sms") public class SmsUtil { // 访问密钥id ("${aliyun.sms.accessKeyId}") private String accessKeyId; // 访问密钥secret ("${aliyun.sms.accessSecret}") private String accessKeySecret; // 短信 API 的访问域名 ("${aliyun.sms.endpoint}") private String endpoint; // 短信签名 ("${aliyun.sms.signName}") private String signName; /** * 创建客户端 */ public Client createClient() { // 创建阿里云客户端:配置访问密钥 ID、 配置密钥、配置访问端点 Config config = new Config() .setAccessKeyId(accessKeyId) .setAccessKeySecret(accessKeySecret); config.endpoint = endpoint; Client client = null; try { client = new Client(config); } catch (Exception e) { log.error("阿里云短信服务初始化失败:{}" ,e.getMessage()); } return client; } // 发送短信 public Boolean sendSms(SmsSendParam param) { // 阿里云客户端 Client client = createClient(); // 构建发送请求 SendSmsRequest sendSmsRequest = new SendSmsRequest() // 设置签名 .setSignName(signName) // 设置模板 .setTemplateCode(param.getTemplateCode()) // 设置手机号为参数传入的值 .setPhoneNumbers(param.getPhone()) // 设置模板为参数传入的值(map转json):{\"code\":\"" + code + "\"} .setTemplateParam(param.getTemplateParam()); // 运行时选择,可以设置不同的属性来配置运行时环境的参数。 RuntimeOptions runtime = new RuntimeOptions(); try { SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime); if (!"OK".equals(sendSmsResponse.getBody().getCode())) { log.info("短信发送失败:{}" ,sendSmsResponse.getBody().getMessage()); return false; } log.info("短信发送成功"); return true; } catch (Exception error) { log.info("短信发送异常:{}" , error.getMessage()); return false; } } }
3.4 模板参数需要自定义
这里根据不同的业务需求实现,我这里是根据我的需求写的,主要是针对短信发送情况存储验证码、存储发送日志,发送结果等。
其中模板参数内容需要根据你配置的短信内容模板决定,如举例:
短信内容模板:您的验证码${code},该验证码5分钟内有效,请勿泄露给他人!
模板参数内容:{"code":"446774"}
import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; /** * 发送短信参数 * @author */ public class SmsSendParam { (value = "发送目标手机号") private String phone; (value = "模板Code") private String templateCode; (value = "模板参数") private String templateParam; }
//构建发送短信参数 SmsSendParam sendParam = new SmsSendParam(phone, templateCode, JsonUtil.getJsonString(map)); Boolean verifyCode = smsUtil.sendSms(sendParam); //发送失败 if (!verifyCode) { //存储验证码值redis,保存短信记录 putRedisHandle(templateCode, phone, code, msgLog, now, time); msgLog.setRequestStatus(2); msgLog.setGmtModified(now); msgLogMapper.updateById(msgLog); return ApiResult.fail(ApiCode.LOGIN_SMS_ERR); }else{ putRedisHandle(templateCode, phone, code, msgLog, now, time); } return ApiResult.ok();
四、以PHP为例阿里云短信服务代码实现:从依赖引入到发送短信
4.1,安装阿里云短信服务SDK
你可以使用Composer来安装阿里云短信服务的PHP SDK。在项目的composer.json文件中添加以下依赖
{ "require": { "aliyun/dysmsapi-php-sdk": "^x.x.x" // 使用最新版本 } }
4.2,配置参数
namespace app\admin\controller; use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi; use Darabonba\OpenApi\Models\Config; use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest; use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions; use think\facade\Config as tConfig; class AliSms { /** * 使用AK&SK初始化账号Client * @param string $accessKeyId * @param string $accessKeySecret * @return Dysmsapi Client */ public static function createClient($accessKeyId, $accessKeySecret,$endpoint){ $config = new Config([ // 您的 AccessKey ID "accessKeyId" => $accessKeyId, // 您的 AccessKey Secret "accessKeySecret" => $accessKeySecret ]); // 访问的域名 $config->endpoint = $endpoint; return new Dysmsapi($config); } /** * @param string[] $args * @return void */ public static function main($args){ $client = self::createClient($args['access_key_id'], $args['access_key_secret'],$args['endpoint']); $sendSmsRequest = new SendSmsRequest([ "phoneNumbers" => $args['phone'], //发送的手机号码 "signName" => $args['sign_name'], //签名 "templateCode" => $args['template'], //模板CODE "templateParam" => $args['code'] //这个根据你的模板信息来 ]); $result = $client->sendSms($sendSmsRequest); // return $result; if ($result->body->message == 'OK' && $result->body->code == 'OK') { return ['code' => 200,'msg'=>'success']; } if ($result->body->code == 'isv.MOBILE_NUMBER_ILLEGAL') { return ['code' => 0, 'msg' => '手机号码格式不正确']; } return ['code' => 0, 'msg' => '短信发送失败,网络繁忙']; } }
4.3,发送短信
namespace app\admin\controller; use app\admin\controller\AliSms; use think\Session; use think\Request; use think\Db; class Send{ public function send(){ // $res = ROOT_PATH.'application/admin/controller/AliSms.php'; $request = Request::instance(); $phone = $request->param('phone'); $code = rand(1000,9999); session("{$phone}",$code); $accessKeyId = '';//accesskeyid $accessKeySecret = '';//accessketsecret $endpoint = 'dysmsapi.aliyuncs.com'; $param['access_key_id'] = $accessKeyId; $param['access_key_secret'] = $accessKeySecret; $param['endpoint'] = $endpoint; $param['phone'] = $phone; $param['sign_name'] = '模版名'; $param['template'] = 'SMS_472685110';//模版id // $param['code'] = "{\"code\":\"1234\"}"; $param['code'] = "{\"code\":\"{$code}\"}"; $res = AliSms::main($param); // var_dump($res); return json_encode($res); }
五、阿里云短信服务注意事项:避免常见问题
5.1 签名审核注意事项
• 签名必须能明确代表您的企业或品牌,命名规范需遵守平台规则
• 签名在阿里云审核通过后,还会提交给运营商进行最终实名报备,通常需要7到10个工作日或更长时间
• 在报备成功前,使用此签名发送短信可能会失败,并返回错误码 isv.PORT_NOT_REGISTERED (端口未注册)
5.2 模板审核注意事项
• 模板内容需符合平台规则,类型不同,审核标准和资费可能不同
• 模板需通过平台审核(约2小时)后才可使用
5.3 AccessKey安全注意事项
• 强烈建议使用RAM子用户的AccessKey,并授予其 AliyunDysmsFullAccess 权限策略,这比直接使用主账号的AK更安全
• 创建AccessKey后,务必妥善保管AccessKey ID和AccessKey Secret,避免泄露
• 若AccessKey泄露,需及时禁用或删除该AccessKey,并创建新的AccessKey
5.4 发送短信注意事项
• 发送短信时,需使用已审核通过并报备成功的签名和模板
• 若发送失败,需根据错误码排查问题,如 isv.PORT_NOT_REGISTERED表示端口未注册,需等待签名报备成功
六、阿里云短信服务常见问题FAQ:新手必看
6.1 个人认证账号能否发送营销短信?
个人认证账号功能受限,无法发送营销短信,且可能影响签名审核通过率,建议完成企业认证。
6.2 签名审核通过后,为什么发送短信仍然失败?
签名在阿里云审核通过后,还会提交给运营商进行最终实名报备,通常需要7到10个工作日或更长时间。在报备成功前,使用此签名发送短信可能会失败,并返回错误码 isv.PORT_NOT_REGISTERED (端口未注册)。
6.3 如何选择短信模板类型?
短信模板类型分为验证码、通知短信和推广短信。类型不同,审核标准和资费可能不同。创建时需选择正确的类型并与已审核通过的签名关联。
6.4 如何保障AccessKey的安全?
强烈建议使用RAM子用户的AccessKey,并授予其 AliyunDysmsFullAccess 权限策略,这比直接使用主账号的AK更安全。创建AccessKey后,务必妥善保管AccessKey ID和AccessKey Secret,避免泄露。若AccessKey泄露,需及时禁用或删除该AccessKey,并创建新的AccessKey。
6.5 如何查询短信发送状态?
可通过API(如QuerySendDetails)或配置回执消息(SmsReport)来查询每条短信的发送状态(成功/失败)。