javaweb项目如何实现手机短信登录

下面我来详细讲解如何实现手机短信登录的完整攻略:

下面我来详细讲解如何实现手机短信登录的完整攻略:

步骤一:申请短信服务

要实现手机短信登录,首先需要申请一个短信服务供应商提供的服务,通常情况下这些服务都需要扣除一定的费用,具体费用因服务供应商而异。以下是两种比较常用的短信服务供应商:

腾讯云短信服务

腾讯云短信服务提供快速、高可靠、低成本、全网覆盖的短信验证码发送服务。首先,你需要去 腾讯云官网 进行注册,然后选择相关的服务选项申请使用云短信服务,申请后可以获得相应的 AppIDAppKey 等验证信息用于调用短信服务。

阿里云短信服务

阿里云短信服务也是一款非常稳定、高效的短信验证码发送服务,有着国内较为广泛的使用。要使用阿里云短信服务,首先需要去 阿里云官网 进行注册,然后选择相关的短信服务选项,根据官网提供的操作指导即可完成申请,申请后可以获得相应的 AccessKeyIdAccessKeySecret 等验证信息用于调用该服务。

步骤二:集成短信服务

申请成功后,我们需要将相应的验证信息集成到我们的项目中,以便通过接口随时调用。下面以使用腾讯云短信服务为例,提供一个简单的 Java 工具类:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Base64;
import java.util.Random;

public class SmsSender {

    private static final String SDK_APP_ID = "Your SDKAppID";
    private static final String SECRET_ID = "Your SecretID";
    private static final String SECRET_KEY = "Your SecretKey";
    private static final String SIGN_NAME = "YourSignName";
    private static final String TEMPLATE_ID = "YourTemplateId";

    /**
     * 根据手机号发送验证码短信
     *
     * @param phoneNumber 手机号码
     * @return 发送结果
     */
    public static String sendVerificationCode(String phoneNumber) {
        try {
            long currTime = System.currentTimeMillis() / 1000;
            int randomNumber = new Random().nextInt(999999);
            String original = String.format(
                "apikey=%s&random=%d&time=%d&mobile=%s",
                SECRET_KEY, randomNumber, currTime, phoneNumber
            );
            String hmac = hmacSha256(original, SECRET_ID);

            String requestUrl = String.format(
                "https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=%s&random=%d",
                SDK_APP_ID, randomNumber
            );
            String requestBody = String.format(
                "{"
                    + "\"tel\": {\"mobile\": \"%s\"},"
                    + "\"sign\":\"%s\","
                    + "\"tpl_id\":\"%s\","
                    + "\"params\":[\"%d\"]"
                    + "}",
                phoneNumber, SIGN_NAME, TEMPLATE_ID, randomNumber
            );

            HttpUtils.HttpResponse response = HttpUtils.post(requestUrl, requestBody, "Content-Type", "application/json", "Authorization", hmac);
            String json = response.getContent();
            if (response.getStatus() == 200) {
                return json;
            } else {
                return String.format("{\"result\": %d, \"errmsg\": \"%s\"}", response.getStatus(), json);
            }
        } catch (Exception e) {
            return String.format("{\"result\": -1, \"errmsg\": \"%s\"}", e.getMessage());
        }
    }

    /**
     * HmacSHA256签名
     *
     * @param data       原始字符串
     * @param secret     私钥
     * @return 签名结果
     * @throws Exception 异常
     */
    private static String hmacSha256(String data, String secret) throws Exception {
        byte[] secretBytes = secret.getBytes(StandardCharsets.UTF_8);
        SecretKeySpec signingKey = new SecretKeySpec(secretBytes, "HmacSHA256");
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(signingKey);

        byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
        byte[] rawHmac = mac.doFinal(dataBytes);
        byte[] signatureBytes = Base64.getEncoder().encode(rawHmac);
        return URLEncoder.encode(new String(signatureBytes, StandardCharsets.UTF_8), StandardCharsets.UTF_8.name());
    }
}

步骤三:实现手机短信登录接口

有了短信服务,我们就可以开始实现短信登录的接口了。下面提供一个参考实现:

@RestController
public class SmsLoginController {

    @Autowired
    private UserDetailsService userDetailsService;

    /**
     * 发送验证码
     *
     * @param phoneNumber 手机号码
     * @return 发送结果
     */
    @PostMapping("/login/sms/send")
    public String sendVerificationCode(@RequestParam("phoneNumber") String phoneNumber) {
        String result = SmsSender.sendVerificationCode(phoneNumber);
        if (result.contains("\"result\":0")) {
            return "{\"code\":0,\"message\":\"发送成功\"}";
        } else {
            return "{\"code\":1,\"message\":\"发送失败\"}";
        }
    }

    /**
     * 手机验证码登录
     *
     * @param phoneNumber 手机号码
     * @param code        验证码
     * @return 登录结果
     */
    @PostMapping("/login/sms")
    public String smsLogin(@RequestParam("phoneNumber") String phoneNumber, @RequestParam("code") String code) {
        UserDetails userDetails = userDetailsService.loadUserByUsername(phoneNumber);
        if (userDetails == null) {
            return "{\"code\":1,\"message\":\"该手机号未注册\"}";
        }

        // 模拟验证码与数据库中存储的值进行比较
        if (!"123456".equals(code)) {
            return "{\"code\":1,\"message\":\"验证码错误\"}";
        }

        String token = JwtTokenUtil.generateToken(userDetails);
        return "{\"code\":0,\"message\":\"登录成功\",\"data\":{\"token\":\"" + token + "\"}}";
    }
}

在这个示例中,我们通过 /login/sms/send 接口发送短信验证码,然后使用 /login/sms 接口进行登录认证。认证过程中需要验证验证码是否有效,并通过 JWT 生成一个新的令牌返回给客户端。在生产环境中,你可能需要根据实际情况调整认证方式和参数等内容。

以上就是javaweb项目如何实现手机短信登录的完整攻略,希望能对你有所帮助。

本文标题为:javaweb项目如何实现手机短信登录

基础教程推荐