소스 검색

1.百度腾讯短信认证

wks 10 달 전
부모
커밋
2c7346f56a

+ 37 - 0
src/main/java/com/ydtech/components/SendSmsComponents.java

@@ -0,0 +1,37 @@
+package com.ydtech.components;
+
+
+import com.alibaba.fastjson.JSON;
+import com.ydtech.components.aliyun.AliyunSendSmsComponents;
+import com.ydtech.components.aliyun.SMSVerificationCode;
+import com.ydtech.components.aliyun.SendSmsEnum;
+import com.ydtech.components.baidu.BaiduSendSmsComponents;
+import com.ydtech.components.tencent.TencentSendSmsComponents;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class SendSmsComponents {
+
+    private final AliyunSendSmsComponents aliyunSendSmsComponents;
+
+    private final TencentSendSmsComponents tencentSendSmsComponents;
+
+    private final BaiduSendSmsComponents baiduSendSmsComponents;
+
+    public void sendSms(String phoneNumber, String captcha) throws Exception {
+        // 阿里云
+        aliyunSendSmsComponents.sendSms(phoneNumber, captcha);
+//        // 腾讯云
+//        tencentSendSmsComponents.sendSms(phoneNumber, captcha);
+//        // 百度
+//        baiduSendSmsComponents.sendSms(phoneNumber, captcha);
+    }
+
+
+}

+ 20 - 2
src/main/java/com/ydtech/components/aliyun/AliyunApiProperties.java

@@ -10,10 +10,28 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties(prefix = "aliyun.api")
 public class AliyunApiProperties {
 
-    //
+    /**
+     *
+     */
     private String accessKeyId;
 
-    //
+    /**
+     *
+     */
     private String accessKeySecret;
 
+    /**
+     * 链接
+     */
+    private String endpoint;
+
+    /**
+     * 签名
+     */
+    private String signName;
+
+    /**
+     * 模版
+     */
+    private String templateId;
 }

+ 8 - 8
src/main/java/com/ydtech/components/aliyun/SendSmsComponents.java → src/main/java/com/ydtech/components/aliyun/AliyunSendSmsComponents.java

@@ -1,22 +1,20 @@
 package com.ydtech.components.aliyun;
 
 
+import com.alibaba.fastjson.JSON;
 import com.aliyun.dysmsapi20170525.Client;
 import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
 import com.aliyun.tea.TeaException;
 import com.aliyun.teaopenapi.models.Config;
-import com.aliyun.teautil.models.RuntimeOptions;
-import com.ydtech.exception.SystemException;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Component;
 
 
 @Slf4j
 @Component
 @RequiredArgsConstructor
