在 Spring Boot 开发的 CRM 系统中,用户注册时可以通过阿里云短信服务来校验电话号码。这个流程一般是通过发送短信验证码(OTP - One-Time Password)到用户的手机号码,并要求用户在系统中输入验证码,来验证电话号码的真实性和用户对该号码的控制权。
下面是通过阿里云平台进行电话号码校验的详细步骤:
1. 配置阿里云短信服务
首先,开通并配置阿里云的短信服务,并获取必要的凭证。
(1) 开通阿里云短信服务
- 登录 阿里云控制台。
- 进入短信服务页面,创建短信签名和模板。
- 短信签名:这就是短信发送者的标识,比如“阿里云”。
- 短信模板:短信的内容模板。模板中可以包含占位符,例如验证码。
(2) 获取 AccessKey 和 SecretKey
- 在阿里云控制台的 AccessKey 管理页面,获取 AccessKeyId 和 AccessKeySecret,后续在SpringBoot 项目中需要用到这些密钥信息。
(3) 创建短信模板
短信模板可能是这样的:
尊敬的用户,您的验证码为:${code},请于5分钟内使用。若非本人操作,请忽略此短信。
2. 集成阿里云短信服务 SDK
在 Spring Boot 项目中,使用 Maven 引入阿里云短信服务 SDK。
(1) Maven 依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.0.0</version>
</dependency>
(2) 配置阿里云 SDK 的基本信息
在application.yml中配置阿里云短信服务的 AccessKeyId、AccessKeySecret 以及相关配置信息:
aliyun:
sms:
accessKeyId: your_access_key_id
accessKeySecret: your_access_key_secret
signName: your_sms_sign_name # 短信签名
templateCode: your_sms_template_code # 短信模板的ID
regionId: cn-hangzhou
3. 生成并发送短信验证码
在用户注册时,系统需要生成一个随机验证码,并通过阿里云短信服务发送到用户的手机上。
(1) 创建 SmsService
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Random;
@Service
public class SmsService {
@Value("${aliyun.sms.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.sms.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.sms.signName}")
private String signName;
@Value("${aliyun.sms.templateCode}")
private String templateCode;
@Value("${aliyun.sms.regionId}")
private String regionId;
// 生成随机验证码
public String generateVerificationCode() {
Random random = new Random();
int code = 100000 + random.nextInt(900000); // 生成6位随机数
return String.valueOf(code);
}
// 发送验证码
public void sendSms(String phoneNumber, String code) throws ClientException {
// 设置阿里云 SDK 客户端
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
// 创建短信请求
SendSmsRequest request = new SendSmsRequest();
request.setPhoneNumbers(phoneNumber); // 接收短信的手机号
request.setSignName(signName); // 短信签名
request.setTemplateCode(templateCode); // 短信模板 ID
request.setTemplateParam("{\"code\":\"" + code + "\"}"); // 短信模板中的参数
// 发送短信
SendSmsResponse response = client.getAcsResponse(request);
if (!"OK".equals(response.getCode())) {
throw new ClientException("Error occurred while sending SMS: " + response.getMessage());
}
}
}
(2) 生成并发送验证码
在用户提交注册信息时,系统会生成一个验证码,并通过 SmsService 发送到用户的手机号码:
@Autowired
private SmsService smsService;
public void registerUser(User user) throws ClientException {
// 生成验证码
String verificationCode = smsService.generateVerificationCode();
// 将验证码保存到数据库,关联用户(可以使用 Redis 或数据库保存)
saveVerificationCode(user.getPhoneNumber(), verificationCode);
// 发送验证码
smsService.sendSms(user.getPhoneNumber(), verificationCode);
}
4. 用户输入验证码进行验证
用户收到短信验证码后,需要在页面上输入验证码,系统将会验证用户输入的验证码是否正确。
(1) 创建一个 API 来接收用户输入的验证码
用户输入验证码后,前端会将验证码提交给后端进行验证。可以创建一个 API 来处理此请求:
@RestController
@RequestMapping("/verify-phone")
public class PhoneVerificationController {
@Autowired
private UserService userService;
@PostMapping
public ResponseEntity<String> verifyPhone(@RequestParam String phoneNumber, @RequestParam String verificationCode) {
boolean isVerified = userService.verifyPhoneNumber(phoneNumber, verificationCode);
if (isVerified) {
return ResponseEntity.ok("Phone number verified successfully!");
} else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid or expired verification code.");
}
}
}
(2) 实现验证码验证逻辑
在 UserService 中实现 verifyPhoneNumber 方法,验证用户输入的验证码是否正确:
public boolean verifyPhoneNumber(String phoneNumber, String verificationCode) {
// 从数据库或缓存中获取保存的验证码
String storedCode = getStoredVerificationCode(phoneNumber);
if (storedCode != null && storedCode.equals(verificationCode)) {
// 验证成功,更新用户状态
User user = userRepository.findByPhoneNumber(phoneNumber);
user.setPhoneVerified(true);
userRepository.save(user);
// 验证码验证通过后可以清除存储的验证码
clearStoredVerificationCode(phoneNumber);
return true;
}
return false;
}
5. 验证成功后完成注册
一旦用户成功通过验证码验证,系统可以将用户的状态更新为激活状态,并允许他们登录和使用系统的功能。
总结
- 配置阿里云短信服务:开通阿里云短信服务,获取 AccessKeyId、AccessKeySecret,创建短信模板。
- 生成短信验证码:在用户注册时,生成一个随机的验证码,并通过阿里云短信服务发送到用户的手机。
- 用户输入验证码:用户在系统中输入收到的短信验证码。
- 校验验证码:系统验证用户输入的验证码是否与之前发送的匹配,验证成功后完成注册。
通过这种方式,可以确保用户提供的电话号码是真实且有效的,并且用户对其号码具有控制权。