前两天帮一个老朋友写了一个通过短信重置密码的功能。
本文主要介绍一下阿里云短信的使用,其实挺简单的,这里记录一下分享给需要的朋友。
大致的步骤如下
先介绍一下阿里云短信平台相关操作
官网地址:https://dysms.console.aliyun.com/dysms.htm
直接点击开通即可
签名就是短信中【】里的内容,短信中会自动加在最前面,一般是公司简称。
短信模板就是短信的具体内容,因为我们这个是验证码短信,就是我们需要把自己通过 java 代码生成的数字放到模板内容里,所以这个地方需要加一个变量,如 ${code}。
最终可以获得短信模板
可以对每小时发送总来限制,也可以对某一个手机号设置发送频率
这对防盗刷很必要
阿里云密钥是在阿里云平台里是通用的,如果没有创建可以在该页面创建。
页面地址:https://usercenter.console.aliyun.com/
创建完后获得 AccessKey ID 和 Access Key Secret
这个需要妥善保管
官方示例:点此
顺便贴一下重置密码的代码
本文主要介绍一下阿里云短信的使用,其实挺简单的,这里记录一下分享给需要的朋友。
大致的步骤如下
- 开通阿里云短信功能
- 创建密钥和
- 创建短信签名
- 创建短信模板
- 购买短信包,5000条/250元
- 根据官网提供 demo 和文档进行开发
先介绍一下阿里云短信平台相关操作
一、开通阿里云短信平台
1.进入官网
官网地址:https://dysms.console.aliyun.com/dysms.htm
直接点击开通即可
2.查看新手指导
3.创建国内短信签名
签名就是短信中【】里的内容,短信中会自动加在最前面,一般是公司简称。
4.创建短信模板
短信模板就是短信的具体内容,因为我们这个是验证码短信,就是我们需要把自己通过 java 代码生成的数字放到模板内容里,所以这个地方需要加一个变量,如 ${code}。
最终可以获得短信模板
5.开通短信包
6.安全设置
可以对每小时发送总来限制,也可以对某一个手机号设置发送频率
这对防盗刷很必要
7.创建阿里云密钥
阿里云密钥是在阿里云平台里是通用的,如果没有创建可以在该页面创建。
页面地址:https://usercenter.console.aliyun.com/
创建完后获得 AccessKey ID 和 Access Key Secret
这个需要妥善保管
二、官方文档说明
用SendSms发送短信。
SendSms接口是短信发送接口,支持在一次请求中向多个不同的手机号码发送同样内容的短信。
如果您需要在一次请求中分别向多个不同的手机号码发送不同签名和模版内容的短信,请使用SendBatchSms接口。
调用该接口发送短信时,请注意:
- 发送短信会根据发送量计费,价格请参考计费说明。
- 在一次请求中,最多可以向1000个手机号码发送同样内容的短信。
请求参数
名称 | 类型 | 是否必选 | 示例值 | 描述 |
---|---|---|---|---|
PhoneNumbers | String | 是 | 15900000000 |
接收短信的手机号码。 格式:
支持对多个手机号码发送短信,手机号码之间以英文逗号(,)分隔。上限为1000个手机号码。批量调用相对于单条调用及时性稍有延迟。 说明 验证码类型短信,建议使用单独发送的方式。
|
SignName | String | 是 | 阿里云 |
短信签名名称。请在控制台签名管理页面签名名称一列查看。 说明 必须是已添加、并通过审核的短信签名。
|
TemplateCode | String | 是 | SMS_153055065 |
短信模板ID。请在控制台模板管理页面模板CODE一列查看。 说明 必须是已添加、并通过审核的短信签名;且发送国际/港澳台消息时,请使用国际/港澳台短信模版。
|
AccessKeyId | String | 否 | LTAIP00vvvvvvvvv |
主账号AccessKey的ID。 |
Action | String | 否 | SendSms |
系统规定参数。取值:SendSms。 |
OutId | String | 否 | abcdefgh |
外部流水扩展字段。 |
SmsUpExtendCode | String | 否 | 90999 |
上行短信扩展码,无特殊需要此字段的用户请忽略此字段。 |
TemplateParam | String | 否 | {"code":"1111"} |
短信模板变量对应的实际值,JSON格式。 说明 如果JSON中需要带换行符,请参照标准的JSON协议处理。
|
返回数据
名称 | 类型 | 示例值 | 描述 |
---|---|---|---|
BizId | String | 900619746936498440^0 |
发送回执ID,可根据该ID在接口QuerySendDetails中查询具体的发送状态。 |
Code | String | OK |
请求状态码。
|
Message | String | OK |
状态码的描述。 |
RequestId | String | F655A8D5-B967-440B-8683-DAD6FF8DE990 |
请求ID。 |
示例
请求示例
http(s)://[Endpoint]/?PhoneNumbers=15900000000
&SignName=阿里云
&TemplateCode=SMS_153055065
&<公共请求参数>
正常返回示例
XML
格式
<SendSmsResponse>
<Message>OK</Message>
<RequestId>44DF7A95-603F-4651-9298-BE1850BEB53F</RequestId>
<BizId>336006646937050335^0</BizId>
<Code>OK</Code>
</SendSmsResponse>
JSON
格式
{
"Message":"OK",
"RequestId":"2184201F-BFB3-446B-B1F2-C746B7BF0657",
"BizId":"197703245997295588^0",
"Code":"OK"
}
错误码
访问错误中心查看更多错误码。
二、代码示例
官方示例:点此
1.添加依赖
- <dependency>
- <groupId>com.aliyun</groupId>
- <artifactId>aliyun-java-sdk-core</artifactId>
- <version>4.0.3</version>
- </dependency>
2.示例
- package org.chwin.firefighting.apiserver.sysmanage.controller;
- 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 org.chwin.firefighting.apiserver.device.util.RedisUtil;
- import org.chwin.firefighting.apiserver.sysmanage.entity.SysUser;
- import org.chwin.firefighting.apiserver.sysmanage.mapper.SysUserMapper;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RestController;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Objects;
- /**
- * 发送短信示例
- *
- * @author 言曌
- * @date 2019-12-14 19:10
- */
- @RestController
- public class DemoController {
- @Autowired
- private SysUserMapper sysUserMapper;
- @Autowired
- private RedisUtil redisUtil;
- @PostMapping(value = "/sendForgetSms")
- public Map<String, Object> sendForgetSms(String account, String phone) {
- Map<String, Object> resultMap = new HashMap<>();
- // 1.校验账号和手机号是否匹配
- // 业务逻辑示例,不需要可以去掉
- SysUser sysUser = sysUserMapper.findByAccount(account);
- if (sysUser == null || !Objects.equals(phone, sysUser.getPhone())) {
- resultMap.put("code", 500);
- resultMap.put("msg", "账号和手机号不匹配");
- return resultMap;
- }
- // 2.发送短信
- // 相关配置可以放在 application.properties 里,这里为了简单直接写在代码里
- // 注意
- DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou",
- "<AccessKey ID>",
- "<Access Key Secret>");
- 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", "cn-hangzhou");
- request.putQueryParameter("PhoneNumbers", phone);
- request.putQueryParameter("SignName", "<签名名称>"); // 签名名称
- request.putQueryParameter("TemplateCode", "<模板编码>"); //模板编码
- // 随机六位验证码
- Integer code = (int) ((Math.random() * 9 + 1) * 100000);
- String jsonParam = "{\"number\": " + code + "}";
- request.putQueryParameter("TemplateParam", jsonParam); // 需要传json格式,参数为模板编码 ${code} 的code
- try {
- // 将验证码存储到 redis, 5分钟过期
- redisUtil.set("sms::user::forget::" + phone, code, 60 * 5L);
- // 发送短信
- CommonResponse response = client.getCommonResponse(request);
- SmsResponseData smsResponseData = JSON.parseObject(response.getData(), SmsResponseData.class);
- // 发送成功
- if("OK".equals(smsResponseData.getCode())) {
- resultMap.put("code", 200);
- resultMap.put("msg", "发送成功");
- } else if ("isv.BUSINESS_LIMIT_CONTROL".equals(smsResponseData.getCode())) {
- resultMap.put("code", 500);
- resultMap.put("msg", "短信发送频率超限");
- }
- // else if
- // 更多错误码参考
- // https://help.aliyun.com/document_detail/101346.html?spm=a2c1g.8271268.10000.122.772fdf25rYnhIc
- } catch (ServerException e) {
- e.printStackTrace();
- resultMap.put("code", 500);
- resultMap.put("msg", "发送失败");
- } catch (ClientException e) {
- e.printStackTrace();
- resultMap.put("code", 500);
- resultMap.put("msg", "发送失败");
- }
- return resultMap;
- }
- /**
- * 阿里短信响应封装类
- */
- private static class SmsResponseData {
- private String Message;
- private String RequestId;
- private String BizId;
- private String Code;
- public String getMessage() {
- return Message;
- }
- public void setMessage(String message) {
- Message = message;
- }
- public String getRequestId() {
- return RequestId;
- }
- public void setRequestId(String requestId) {
- RequestId = requestId;
- }
- public String getBizId() {
- return BizId;
- }
- public void setBizId(String bizId) {
- BizId = bizId;
- }
- public String getCode() {
- return Code;
- }
- public void setCode(String code) {
- Code = code;
- }
- }
- }
顺便贴一下重置密码的代码
- /**
- * 重置密码,验证短信并修改密码
- * @param account
- * @param phone
- * @param code
- * @param password
- * @param confirmPassword
- * @return
- */
- @PostMapping(value = "/checkForgetSms")
- public Map<String, Object> checkForgetSms(
- String account,
- String phone,
- String code,
- String password,
- String confirmPassword) {
- Map<String, Object> resultMap = new HashMap<>();
- // 1.校验两次密码是否一致
- if (!Objects.equals(password, confirmPassword)) {
- resultMap.put("code", 500);
- resultMap.put("msg", "密码和确认密码不一致");
- return resultMap;
- }
- // 2.校验账号和手机号是否匹配
- SysUser sysUser = sysUserMapper.findByAccount(account);
- if (sysUser == null || !Objects.equals(phone, sysUser.getPhone())) {
- resultMap.put("code", 500);
- resultMap.put("msg", "账号和手机号不匹配");
- return resultMap;
- }
- // 3.校验验证码是否正确
- String checkCode = String.valueOf(redisUtil.get("sms::user::forget::" + phone));
- if (StringUtils.isEmpty(checkCode) || !Objects.equals(checkCode, code)) {
- // 验证码错误
- resultMap.put("code", 500);
- resultMap.put("msg", "验证码错误");
- return resultMap;
- }
- // 验证码正确,修改密码,md5加密一次
- sysUser.setPassword(DigestUtils.md5DigestAsHex(password.getBytes()));
- sysUserMapper.updateByPrimaryKeySelective(sysUser);
- resultMap.put("code", 200);
- resultMap.put("msg", "重置成功");
- return resultMap;
- }
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