|
@@ -1,11 +1,13 @@
|
|
|
package com.jeeplus.modules.sys.utils;
|
|
package com.jeeplus.modules.sys.utils;
|
|
|
|
|
|
|
|
import com.aliyun.dysmsapi20170525.Client;
|
|
import com.aliyun.dysmsapi20170525.Client;
|
|
|
-import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
|
|
|
|
|
-import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
|
|
|
|
|
|
|
+import com.aliyun.dysmsapi20170525.models.*;
|
|
|
import com.aliyun.teaopenapi.models.Config;
|
|
import com.aliyun.teaopenapi.models.Config;
|
|
|
|
|
|
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
|
|
+import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @author: 徐滕
|
|
* @author: 徐滕
|
|
@@ -58,12 +60,26 @@ public class ALiYunSmsUtil {
|
|
|
map.put("statusCode",10001);
|
|
map.put("statusCode",10001);
|
|
|
}else if(sendSmsResponse.body.code.contains("isv.AMOUNT_NOT_ENOUGH")){
|
|
}else if(sendSmsResponse.body.code.contains("isv.AMOUNT_NOT_ENOUGH")){
|
|
|
//触发账户余额不足
|
|
//触发账户余额不足
|
|
|
|
|
+ map.put("message","阿里云账户月不足!");
|
|
|
map.put("statusCode",10002);
|
|
map.put("statusCode",10002);
|
|
|
}else if(sendSmsResponse.body.code.contains("isv.DAY_LIMIT_CONTROL")){
|
|
}else if(sendSmsResponse.body.code.contains("isv.DAY_LIMIT_CONTROL")){
|
|
|
//触发触发日发送限额
|
|
//触发触发日发送限额
|
|
|
|
|
+ map.put("message","短信当日发送限额!");
|
|
|
map.put("statusCode",10003);
|
|
map.put("statusCode",10003);
|
|
|
}else if(sendSmsResponse.body.code.contains("OK")){
|
|
}else if(sendSmsResponse.body.code.contains("OK")){
|
|
|
map.put("statusCode",sendSmsResponse.getStatusCode());
|
|
map.put("statusCode",sendSmsResponse.getStatusCode());
|
|
|
|
|
+ map.put("message", "短信发送成功");
|
|
|
|
|
+
|
|
|
|
|
+ // 必须等待 2 秒,不打断点也能拿到内容
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(5000);
|
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // ========== 核心:调用阿里云接口 查询【真实完整短信内容】 ==========
|
|
|
|
|
+ String smsContent = querySmsContent(client, phoneNumbers, sendSmsResponse.body.bizId);
|
|
|
|
|
+ map.put("smsContent", smsContent); // 这里就是用户收到的完整短信!
|
|
|
}
|
|
}
|
|
|
return map;
|
|
return map;
|
|
|
} catch (Exception error) {
|
|
} catch (Exception error) {
|
|
@@ -108,12 +124,26 @@ public class ALiYunSmsUtil {
|
|
|
map.put("statusCode",10001);
|
|
map.put("statusCode",10001);
|
|
|
}else if(sendSmsResponse.body.code.contains("isv.AMOUNT_NOT_ENOUGH")){
|
|
}else if(sendSmsResponse.body.code.contains("isv.AMOUNT_NOT_ENOUGH")){
|
|
|
//触发账户余额不足
|
|
//触发账户余额不足
|
|
|
|
|
+ map.put("message","阿里云账户月不足!");
|
|
|
map.put("statusCode",10002);
|
|
map.put("statusCode",10002);
|
|
|
}else if(sendSmsResponse.body.code.contains("isv.DAY_LIMIT_CONTROL")){
|
|
}else if(sendSmsResponse.body.code.contains("isv.DAY_LIMIT_CONTROL")){
|
|
|
//触发触发日发送限额
|
|
//触发触发日发送限额
|
|
|
|
|
+ map.put("message","短信当日发送限额!");
|
|
|
map.put("statusCode",10003);
|
|
map.put("statusCode",10003);
|
|
|
}else if(sendSmsResponse.body.code.contains("OK")){
|
|
}else if(sendSmsResponse.body.code.contains("OK")){
|
|
|
map.put("statusCode",sendSmsResponse.getStatusCode());
|
|
map.put("statusCode",sendSmsResponse.getStatusCode());
|
|
|
|
|
+ map.put("message", "短信发送成功");
|
|
|
|
|
+
|
|
|
|
|
+ // 必须等待 2 秒,不打断点也能拿到内容
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(5000);
|
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // ========== 核心:调用阿里云接口 查询【真实完整短信内容】 ==========
|
|
|
|
|
+ String smsContent = querySmsContent(client, phoneNumbers, sendSmsResponse.body.bizId);
|
|
|
|
|
+ map.put("smsContent", smsContent); // 这里就是用户收到的完整短信!
|
|
|
}
|
|
}
|
|
|
return map;
|
|
return map;
|
|
|
} catch (Exception error) {
|
|
} catch (Exception error) {
|
|
@@ -160,12 +190,26 @@ public class ALiYunSmsUtil {
|
|
|
map.put("statusCode",10001);
|
|
map.put("statusCode",10001);
|
|
|
}else if(sendSmsResponse.body.code.contains("isv.AMOUNT_NOT_ENOUGH")){
|
|
}else if(sendSmsResponse.body.code.contains("isv.AMOUNT_NOT_ENOUGH")){
|
|
|
//触发账户余额不足
|
|
//触发账户余额不足
|
|
|
|
|
+ map.put("message","阿里云账户月不足!");
|
|
|
map.put("statusCode",10002);
|
|
map.put("statusCode",10002);
|
|
|
}else if(sendSmsResponse.body.code.contains("isv.DAY_LIMIT_CONTROL")){
|
|
}else if(sendSmsResponse.body.code.contains("isv.DAY_LIMIT_CONTROL")){
|
|
|
//触发触发日发送限额
|
|
//触发触发日发送限额
|
|
|
|
|
+ map.put("message","短信当日发送限额!");
|
|
|
map.put("statusCode",10003);
|
|
map.put("statusCode",10003);
|
|
|
}else if(sendSmsResponse.body.code.contains("OK")){
|
|
}else if(sendSmsResponse.body.code.contains("OK")){
|
|
|
map.put("statusCode",sendSmsResponse.getStatusCode());
|
|
map.put("statusCode",sendSmsResponse.getStatusCode());
|
|
|
|
|
+ map.put("message", "短信发送成功");
|
|
|
|
|
+
|
|
|
|
|
+ // 必须等待 2 秒,不打断点也能拿到内容
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(5000);
|
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // ========== 核心:调用阿里云接口 查询【真实完整短信内容】 ==========
|
|
|
|
|
+ String smsContent = querySmsContent(client, phoneNumbers, sendSmsResponse.body.bizId);
|
|
|
|
|
+ map.put("smsContent", smsContent); // 这里就是用户收到的完整短信!
|
|
|
}
|
|
}
|
|
|
return map;
|
|
return map;
|
|
|
} catch (Throwable error) { // 捕获所有异常和错误
|
|
} catch (Throwable error) { // 捕获所有异常和错误
|
|
@@ -215,12 +259,26 @@ public class ALiYunSmsUtil {
|
|
|
map.put("statusCode",10001);
|
|
map.put("statusCode",10001);
|
|
|
}else if(sendSmsResponse.body.code.contains("isv.AMOUNT_NOT_ENOUGH")){
|
|
}else if(sendSmsResponse.body.code.contains("isv.AMOUNT_NOT_ENOUGH")){
|
|
|
//触发账户余额不足
|
|
//触发账户余额不足
|
|
|
|
|
+ map.put("message","阿里云账户月不足!");
|
|
|
map.put("statusCode",10002);
|
|
map.put("statusCode",10002);
|
|
|
}else if(sendSmsResponse.body.code.contains("isv.DAY_LIMIT_CONTROL")){
|
|
}else if(sendSmsResponse.body.code.contains("isv.DAY_LIMIT_CONTROL")){
|
|
|
//触发触发日发送限额
|
|
//触发触发日发送限额
|
|
|
|
|
+ map.put("message","短信当日发送限额!");
|
|
|
map.put("statusCode",10003);
|
|
map.put("statusCode",10003);
|
|
|
}else if(sendSmsResponse.body.code.contains("OK")){
|
|
}else if(sendSmsResponse.body.code.contains("OK")){
|
|
|
map.put("statusCode",sendSmsResponse.getStatusCode());
|
|
map.put("statusCode",sendSmsResponse.getStatusCode());
|
|
|
|
|
+ map.put("message", "短信发送成功");
|
|
|
|
|
+
|
|
|
|
|
+ // 必须等待 2 秒,不打断点也能拿到内容
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(5000);
|
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // ========== 核心:调用阿里云接口 查询【真实完整短信内容】 ==========
|
|
|
|
|
+ String smsContent = querySmsContent(client, phoneNumbers, sendSmsResponse.body.bizId);
|
|
|
|
|
+ map.put("smsContent", smsContent); // 这里就是用户收到的完整短信!
|
|
|
}
|
|
}
|
|
|
return map;
|
|
return map;
|
|
|
} catch (Throwable error) { // 捕获所有异常和错误
|
|
} catch (Throwable error) { // 捕获所有异常和错误
|
|
@@ -230,4 +288,157 @@ public class ALiYunSmsUtil {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * oms开票成功通知短信
|
|
|
|
|
+ * @param phoneNumbers 被通知手机号
|
|
|
|
|
+ * @param number 被通知的参数(此处为开票编号)
|
|
|
|
|
+ * @return
|
|
|
|
|
+ * @throws Exception
|
|
|
|
|
+ */
|
|
|
|
|
+ public static HashMap<String,Object> updateUncollectedInformSms(String name, String phoneNumbers, String number) {
|
|
|
|
|
+ HashMap<String,Object> map = new HashMap<>();
|
|
|
|
|
+ try {
|
|
|
|
|
+ Config config = new Config()
|
|
|
|
|
+ .setAccessKeyId(ACCESS_KEY_ID)
|
|
|
|
|
+ .setAccessKeySecret(ACCESS_KEY_SECRET)
|
|
|
|
|
+ .setEndpoint(ENDPOINT);
|
|
|
|
|
+
|
|
|
|
|
+ Client client = new Client(config);
|
|
|
|
|
+ // 构造参数
|
|
|
|
|
+ String templateParams = String.format("{\"name\":\"%s\",\"invoiceNumber\":\"%s\"}", name, number);
|
|
|
|
|
+ String templateCode = "SMS_505775137"; // 模板CODE
|
|
|
|
|
+ String signName = SIGNNAME; // 签名
|
|
|
|
|
+
|
|
|
|
|
+ SendSmsRequest sendSmsRequest = new SendSmsRequest()
|
|
|
|
|
+ .setPhoneNumbers(phoneNumbers)
|
|
|
|
|
+ .setSignName(signName)
|
|
|
|
|
+ .setTemplateCode(templateCode)
|
|
|
|
|
+ .setTemplateParam(templateParams);
|
|
|
|
|
+
|
|
|
|
|
+ // 发送短信
|
|
|
|
|
+ SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);
|
|
|
|
|
+
|
|
|
|
|
+ // ====================== 关键:把短信所有信息存入 map ======================
|
|
|
|
|
+ map.put("phoneNumbers", phoneNumbers); // 接收手机号
|
|
|
|
|
+ map.put("signName", signName); // 短信签名
|
|
|
|
|
+ map.put("templateCode", templateCode); // 短信模板ID
|
|
|
|
|
+ map.put("templateParams", templateParams); // 短信参数(name、发票号)
|
|
|
|
|
+ map.put("requestId", sendSmsResponse.body.requestId); // 请求ID
|
|
|
|
|
+ map.put("bizId", sendSmsResponse.body.bizId); // 发送回执ID(可查具体发送状态)
|
|
|
|
|
+ map.put("code", sendSmsResponse.body.code); // 返回码
|
|
|
|
|
+ map.put("message", sendSmsResponse.body.message); // 返回描述
|
|
|
|
|
+
|
|
|
|
|
+ // 原来的错误判断逻辑保留
|
|
|
|
|
+ if("isv.BUSINESS_LIMIT_CONTROL".equals(sendSmsResponse.body.code)){
|
|
|
|
|
+ String msg = sendSmsResponse.body.message;
|
|
|
|
|
+ if(msg.contains("分钟级")){
|
|
|
|
|
+ map.put("message", "手机号获取验证码次数已触发每分钟可发送数量上限,请稍后重试!");
|
|
|
|
|
+ }else if(msg.contains("小时级")){
|
|
|
|
|
+ map.put("message", "手机号获取验证码次数已触发每小时可发送数量上限,请稍后重试!");
|
|
|
|
|
+ }else{
|
|
|
|
|
+ map.put("message", "手机号获取验证码次数已触发每日可发送数量上限,请稍后重试!");
|
|
|
|
|
+ }
|
|
|
|
|
+ map.put("statusCode", 10001);
|
|
|
|
|
+ }else if(sendSmsResponse.body.code.contains("isv.AMOUNT_NOT_ENOUGH")){
|
|
|
|
|
+ //触发账户余额不足
|
|
|
|
|
+ map.put("message","阿里云账户月不足!");
|
|
|
|
|
+ map.put("statusCode",10002);
|
|
|
|
|
+ }else if(sendSmsResponse.body.code.contains("isv.DAY_LIMIT_CONTROL")){
|
|
|
|
|
+ //触发触发日发送限额
|
|
|
|
|
+ map.put("message","短信当日发送限额!");
|
|
|
|
|
+ map.put("statusCode",10003);
|
|
|
|
|
+ }else if("OK".equals(sendSmsResponse.body.code)){
|
|
|
|
|
+ map.put("statusCode", 200);
|
|
|
|
|
+ map.put("message", "短信发送成功");
|
|
|
|
|
+
|
|
|
|
|
+ // 必须等待 2 秒,不打断点也能拿到内容
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(5000);
|
|
|
|
|
+ } catch (InterruptedException e) {
|
|
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // ========== 核心:调用阿里云接口 查询【真实完整短信内容】 ==========
|
|
|
|
|
+ String smsContent = querySmsContent(client, phoneNumbers, sendSmsResponse.body.bizId);
|
|
|
|
|
+ map.put("smsContent", smsContent); // 这里就是用户收到的完整短信!
|
|
|
|
|
+
|
|
|
|
|
+ }else{
|
|
|
|
|
+ map.put("statusCode", 400);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return map;
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Throwable error) {
|
|
|
|
|
+ map.put("statusCode", 500);
|
|
|
|
|
+ map.put("message", "发送失败:" + error.getMessage());
|
|
|
|
|
+ // 异常时也记录基础信息
|
|
|
|
|
+ map.put("phoneNumbers", phoneNumbers);
|
|
|
|
|
+ map.put("templateParams", String.format("{name:%s, invoiceNumber:%s}", name, number));
|
|
|
|
|
+ return map;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 查询短信发送后的实际内容(含签名+模版变量替换后的完整用户收到的内容)
|
|
|
|
|
+ * <p>
|
|
|
|
|
+ * 注意:阵云短信发送后通常有延迟,建议延迟 1~2 秒再查询。
|
|
|
|
|
+ * 返回内容示例:【江苏兴光会计师事务所】您的验证码是 1234,请勿泄露。
|
|
|
|
|
+ * 如未查询到,返回空字符串。
|
|
|
|
|
+ * </p>
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param client 已初始化的阵云短信 Client
|
|
|
|
|
+ * @param phoneNumbers 接收手机号(单个)
|
|
|
|
|
+ * @param bizId 发送短信返回的回执 ID(sendSmsResponse.body.bizId)
|
|
|
|
|
+ * @return 用户实际收到的短信内容,如果未查询到则返回空字符串
|
|
|
|
|
+ */
|
|
|
|
|
+ public static String querySmsContent(Client client, String phoneNumbers, String bizId) {
|
|
|
|
|
+ int retryCount = 5; // 最多重试3次
|
|
|
|
|
+ long sleepTime = 1000; // 每次间隔800ms
|
|
|
|
|
+
|
|
|
|
|
+ while (retryCount-- > 0) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ String sendDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
|
|
|
|
|
+ QuerySendDetailsRequest querySendDetailsRequest = new QuerySendDetailsRequest()
|
|
|
|
|
+ .setPhoneNumber(phoneNumbers)
|
|
|
|
|
+ .setBizId(bizId)
|
|
|
|
|
+ .setSendDate(sendDate)
|
|
|
|
|
+ .setPageSize(1L)
|
|
|
|
|
+ .setCurrentPage(1L);
|
|
|
|
|
+
|
|
|
|
|
+ QuerySendDetailsResponse queryResp = client.querySendDetails(querySendDetailsRequest);
|
|
|
|
|
+
|
|
|
|
|
+ if (queryResp == null || queryResp.body == null
|
|
|
|
|
+ || queryResp.body.smsSendDetailDTOs == null
|
|
|
|
|
+ || queryResp.body.smsSendDetailDTOs.smsSendDetailDTO == null) {
|
|
|
|
|
+ Thread.sleep(sleepTime);
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 这里改成 Java 8 标准写法
|
|
|
|
|
+ List<QuerySendDetailsResponseBody.QuerySendDetailsResponseBodySmsSendDetailDTOsSmsSendDetailDTO> details =
|
|
|
|
|
+ queryResp.body.smsSendDetailDTOs.smsSendDetailDTO;
|
|
|
|
|
+
|
|
|
|
|
+ if (details.isEmpty()) {
|
|
|
|
|
+ Thread.sleep(sleepTime);
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String content = details.get(0).content;
|
|
|
|
|
+ if (content != null && !content.trim().isEmpty()) {
|
|
|
|
|
+ return content;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Thread.sleep(sleepTime);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Thread.sleep(sleepTime);
|
|
|
|
|
+ } catch (Exception ignored) {
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|