|
@@ -1,7 +1,9 @@
|
|
-package cn.iocoder.dashboard.framework.sms.client;
|
|
|
|
|
|
+package cn.iocoder.dashboard.framework.sms.client.impl.yunpian;
|
|
|
|
|
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.util.CharsetUtil;
|
|
import cn.hutool.core.util.CharsetUtil;
|
|
|
|
+import cn.iocoder.dashboard.framework.sms.client.AbstractSmsClient;
|
|
import cn.iocoder.dashboard.framework.sms.core.SmsBody;
|
|
import cn.iocoder.dashboard.framework.sms.core.SmsBody;
|
|
import cn.iocoder.dashboard.framework.sms.core.SmsConstants;
|
|
import cn.iocoder.dashboard.framework.sms.core.SmsConstants;
|
|
import cn.iocoder.dashboard.framework.sms.core.SmsResult;
|
|
import cn.iocoder.dashboard.framework.sms.core.SmsResult;
|
|
@@ -14,13 +16,15 @@ import com.yunpian.sdk.YunpianClient;
|
|
import com.yunpian.sdk.constant.Code;
|
|
import com.yunpian.sdk.constant.Code;
|
|
import com.yunpian.sdk.constant.YunpianConstant;
|
|
import com.yunpian.sdk.constant.YunpianConstant;
|
|
import com.yunpian.sdk.model.Result;
|
|
import com.yunpian.sdk.model.Result;
|
|
-import com.yunpian.sdk.model.SmsBatchSend;
|
|
|
|
|
|
+import com.yunpian.sdk.model.SmsSingleSend;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
import javax.servlet.ServletRequest;
|
|
import javax.servlet.ServletRequest;
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.net.URLEncoder;
|
|
import java.net.URLEncoder;
|
|
-import java.util.*;
|
|
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 云片短信实现类
|
|
* 云片短信实现类
|
|
@@ -29,7 +33,7 @@ import java.util.*;
|
|
* @date 9:48 2021/3/5
|
|
* @date 9:48 2021/3/5
|
|
*/
|
|
*/
|
|
@Slf4j
|
|
@Slf4j
|
|
-public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSmsClient {
|
|
|
|
|
|
+public class YunpianSmsClient extends AbstractSmsClient {
|
|
|
|
|
|
private final YunpianClient client;
|
|
private final YunpianClient client;
|
|
|
|
|
|
@@ -47,14 +51,14 @@ public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSm
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public SmsResult doSend(String templateApiId, SmsBody smsBody, Collection<String> targets) {
|
|
|
|
|
|
+ public SmsResult doSend(String templateApiId, SmsBody smsBody, String targetPhone) {
|
|
Map<String, String> paramMap = new HashMap<>();
|
|
Map<String, String> paramMap = new HashMap<>();
|
|
- paramMap.put("apikey", getProperty().getApiKey());
|
|
|
|
- paramMap.put("mobile", String.join(SmsConstants.COMMA, targets));
|
|
|
|
- paramMap.put("text", formatContent(smsBody));
|
|
|
|
- paramMap.put("callback", getProperty().getCallbackUrl());
|
|
|
|
|
|
+ paramMap.put(YunpianConstant.APIKEY, getProperty().getApiKey());
|
|
|
|
+ paramMap.put(YunpianConstant.MOBILE, String.join(SmsConstants.COMMA, targetPhone));
|
|
|
|
+ paramMap.put(YunpianConstant.TEXT, formatContent(smsBody));
|
|
|
|
+ paramMap.put(Helper.CALLBACK, getProperty().getCallbackUrl());
|
|
|
|
|
|
- Result<SmsBatchSend> sendResult = client.sms().batch_send(paramMap);
|
|
|
|
|
|
+ Result<SmsSingleSend> sendResult = client.sms().single_send(paramMap);
|
|
boolean success = sendResult.getCode().equals(Code.OK);
|
|
boolean success = sendResult.getCode().equals(Code.OK);
|
|
|
|
|
|
if (!success) {
|
|
if (!success) {
|
|
@@ -64,7 +68,7 @@ public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSm
|
|
.setSuccess(success)
|
|
.setSuccess(success)
|
|
.setMessage(sendResult.getDetail())
|
|
.setMessage(sendResult.getDetail())
|
|
.setCode(sendResult.getCode().toString())
|
|
.setCode(sendResult.getCode().toString())
|
|
- .setApiId(sendResult.getData().getData().get(0).getSid().toString());
|
|
|
|
|
|
+ .setApiId(sendResult.getData().getSid().toString());
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -96,26 +100,16 @@ public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSm
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 云片的比较复杂,又是加密又是套娃的
|
|
|
|
+ */
|
|
@Override
|
|
@Override
|
|
- public List<SmsResultDetail> getSmsSendResult(ServletRequest request) throws UnsupportedEncodingException {
|
|
|
|
- List<Map<String, String>> stringStringMap = getSendResult(request);
|
|
|
|
- List<SmsResultDetail> resultDetailList = new ArrayList<>(stringStringMap.size());
|
|
|
|
- stringStringMap.forEach(map -> {
|
|
|
|
- SmsResultDetail detail = new SmsResultDetail();
|
|
|
|
-
|
|
|
|
- detail.setPhone(map.get("mobile"));
|
|
|
|
- detail.setMessage(map.get("error_msg"));
|
|
|
|
- detail.setSendTime(DateUtil.parseTime(map.get("user_receive_time")));
|
|
|
|
- String reportStatus = map.get("report_status");
|
|
|
|
- detail.setSendStatus(reportStatus.equals(SmsConstants.SUCCESS)
|
|
|
|
- ? SmsSendStatusEnum.SEND_SUCCESS.getStatus()
|
|
|
|
- : SmsSendStatusEnum.SEND_FAIL.getStatus()
|
|
|
|
- );
|
|
|
|
- resultDetailList.add(detail);
|
|
|
|
- });
|
|
|
|
- return resultDetailList;
|
|
|
|
|
|
+ public SmsResultDetail smsSendCallbackHandle(ServletRequest request) throws UnsupportedEncodingException {
|
|
|
|
+ Map<String, String> map = getRequestParams(request);
|
|
|
|
+ return Helper.getSmsResultDetailByParam(map);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 从 request 中获取请求中传入的短信发送结果信息
|
|
* 从 request 中获取请求中传入的短信发送结果信息
|
|
*
|
|
*
|
|
@@ -123,10 +117,58 @@ public class YunpianSmsClient extends AbstractSmsClient implements HadCallbackSm
|
|
* @return 短信发送结果信息
|
|
* @return 短信发送结果信息
|
|
* @throws UnsupportedEncodingException 解码异常
|
|
* @throws UnsupportedEncodingException 解码异常
|
|
*/
|
|
*/
|
|
- private List<Map<String, String>> getSendResult(ServletRequest request) throws UnsupportedEncodingException {
|
|
|
|
|
|
+ private Map<String, String> getRequestParams(ServletRequest request) throws UnsupportedEncodingException {
|
|
Map<String, String[]> parameterMap = request.getParameterMap();
|
|
Map<String, String[]> parameterMap = request.getParameterMap();
|
|
String[] smsStatuses = parameterMap.get(YunpianConstant.SMS_STATUS);
|
|
String[] smsStatuses = parameterMap.get(YunpianConstant.SMS_STATUS);
|
|
String encode = URLEncoder.encode(smsStatuses[0], CharsetUtil.UTF_8);
|
|
String encode = URLEncoder.encode(smsStatuses[0], CharsetUtil.UTF_8);
|
|
- return JsonUtils.parseByType(encode, callbackType);
|
|
|
|
|
|
+ List<Map<String, String>> paramList = JsonUtils.parseByType(encode, callbackType);
|
|
|
|
+ if (CollectionUtil.isNotEmpty(paramList)) {
|
|
|
|
+ return paramList.get(0);
|
|
|
|
+ }
|
|
|
|
+ throw new IllegalArgumentException("YunpianSmsClient getRequestParams fail! can't format RequestParam: "
|
|
|
|
+ + JsonUtils.toJsonString(request.getParameterMap()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 云片的回调函数的一些辅助方法
|
|
|
|
+ */
|
|
|
|
+ private static class Helper {
|
|
|
|
+
|
|
|
|
+ //短信唯一标识
|
|
|
|
+ private final static String API_ID = "sid";
|
|
|
|
+
|
|
|
|
+ //回调地址·
|
|
|
|
+ private final static String CALLBACK = "callback";
|
|
|
|
+
|
|
|
|
+ //手机号
|
|
|
|
+ private final static String MOBILE = "mobile";
|
|
|
|
+
|
|
|
|
+ //错误信息
|
|
|
|
+ private final static String ERROR_MSG = "error_msg";
|
|
|
|
+
|
|
|
|
+ //用户接收时间 字符串 标准格式
|
|
|
|
+ private final static String USER_RECEIVE_TIME = "user_receive_time";
|
|
|
|
+
|
|
|
|
+ //发送状态
|
|
|
|
+ private final static String REPORT_STATUS = "report_status";
|
|
|
|
+
|
|
|
|
+ private static int getSendStatus(Map<String, String> map) {
|
|
|
|
+ String reportStatus = map.get(REPORT_STATUS);
|
|
|
|
+ return SmsConstants.SUCCESS.equals(reportStatus)
|
|
|
|
+ ? SmsSendStatusEnum.SEND_SUCCESS.getStatus()
|
|
|
|
+ : SmsSendStatusEnum.SEND_FAIL.getStatus();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static SmsResultDetail getSmsResultDetailByParam(Map<String, String> map) {
|
|
|
|
+ SmsResultDetail detail = new SmsResultDetail();
|
|
|
|
+ detail.setPhone(map.get(MOBILE));
|
|
|
|
+ detail.setMessage(map.get(ERROR_MSG));
|
|
|
|
+ detail.setSendTime(DateUtil.parseTime(map.get(USER_RECEIVE_TIME)));
|
|
|
|
+ detail.setSendStatus(getSendStatus(map));
|
|
|
|
+ detail.setApiId(API_ID);
|
|
|
|
+
|
|
|
|
+ detail.setCallbackResponseBody(SmsConstants.SUCCESS);
|
|
|
|
+ return detail;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|