From a5f2a27e47587dba9a35a0d0e0748c948ed891b2 Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Wed, 17 Sep 2025 17:34:16 +0800
Subject: [PATCH] Gotone短信验证码

---
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIdentifyingCodeController.java |    4 +
 trading-order-common/pom.xml                                                                        |   17 +++++
 trading-order-common/src/main/java/com/yami/trading/common/manager/sms/GoToneSmsUtils.java          |   93 +++++++++++++++++++++++++++++++
 trading-order-service/src/main/java/com/yami/trading/service/IdentifyingCodeService.java            |    4 +
 trading-order-service/src/main/java/com/yami/trading/service/impl/IdentifyingCodeServiceImpl.java   |   13 ++++
 5 files changed, 128 insertions(+), 3 deletions(-)

diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIdentifyingCodeController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIdentifyingCodeController.java
index 6f47fbb..ec8e4e0 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIdentifyingCodeController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIdentifyingCodeController.java
@@ -9,6 +9,8 @@
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.io.IOException;
+
 @RequestMapping("api/idcode")
 @RestController
 @Api(tags = "idcode")
@@ -18,7 +20,7 @@
     private IdentifyingCodeService identifyingCodeService;
 
     @RequestMapping("execute")
-    public Result execute(@RequestParam String target) {
+    public Result execute(@RequestParam String target) throws IOException {
             identifyingCodeService.send(target, IPHelper.getIpAddr());
         return Result.succeed(null);
     }
diff --git a/trading-order-common/pom.xml b/trading-order-common/pom.xml
index 81d25f0..12fa28b 100644
--- a/trading-order-common/pom.xml
+++ b/trading-order-common/pom.xml
@@ -29,6 +29,23 @@
             <artifactId>s3</artifactId>
         </dependency>
 
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>fluent-hc</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.14.0</version>
+        </dependency>
+
         <dependency>
             <groupId>net.coobird</groupId>
             <artifactId>thumbnailator</artifactId>
diff --git a/trading-order-common/src/main/java/com/yami/trading/common/manager/sms/GoToneSmsUtils.java b/trading-order-common/src/main/java/com/yami/trading/common/manager/sms/GoToneSmsUtils.java
new file mode 100644
index 0000000..f1385a5
--- /dev/null
+++ b/trading-order-common/src/main/java/com/yami/trading/common/manager/sms/GoToneSmsUtils.java
@@ -0,0 +1,93 @@
+package com.yami.trading.common.manager.sms;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.fluent.Request;
+import org.apache.http.entity.ContentType;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Component
+public class GoToneSmsUtils {
+    private static final String API_ENDPOINT = "https://app.gotonesms.ink/api/v3/sms/send";
+    private static final String apiToken ="68351|IjAi46FybmyAApdg58vweaw4JcePvRpBFeEClLlYa7c00e24";
+    private static final String senderId ="SignOTP";
+
+
+    public String sendSms(String recipient, String message) throws IOException {
+        return sendSms(recipient, senderId, message, null, null);
+    }
+
+    public String sendSms(String recipient, String senderId, String message) throws IOException {
+        return sendSms(recipient, senderId, message, null, null);
+    }
+
+    public String sendSms(String recipient, String senderId, String message,
+                          LocalDateTime scheduleTime, String dltTemplateId) throws IOException {
+        // 构建JSON请求体
+        StringBuilder jsonBody = new StringBuilder();
+        jsonBody.append("{")
+                .append("\"recipient\": \"").append(escapeJson(recipient)).append("\",")
+                .append("\"sender_id\": \"").append(escapeJson(senderId)).append("\",")
+                .append("\"type\": \"plain\",")
+                .append("\"message\": \"").append(escapeJson(message)).append("\"");
+
+        if (scheduleTime != null) {
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+            jsonBody.append(",\"schedule_time\": \"").append(scheduleTime.format(formatter)).append("\"");
+        }
+
+        if (dltTemplateId != null && !dltTemplateId.isEmpty()) {
+            jsonBody.append(",\"dlt_template_id\": \"").append(escapeJson(dltTemplateId)).append("\"");
+        }
+
+        jsonBody.append("}");
+
+        // 发送请求并获取响应
+        HttpResponse response = Request.Post(API_ENDPOINT)
+                .addHeader("Authorization", "Bearer " + apiToken)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("Accept", "application/json")
+                .bodyString(jsonBody.toString(), ContentType.APPLICATION_JSON)
+                .execute()
+                .returnResponse();
+
+        // 读取响应内容
+        return org.apache.http.util.EntityUtils.toString(response.getEntity());
+    }
+
+    private String escapeJson(String value) {
+        if (value == null) {
+            return "";
+        }
+        return value.replace("\\", "\\\\")
+                .replace("\"", "\\\"")
+                .replace("\b", "\\b")
+                .replace("\f", "\\f")
+                .replace("\n", "\\n")
+                .replace("\r", "\\r")
+                .replace("\t", "\\t");
+    }
+
+    public static void main(String[] args) {
+        GoToneSmsUtils sender = new GoToneSmsUtils();
+
+        try {
+            String response = sender.sendSms(
+                    "8617769309156",
+                    "SignOTP",
+                    "Your verification code is 123456."
+            );
+
+            // 输出响应结果
+            System.out.println("发送结果: " + response);
+            String responseWithChinese = StringEscapeUtils.unescapeJava(response);
+            System.out.println("中文发送结果: " + responseWithChinese);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/IdentifyingCodeService.java b/trading-order-service/src/main/java/com/yami/trading/service/IdentifyingCodeService.java
index 080412b..3f6c93b 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/IdentifyingCodeService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/IdentifyingCodeService.java
@@ -1,5 +1,7 @@
 package com.yami.trading.service;
 
+import java.io.IOException;
+
 public interface IdentifyingCodeService {
 
     /**
@@ -7,5 +9,5 @@
      * @param target 邮件或手机号
      * @param ip     会根据发送频率封ip
      */
-    public void send(String target, String ip);
+    public void send(String target, String ip) throws IOException;
 }
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/impl/IdentifyingCodeServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/impl/IdentifyingCodeServiceImpl.java
index b6d70f0..708dc54 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/impl/IdentifyingCodeServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/impl/IdentifyingCodeServiceImpl.java
@@ -5,6 +5,7 @@
 import com.yami.trading.common.http.HttpHelper;
 import com.yami.trading.common.manager.BlacklistIpTimeWindow;
 import com.yami.trading.common.manager.SendCountTimeWindow;
+import com.yami.trading.common.manager.sms.GoToneSmsUtils;
 import com.yami.trading.service.EmailSendService;
 import com.yami.trading.service.IdentifyingCodeService;
 import com.yami.trading.service.IdentifyingCodeTimeWindowService;
@@ -17,6 +18,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
 import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -55,8 +57,11 @@
 
     private Map<String, Integer> ipCache = new ConcurrentHashMap<String, Integer>();
 
+    @Autowired
+    GoToneSmsUtils goToneSmsUtils;
+
     @Override
-    public void send(String target, String ip) {
+    public void send(String target, String ip) throws IOException {
         String code = null;
         if (chcekIp(ip)) {// 被封的ip直接返回 不操作
             return;
@@ -100,6 +105,12 @@
                 return;
             }
 
+            if ("GoTone".equals(send_code_type)) {
+                goToneSmsUtils.sendSms(target, MessageFormat.format(send_code_text, new Object[] { code }));
+                logger.info(MessageFormat.format("GoTone--target:{0},code:{1},ip:{2}", target, code, ip));
+            }
+
+
             if ("tiantian".equals(send_code_type)) {
                 smsSendService.send(target, MessageFormat.format(send_code_text, new Object[] { code }));
                 logger.info(MessageFormat.format("tiangtian--target:{0},code:{1},ip:{2}", target, code, ip));

--
Gitblit v1.9.3