-public class SendSmsComponents {
+public class AliyunSendSmsComponents {
 
     private final AliyunApiProperties properties;
 
@@ -39,13 +37,15 @@ public class SendSmsComponents {
         return new Client(config);
     }
 
-    public void sendSms(String phoneNumber, SendSmsEnum sendSmsEnum, String templateParam) throws Exception {
+    public void sendSms(String phoneNumber, String captcha) throws Exception {
+        SMSVerificationCode smsVerificationCode = new SMSVerificationCode(String.valueOf(captcha));
+        String jsonString = JSON.toJSONString(smsVerificationCode);
         Client client = createClient();
         SendSmsRequest sendSmsRequest = new SendSmsRequest()
                 .setPhoneNumbers(phoneNumber)
-                .setSignName(sendSmsEnum.getSignName())
-                .setTemplateCode(sendSmsEnum.getCode())
-                .setTemplateParam(templateParam);
+                .setSignName(properties.getSignName())
+                .setTemplateCode(properties.getTemplateId())
+                .setTemplateParam(jsonString);
 
         sendSmsData(client, sendSmsRequest);
     }

+ 19 - 4
src/main/java/com/ydtech/components/baidu/BaiduApiProperties.java

@@ -6,12 +6,27 @@ import org.springframework.stereotype.Component;
 
 @Data
 @Component
-@ConfigurationProperties(prefix = "baiud.api")
+@ConfigurationProperties(prefix = "baidu.api")
 public class BaiduApiProperties {
 
-    // AccessKeyID
+    /**
+     * AccessKeyID
+     */
     private String accessKeyId;
-    // AccessKeySecret
+    /**
+     * AccessKeySecret
+     */
     private String accessKeySecret;
-
+    /**
+     * 链接
+     */
+    private String endpoint;
+    /**
+     * 签名
+     */
+    private String signatureId;
+    /**
+     * 模版
+     */
+    private String template;
 }

+ 48 - 0
src/main/java/com/ydtech/components/baidu/BaiduSendSmsComponents.java

@@ -0,0 +1,48 @@
+package com.ydtech.components.baidu;
+
+
+import com.baidubce.auth.DefaultBceCredentials;
+import com.baidubce.services.sms.SmsClient;
+import com.baidubce.services.sms.SmsClientConfiguration;
+import com.baidubce.services.sms.model.SendMessageV3Request;
+import com.baidubce.services.sms.model.SendMessageV3Response;
+import com.ydtech.exception.SystemException;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class BaiduSendSmsComponents {
+
+    private final BaiduApiProperties baiduApiProperties;
+
+    public void sendSms(String phoneNumber, String code) {
+        String ENDPOINT = "http://smsv3.bj.baidubce.com";
+
+        SmsClientConfiguration config = new SmsClientConfiguration();
+        config.setCredentials(new DefaultBceCredentials(baiduApiProperties.getAccessKeyId(), baiduApiProperties.getAccessKeySecret()));
+        config.setEndpoint(ENDPOINT);
+        SmsClient smsClient = new SmsClient(config);
+
+        SendMessageV3Request request = new SendMessageV3Request();
+        request.setMobile(phoneNumber);
+        request.setSignatureId("sms-signQxkiwz88470");
+        request.setTemplate("sms-tmpl-awKvRY85349");
+        Map<String, String> contentVar = new HashMap<>();
+        contentVar.put("code", code);
+        request.setContentVar(contentVar);
+        SendMessageV3Response response = smsClient.sendMessage(request);
+        // 解析请求响应 response.isSuccess()为true 表示成功
+        if (response != null && response.isSuccess()) {
+            return;
+        } else {
+            throw new SystemException("发送失败");
+        }
+
+    }
+}

+ 14 - 2
src/main/java/com/ydtech/components/tencent/TencentApiProperties.java

@@ -9,8 +9,20 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties(prefix = "tencent.api")
 public class TencentApiProperties {
 
-    private String appId;
+    // SecretId
+    private String secretId;
 
-    private String appSecret;
+    // SecretKey
+    private String secretKey;
+
+    private String region;
+
+    private String endpoint;
+
+    private String sdkAppId;
+
+    private String signName;
+
+    private String templateId;
 
 }

+ 88 - 0
src/main/java/com/ydtech/components/tencent/TencentSendSmsComponents.java

@@ -0,0 +1,88 @@
+package com.ydtech.components.tencent;
+
+
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.common.profile.HttpProfile;
+import com.tencentcloudapi.sms.v20210111.SmsClient;
+import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
+import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
+import com.tencentcloudapi.sms.v20210111.models.SendStatus;
+import com.ydtech.exception.SystemException;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class TencentSendSmsComponents {
+
+    private final TencentApiProperties tencentApiProperties;
+
+    /**
+     * 发送短信
+     *
+     * @param phoneNumber   手机号数组(需包含国际区号,例如 "+8613711112222")
+     * @param templateParam 模板参数数组,需要与模板内容变量一一对应
+     * @return 发送请求ID,可用于日志追踪;发送失败时返回null。
+     */
+    public String sendSms(String phoneNumber, String templateParam) {
+        phoneNumber = "+86" + phoneNumber;
+        String[] phoneNumberSet = new String[]{phoneNumber};
+        String[] templateParamSet = new String[]{templateParam};
+        SmsClient client = getSmsClient();
+        SendSmsRequest req = new SendSmsRequest();
+        // 使用注入的配置设置参数
+        req.setSmsSdkAppId(tencentApiProperties.getSdkAppId());
+        req.setSignName(tencentApiProperties.getSignName());
+        req.setTemplateId(tencentApiProperties.getTemplateId());
+        req.setTemplateParamSet(templateParamSet);
+        req.setPhoneNumberSet(phoneNumberSet);
+        req.setSessionContext("");
+        req.setExtendCode("");
+        req.setSenderId("");
+        try {
+            log.info("尝试发送短信,目标手机号:{}", Arrays.toString(phoneNumberSet));
+            SendSmsResponse res = client.SendSms(req);
+            log.debug("腾讯云短信接口原始响应:{}", SendSmsResponse.toJsonString(res));
+
+            // 检查发送结果
+            if (res.getSendStatusSet() != null && res.getSendStatusSet().length > 0) {
+                SendStatus status = res.getSendStatusSet()[0];
+                if ("Ok".equals(status.getCode())) {
+                    log.info("短信发送成功!请求ID:{}, 序列号:{}", res.getRequestId(), status.getSerialNo());
+                    return res.getRequestId(); // 返回请求ID用于追踪
+                } else {
+                    log.error("短信发送失败。错误码:{}, 错误信息:{}", status.getCode(), status.getMessage());
+                }
+            }
+            return null;
+
+        } catch (TencentCloudSDKException e) {
+            log.error("调用腾讯云短信服务SDK失败,错误信息:{}", e.getMessage(), e);
+            // 重试后仍失败,抛出运行时异常或自定义异常
+            throw new SystemException("短信服务暂时不可用,请稍后重试" + e.getMessage());
+        }
+    }
+
+    private SmsClient getSmsClient() {
+        Credential cred = new Credential(tencentApiProperties.getSecretId(), tencentApiProperties.getSecretKey());
+        HttpProfile httpProfile = new HttpProfile();
+        httpProfile.setEndpoint(tencentApiProperties.getEndpoint());
+        httpProfile.setReqMethod("GET");
+        httpProfile.setConnTimeout(10);
+        httpProfile.setWriteTimeout(10);
+        httpProfile.setReadTimeout(10);
+        ClientProfile clientProfile = new ClientProfile();
+        clientProfile.setSignMethod("HmacSHA256");
+        clientProfile.setHttpProfile(httpProfile);
+        // 使用注入的配置创建客户端
+        return new SmsClient(cred, tencentApiProperties.getRegion(), clientProfile);
+    }
+
+}

+ 5 - 7
src/main/java/com/ydtech/modules/admin/controller/SysLoginController.java

@@ -9,8 +9,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.code.kaptcha.Producer;
+import com.ydtech.components.SendSmsComponents;
 import com.ydtech.components.aliyun.SMSVerificationCode;
-import com.ydtech.components.aliyun.SendSmsComponents;
+import com.ydtech.components.aliyun.AliyunSendSmsComponents;
 import com.ydtech.components.aliyun.SendSmsEnum;
 import com.ydtech.config.MasterPasswordConfig;
 import com.ydtech.constants.SysConstants;
@@ -439,8 +440,8 @@ public class SysLoginController {
 //    }
 
 
-    @Autowired
-    private SendSmsComponents sendSms;
+
+    private final SendSmsComponents sendSms;
 
     /**
      * 短信发送
@@ -464,11 +465,8 @@ public class SysLoginController {
         redisTemplate.opsForValue()
                 .set(PHONE_VERIFICATION_CODE_KEY + phone, String.valueOf(randNumber), PHONE_VERIFICATION_CODE_KEY_TIME
                         , TimeUnit.MINUTES);
-
         try {
-            SMSVerificationCode smsVerificationCode = new SMSVerificationCode(String.valueOf(randNumber));
-            String jsonString = JSON.toJSONString(smsVerificationCode);
-            sendSms.sendSms(phone, SendSmsEnum.SMS_220650023, jsonString);
+            sendSms.sendSms(phone, String.valueOf(randNumber));
             return HttpResult.ok("发送成功");
         } catch (Exception e) {
             e.printStackTrace();