新版仿ok交易所-后端
zyy
2025-09-17 a5f2a27e47587dba9a35a0d0e0748c948ed891b2
Gotone短信验证码
4 files modified
1 files added
131 ■■■■■ changed files
trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIdentifyingCodeController.java 4 ●●● patch | view | raw | blame | history
trading-order-common/pom.xml 17 ●●●●● patch | view | raw | blame | history
trading-order-common/src/main/java/com/yami/trading/common/manager/sms/GoToneSmsUtils.java 93 ●●●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/IdentifyingCodeService.java 4 ●●● patch | view | raw | blame | history
trading-order-service/src/main/java/com/yami/trading/service/impl/IdentifyingCodeServiceImpl.java 13 ●●●●● patch | view | raw | blame | history
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);
    }
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>
trading-order-common/src/main/java/com/yami/trading/common/manager/sms/GoToneSmsUtils.java
New file
@@ -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();
        }
    }
}
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;
}
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));