Ver código fonte

add tecrm sms

Mr.qian 6 horas atrás
pai
commit
da14c0cfcb

+ 27 - 0
cif-service/src/main/java/com/txz/cif/configurer/TecrmConf.java

@@ -0,0 +1,27 @@
+package com.txz.cif.configurer;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2025/11/17
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "tecrm")
+public class TecrmConf {
+    
+    private String appId;
+    
+    private String appKey;
+    
+    private String cid;
+    
+    private String templateCode;
+    
+    private String domain;
+    
+}

+ 13 - 0
cif-service/src/main/java/com/txz/cif/service/TecrmService.java

@@ -0,0 +1,13 @@
+package com.txz.cif.service;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2025/11/17
+ */
+
+public interface TecrmService {
+    
+    boolean sendSms(String mobile, String code);
+    
+}

+ 3 - 0
cif-service/src/main/java/com/txz/cif/service/impl/CSHuaGuServiceImpl.java

@@ -29,6 +29,9 @@ public class CSHuaGuServiceImpl implements CSHuaGuService {
         body.put("context", message);
         body.put("secret", csHuaGuConf.getSmsApisecret());
         String result = "";
+        
+        log.info("csHuaGu-sms-req:{}", body.toJSONString());
+        
         try {
             result = HttpUtil.createPost(csHuaGuConf.getSmsApiurl())
                     .body(body.toJSONString())

+ 2 - 0
cif-service/src/main/java/com/txz/cif/service/impl/JPushServiceImpl.java

@@ -48,6 +48,8 @@ public class JPushServiceImpl implements JPushService {
         pushSmsDTO.setCode(code);
         pushSmsDTO.setTemplate(templateDTO);
         
+        log.info("jpush-sms-req:{}", JSONUtil.toJsonStr(pushSmsDTO));
+        
         String body = HttpUtil.createPost(jPushConf.getReqUrl())
                 .contentType("application/json")
                 .auth(jPushConf.getAuth())

+ 153 - 0
cif-service/src/main/java/com/txz/cif/service/impl/TecrmServiceImpl.java

@@ -0,0 +1,153 @@
+package com.txz.cif.service.impl;
+
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.txz.cif.configurer.TecrmConf;
+import com.txz.cif.service.TecrmService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.security.MessageDigest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+/**
+ *
+ * @author: MTD®️
+ * @date: 2025/11/17
+ */
+@Service
+@Slf4j
+@AllArgsConstructor
+public class TecrmServiceImpl implements TecrmService {
+    
+    private static final String smsUrl = "/backend/msg-channel/v1/external/send-otp";
+    
+    private final TecrmConf tecrmConf;
+    
+    @Override
+    public boolean sendSms(String mobile, String code) {
+        log.info("开始发送短信--->" + mobile + ",--->" + code);
+        
+        try {
+            // 生成签名参数
+            Map<String, String> signParams = generateSignature(tecrmConf.getAppId(), tecrmConf.getAppKey());
+            
+            // 构建请求URL
+            String url = tecrmConf.getDomain() + smsUrl;
+            
+            // 构建请求体
+            JSONObject requestBody = new JSONObject();
+            requestBody.put("cid", tecrmConf.getCid());
+            requestBody.put("phone_number", mobile);
+            requestBody.put("otp", code);
+            requestBody.put("template_code", tecrmConf.getTemplateCode());
+            
+            log.info("tecrm-sms-body:{}", JSONUtil.toJsonStr(requestBody));
+            
+            // 构建完整URL(包含查询参数)
+            String fullUrl = String.format("%s?timestamp=%s&nonce=%s&appid=%s&signature=%s",
+                    url,
+                    signParams.get("timestamp"),
+                    signParams.get("nonce"),
+                    signParams.get("appid"),
+                    signParams.get("signature"));
+            
+            // 发送HTTP请求
+            String result = HttpUtil.createPost(fullUrl)
+                    .body(JSONUtil.toJsonStr(requestBody))
+                    .contentType("application/json")
+                    .execute()
+                    .body();
+            
+            log.info("tecrm-sms-result:{}", result);
+            
+            // 解析响应结果
+            JSONObject resultJson = JSONUtil.parseObj(result);
+            
+            // 根据API响应格式判断成功条件
+            // 成功条件:code为0且data.ok为true
+            if (resultJson.getInt("code", -1) == 0) {
+                JSONObject data = resultJson.getJSONObject("data");
+                if (data != null && data.getBool("ok", false)) {
+                    log.info("发送短信成功");
+                    return true;
+                }
+            }
+            
+            // 记录失败原因
+            String message = resultJson.getStr("message", "未知错误");
+            log.error("发送短信失败,code: {}, message: {}", resultJson.getInt("code"), message);
+            return false;
+        } catch (Exception e) {
+            log.error("发送短信异常", e);
+            return false;
+        }
+    }
+    
+    /**
+     * 生成签名
+     *
+     * @param appid  应用ID
+     * @param appkey 应用密钥
+     *
+     * @return 包含签名信息的Map
+     */
+    private Map<String, String> generateSignature(String appid, String appkey) {
+        long timestamp = System.currentTimeMillis() / 1000;
+        String nonce = generateNonce(6);
+        
+        // 构建签名字符串: timestamp:nonce:appkey
+        String signString = timestamp + ":" + nonce + ":" + appkey;
+        
+        // SHA1加密
+        String signature = sha1(signString);
+        
+        Map<String, String> signMap = new HashMap<>();
+        signMap.put("timestamp", String.valueOf(timestamp));
+        signMap.put("nonce", nonce);
+        signMap.put("appid", appid);
+        signMap.put("signature", signature);
+        
+        return signMap;
+    }
+    
+    /**
+     * SHA1加密
+     */
+    private String sha1(String input) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("SHA-1");
+            byte[] digest = md.digest(input.getBytes("UTF-8"));
+            StringBuilder sb = new StringBuilder();
+            for (byte b : digest) {
+                sb.append(String.format("%02x", b));
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            throw new RuntimeException("SHA-1算法不可用", e);
+        }
+    }
+    
+    /**
+     * 生成指定长度的随机字符串(大小写字母)
+     */
+    private String generateNonce(int length) {
+        Random random = new Random(System.currentTimeMillis());
+        StringBuilder sb = new StringBuilder();
+        
+        for (int i = 0; i < length; i++) {
+            int num = random.nextInt(57) + 65; // 65-122范围
+            // 跳过91-96之间的字符(大写字母Z和小写字母a之间的符号)
+            while (num > 90 && num < 97) {
+                num = random.nextInt(57) + 65;
+            }
+            sb.append((char) num);
+        }
+        
+        return sb.toString();
+    }
+}

+ 10 - 4
cif-service/src/main/java/com/txz/cif/service/impl/UserServiceImpl.java

@@ -14,10 +14,7 @@ import com.txz.cif.dto.UserDTO;
 import com.txz.cif.dubbo.client.OperatingConfigDubboServiceClient;
 import com.txz.cif.model.Account;
 import com.txz.cif.model.User;
-import com.txz.cif.service.AccountService;
-import com.txz.cif.service.CSHuaGuService;
-import com.txz.cif.service.JPushService;
-import com.txz.cif.service.UserService;
+import com.txz.cif.service.*;
 import com.txz.cif.web.para.UserAddParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,6 +61,9 @@ public class UserServiceImpl extends AbstractService<User> implements UserServic
     @Resource
     private JPushService jPushService;
     
+    @Resource
+    private TecrmService tecrmService;
+    
     @Override
     public Boolean checkMail(String email) {
         User user = findBy("email", email);
@@ -97,6 +97,12 @@ public class UserServiceImpl extends AbstractService<User> implements UserServic
                     return Result.success();
                 }
                 return Result.fail();
+            case "tecrm":
+                if (tecrmService.sendSms(phoneNo, code)) {
+                    redisClient.set(key, code, 60 * 5);
+                    return Result.success();
+                }
+                return Result.fail();
             default:
             case "cshuagu":
                 if (csHuaGuService.sendSmsValidCode(phoneNo, String.format(SMS_MESSAGE, code))) {