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));