浏览代码

添加登录需要短信验证码验证功能

yanliming 10 月之前
父节点
当前提交
742a427efd

+ 2 - 8
common/pom.xml

@@ -167,14 +167,8 @@
         <!--短信相关 start-->
         <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.1.0</version>
+            <artifactId>alibabacloud-dysmsapi20170525</artifactId>
+            <version>3.0.2</version>
         </dependency>
         <!--短信相关 end-->
 

+ 6 - 7
common/src/main/java/com/jpsoft/employment/modules/common/service/impl/SmsServiceImpl.java

@@ -1,6 +1,7 @@
 package com.jpsoft.employment.modules.common.service.impl;
 
-import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse;
+import com.google.gson.Gson;
 import com.jpsoft.employment.modules.common.service.SmsService;
 import com.jpsoft.employment.modules.common.utils.AliyunSmsConfig;
 import lombok.extern.slf4j.Slf4j;
@@ -23,13 +24,11 @@ public class SmsServiceImpl implements SmsService {
             // 因为是测试,这个地址先绑定测试机号码,选择专用测试模版 然后点击 下方调用api发送消息  就能看到 signName, templateCode,templateParam 这4个参数
             // 如果是正式环境 需要先审核资质,审核模板,然后添加签名,审核完成之后,就能看到所需要的参数(这里我自己为了方便就不去做资质审核了)
             SendSmsResponse response = aliyunSmsConfig.sendSms(
-                    phoneNumber,
-                    "十八匠", // 阿里云短信签名
-                    "SMS_478595063", // 阿里云短信模板代码
-                    "{\"code\":\"" + code + "\"}" // 模板参数
+                    phoneNumber,code
             );
-            log.info(response.getCode());
-            return "OK".equals(response.getCode());
+            String result = new Gson().toJson(response);
+            log.info(result);
+            return "OK".equals(result);
         } catch (Exception e) {
             e.printStackTrace();
             return false;

+ 53 - 21
common/src/main/java/com/jpsoft/employment/modules/common/utils/AliyunSmsConfig.java

@@ -1,15 +1,18 @@
 package com.jpsoft.employment.modules.common.utils;
 
 
-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.profile.DefaultProfile;
+import com.aliyun.auth.credentials.Credential;
+import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
+import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient;
+import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse;
+import com.google.gson.Gson;
+import darabonba.core.client.ClientOverrideConfiguration;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import java.util.concurrent.CompletableFuture;
+
 @Configuration
 public class AliyunSmsConfig {
     @Value("${aliyun.accessKeyId}")
@@ -18,23 +21,52 @@ public class AliyunSmsConfig {
     @Value("${aliyun.accessKeySecret}")
     private String accessKeySecret;
 
-    @Value("${aliyun.regionId}")
-    private String regionId;
 
-    @Bean
-    public IAcsClient acsClient() {
-        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
-        return new DefaultAcsClient(profile);
-    }
+    public SendSmsResponse sendSms(String phoneNumber, String code) throws Exception {
+
+        // Configure Credentials authentication information, including ak, secret, token
+        StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
+                // Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
+                .accessKeyId(accessKeyId)
+                .accessKeySecret(accessKeySecret)
+                //.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // use STS token
+                .build());
+
+        // Configure the Client
+        AsyncClient client = AsyncClient.builder()
+                .region("cn-qingdao") // Region ID
+                //.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
+                .credentialsProvider(provider)
+                //.serviceConfiguration(Configuration.create()) // Service-level configuration
+                // Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
+                .overrideConfiguration(
+                        ClientOverrideConfiguration.create()
+                                // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
+                                .setEndpointOverride("dysmsapi.aliyuncs.com")
+                        //.setConnectTimeout(Duration.ofSeconds(30))
+                )
+                .build();
 
-    public SendSmsResponse sendSms(String phoneNumber, String signName, String templateCode, String templateParam) throws Exception {
-        IAcsClient client = acsClient();
-        SendSmsRequest request = new SendSmsRequest();
-        request.setPhoneNumbers(phoneNumber);
-        request.setSignName(signName);
-        request.setTemplateCode(templateCode);
-        request.setTemplateParam(templateParam);
+        // Parameter settings for API request
+        SendSmsRequest sendSmsRequest = SendSmsRequest.builder()
+                .phoneNumbers(phoneNumber)
+                .signName("十八匠")
+                .templateCode("SMS_478595063")
+                .templateParam("{\"code\":\"" + code + "\"}")
+                // Request-level configuration rewrite, can set Http request parameters, etc.
+                // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
+                .build();
 
-        return client.getAcsResponse(request);
+        // Asynchronously get the return value of the API request
+        CompletableFuture<SendSmsResponse> response = client.sendSms(sendSmsRequest);
+        // Synchronously get the return value of the API request
+        SendSmsResponse resp = response.get();
+        System.out.println(new Gson().toJson(resp));
+
+        client.close();
+
+        return resp;
     }
+
+
 }

+ 7 - 5
web/src/main/java/com/jpsoft/employment/modules/common/controller/JwtsUserController.java

@@ -16,6 +16,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 
 import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -30,6 +32,7 @@ import java.util.concurrent.TimeUnit;
 @Slf4j
 @RestController
 public class JwtsUserController {
+    private Logger logger = LoggerFactory.getLogger(getClass());
     @Value("${jwt.secret}")
     private String jwtSecret;
 
@@ -193,17 +196,16 @@ public class JwtsUserController {
         if (user == null) {
             messageResult.setResult(false);
             messageResult.setMessage("用户不存在!");
-        }
-        else{
+        } else {
             String phone = user.getPhone();
-            if(StringUtil.isNotEmpty(phone)){
+            if (StringUtil.isNotEmpty(phone)) {
                 // 将验证码发送给用户
                 boolean success = smsService.sendVerificationCode(phone, captCha);
+                logger.info("发送验证码状态:" + String.valueOf(success));
                 captchaStore.put(captCha, System.currentTimeMillis());
                 messageResult.setResult(true);
                 messageResult.setData(captCha);
-            }
-            else{
+            } else {
                 messageResult.setResult(false);
                 messageResult.setMessage("此用户名绑定的手机号码不正确或未绑定手机号码!");
             }