Forráskód Böngészése

添加清关完成发送阿里云短信模块

zhh 3 éve
szülő
commit
c48aeb1410

+ 14 - 0
kmall-admin/pom.xml

@@ -223,6 +223,20 @@
             <version>1.6.1</version>
         </dependency>
 
+        <!--    阿里云核心库    -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>tea-openapi</artifactId>
+            <version>0.0.19</version>
+        </dependency>
+
+        <!--    阿里云短信服务api    -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.8</version>
+        </dependency>
+
 
     </dependencies>
 

+ 43 - 0
kmall-admin/src/main/java/com/kmall/admin/config/AliSMSConfig.java

@@ -0,0 +1,43 @@
+package com.kmall.admin.config;
+
+import com.kmall.admin.properties.AliSMSProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+
+/**
+ * 阿里云短信接口
+ * 获取配置文件参数
+ *
+ * @author zhuhh
+ * @date 2021-12-4 15:27:33
+ */
+@Configuration
+@PropertySource("classpath:conf/aliyun-sms.properties")
+public class AliSMSConfig {
+
+    @Autowired
+    private Environment environment;
+
+    @Bean
+    public AliSMSProperties aliSMSProperties() {
+        String accessKeyId = environment.getProperty("ali.sms.accessKeyId");
+        String accessKeySecret = environment.getProperty("ali.sms.accessKeySecret");
+        String endpoint = environment.getProperty("ali.sms.endpoint");
+        String signName = environment.getProperty("ali.sms.signName");
+        String customTemplateCode = environment.getProperty("ali.sms.customTemplateCode");
+
+        AliSMSProperties aliSMSProperties = new AliSMSProperties();
+        aliSMSProperties.setAccessKeyId(accessKeyId);
+        aliSMSProperties.setAccessKeySecret(accessKeySecret);
+        aliSMSProperties.setEndpoint(endpoint);
+        aliSMSProperties.setSignName(signName);
+        aliSMSProperties.setCustomTemplateCode(customTemplateCode);
+
+        return aliSMSProperties;
+    }
+
+
+}

+ 10 - 1
kmall-admin/src/main/java/com/kmall/admin/controller/OrderProcessRecordExternalController.java

@@ -8,6 +8,7 @@ import com.kmall.admin.fromcomm.service.SysConfigService;
 import com.kmall.admin.haikong.utils.Message;
 import com.kmall.admin.haikong.utils.OutRequestMessage;
 import com.kmall.admin.service.OrderProcessRecordService;
+import com.kmall.admin.service.aliyunsms.SendSmsRecordService;
 import com.kmall.admin.utils.jackson.JacksonUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,6 +37,8 @@ public class OrderProcessRecordExternalController {
     private OrderProcessRecordService orderProcessRecordService;
     @Autowired
     private SysConfigService sysConfigService;
+    @Autowired
+    private SendSmsRecordService sendSmsRecordService;
 
     /**
      * 订单流转信息回调通知接口
@@ -68,7 +71,13 @@ public class OrderProcessRecordExternalController {
             if(num>0L){
                 return Message.error("订单数据存在重复");
             }
-            return orderProcessRecordService.saveHkNoticeMsg(orderProcessRecordList,outRequestMessage);
+
+            Message message = orderProcessRecordService.saveHkNoticeMsg(orderProcessRecordList,outRequestMessage);
+
+            // 发送清关成功的订单的短信
+            sendSmsRecordService.sendCustomClearSuccessMsg(orderProcessRecordList);
+
+            return message;
         }catch (Exception e){
             logger.error("hknoticeMsg---订单流转信息回调通知接口数据="+ JSON.toJSONString(outRequestMessage),e);
             return Message.error("参数错误");

+ 24 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/aliyunsms/SendSmsRecordDao.java

@@ -0,0 +1,24 @@
+package com.kmall.admin.dao.aliyunsms;
+
+import com.kmall.admin.entity.aliyunsms.SendSmsRecord;
+import com.kmall.manager.dao.BaseDao;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 短信发送记录表Dao
+ *
+ * @author zhuhh
+ * @date 2021-12-8 18:13:11
+ */
+public interface SendSmsRecordDao extends BaseDao<SendSmsRecord> {
+
+    /**
+     * 根据发送状态查询
+     *
+     * @param sendStatus 发送状态
+     */
+    List<SendSmsRecord> queryBySendStatus(@Param("sendStatus") Integer sendStatus);
+
+}

+ 140 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/aliyunsms/SendSmsRecord.java

@@ -0,0 +1,140 @@
+package com.kmall.admin.entity.aliyunsms;
+
+import java.util.Date;
+
+/**
+ * 短信发送记录表
+ * 
+ * @author zhuhh
+ * @date 2021-12-8 17:56:44
+ */
+public class SendSmsRecord {
+
+    private Integer id;
+
+    /**
+     * 订单编号
+     */
+    private String orderSn;
+
+    /**
+     * 清单编号
+     */
+    private String clearNo;
+
+    /**
+     * 手机号码
+     */
+    private String phoneNumbers;
+
+    /**
+     * 发送状态
+     */
+    private Integer sendStatus;
+
+    /**
+     * 发送失败原因
+     */
+    private String sendFailMsg;
+
+    /**
+     * 请求id
+     */
+    private String requestId;
+
+    /**
+     * 回执id
+     */
+    private String bizId;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getOrderSn() {
+        return orderSn;
+    }
+
+    public void setOrderSn(String orderSn) {
+        this.orderSn = orderSn;
+    }
+
+    public String getClearNo() {
+        return clearNo;
+    }
+
+    public void setClearNo(String clearNo) {
+        this.clearNo = clearNo;
+    }
+
+    public String getPhoneNumbers() {
+        return phoneNumbers;
+    }
+
+    public void setPhoneNumbers(String phoneNumbers) {
+        this.phoneNumbers = phoneNumbers;
+    }
+
+    public Integer getSendStatus() {
+        return sendStatus;
+    }
+
+    public void setSendStatus(Integer sendStatus) {
+        this.sendStatus = sendStatus;
+    }
+
+    public String getSendFailMsg() {
+        return sendFailMsg;
+    }
+
+    public void setSendFailMsg(String sendFailMsg) {
+        this.sendFailMsg = sendFailMsg;
+    }
+
+    public String getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(String requestId) {
+        this.requestId = requestId;
+    }
+
+    public String getBizId() {
+        return bizId;
+    }
+
+    public void setBizId(String bizId) {
+        this.bizId = bizId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}

+ 76 - 0
kmall-admin/src/main/java/com/kmall/admin/properties/AliSMSProperties.java

@@ -0,0 +1,76 @@
+package com.kmall.admin.properties;
+
+
+/**
+ * 阿里云短信接口参数类
+ *
+ * @author zhuhh
+ * @date 2021-12-4 15:26:35
+ */
+public class AliSMSProperties {
+
+    /**
+     * AccessKey ID
+     */
+    private String accessKeyId;
+
+    /**
+     * AccessKey Secret
+     */
+    private String accessKeySecret;
+
+    /**
+     * 访问的域名
+     */
+    private String endpoint;
+
+    /**
+     * 短信签名名称
+     */
+    private String signName;
+
+    /**
+     * 清关短信模板CODE
+     */
+    private String customTemplateCode;
+
+    public String getAccessKeyId() {
+        return accessKeyId;
+    }
+
+    public void setAccessKeyId(String accessKeyId) {
+        this.accessKeyId = accessKeyId;
+    }
+
+    public String getAccessKeySecret() {
+        return accessKeySecret;
+    }
+
+    public void setAccessKeySecret(String accessKeySecret) {
+        this.accessKeySecret = accessKeySecret;
+    }
+
+    public String getEndpoint() {
+        return endpoint;
+    }
+
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public String getSignName() {
+        return signName;
+    }
+
+    public void setSignName(String signName) {
+        this.signName = signName;
+    }
+
+    public String getCustomTemplateCode() {
+        return customTemplateCode;
+    }
+
+    public void setCustomTemplateCode(String customTemplateCode) {
+        this.customTemplateCode = customTemplateCode;
+    }
+}

+ 35 - 0
kmall-admin/src/main/java/com/kmall/admin/service/aliyunsms/SendSmsRecordService.java

@@ -0,0 +1,35 @@
+package com.kmall.admin.service.aliyunsms;
+
+import com.kmall.admin.entity.OrderProcessRecordHkNewEntity;
+import com.kmall.admin.entity.aliyunsms.SendSmsRecord;
+
+import java.util.List;
+
+/**
+ * 短信发送记录表Service
+ *
+ * @author zhuhh
+ * @date 2021-12-8 18:03:00
+ */
+public interface SendSmsRecordService {
+
+    /**
+     * 根据发送状态查询
+     *
+     * @param sendStatus 发送状态
+     */
+    List<SendSmsRecord> queryBySendStatus(Integer sendStatus);
+
+    /**
+     * 发送清关成功的短信
+     *
+     * @param orderProcessRecordList
+     */
+    void sendCustomClearSuccessMsg(List<OrderProcessRecordHkNewEntity> orderProcessRecordList);
+
+    /**
+     * 重新发送之前发送失败的短信
+     */
+    void reSendFailMsg();
+
+}

+ 128 - 0
kmall-admin/src/main/java/com/kmall/admin/service/aliyunsms/impl/SendSmsRecordServiceImpl.java

@@ -0,0 +1,128 @@
+package com.kmall.admin.service.aliyunsms.impl;
+
+import com.kmall.admin.dao.aliyunsms.SendSmsRecordDao;
+import com.kmall.admin.entity.OrderEntity;
+import com.kmall.admin.entity.OrderProcessRecordHkNewEntity;
+import com.kmall.admin.entity.aliyunsms.SendSmsRecord;
+import com.kmall.admin.properties.AliSMSProperties;
+import com.kmall.admin.service.OrderService;
+import com.kmall.admin.service.aliyunsms.SendSmsRecordService;
+import com.kmall.admin.utils.SMSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * 短信发送记录表Service实现类
+ *
+ * @author zhuhh
+ * @date 2021-12-8 18:03:00
+ */
+@Service
+public class SendSmsRecordServiceImpl implements SendSmsRecordService {
+    private static final Logger logger = LoggerFactory.getLogger(SendSmsRecordServiceImpl.class);
+
+    @Autowired
+    private SendSmsRecordDao sendSmsRecordDao;
+
+    @Autowired
+    private AliSMSProperties aliSMSProperties;
+
+    @Autowired
+    private OrderService orderService;
+
+    @Override
+    public List<SendSmsRecord> queryBySendStatus(Integer sendStatus) {
+        return sendSmsRecordDao.queryBySendStatus(sendStatus);
+    }
+
+    @Override
+    public void sendCustomClearSuccessMsg(List<OrderProcessRecordHkNewEntity> orderProcessRecordList) {
+        try {
+            // 判断清关状态
+            for (OrderProcessRecordHkNewEntity entity : orderProcessRecordList) {
+                // 清关成功
+                if ("1".equals(entity.getClearType())) {
+                    // 获取对应的订单实体
+                    OrderEntity orderEntity = orderService.queryObjectByOrderSn(entity.getOrderSn());
+
+                    if (orderEntity == null) {
+                        String errorInfo = "订单数据不存在,不存在的订单编号:" + entity.getOrderSn();
+                        throw new Exception(errorInfo);
+                    }
+
+                    // 发送短信
+                    Map<String, Object> params = new HashMap<>(2);
+                    params.put("phoneNumbers", orderEntity.getPayMobile());
+                    Map<String, Object> resp = SMSUtils.sendSms(aliSMSProperties, params);
+
+                    // 添加参数
+                    SendSmsRecord smsRecord = new SendSmsRecord();
+                    smsRecord.setOrderSn(entity.getOrderSn());
+                    smsRecord.setClearNo(entity.getClearNo());
+                    smsRecord.setPhoneNumbers(orderEntity.getPayMobile());
+                    if ("OK".equals(resp.get("code").toString())) {
+                        smsRecord.setSendStatus(1);
+                    } else {
+                        smsRecord.setSendStatus(0);
+                        smsRecord.setSendFailMsg(resp.get("message").toString());
+                    }
+                    smsRecord.setBizId(resp.get("bizId").toString());
+                    smsRecord.setRequestId(resp.get("requestId").toString());
+                    smsRecord.setCreateTime(new Date());
+                    smsRecord.setUpdateTime(smsRecord.getCreateTime());
+
+                    // 添加短信发送记录
+                    sendSmsRecordDao.save(smsRecord);
+                }
+            }
+
+        } catch (RuntimeException e) {
+            logger.error("发送清关成功的短信失败:", e);
+        } catch (Exception e) {
+            logger.error("发送清关成功的短信失败:", e);
+        }
+    }
+
+    @Override
+    public void reSendFailMsg() {
+        List<SendSmsRecord> sendSmsRecordList = sendSmsRecordDao.queryBySendStatus(0);
+
+        try {
+            for (SendSmsRecord smsRecord : sendSmsRecordList) {
+                // 发送短信
+                Map<String, Object> params = new HashMap<>(2);
+                params.put("phoneNumbers", smsRecord.getPhoneNumbers());
+                // Map<String, Object> resp = SMSUtils.sendSms(aliSMSProperties, params);
+                Map<String, Object> resp = new HashMap<>();
+                resp.put("code", "1");
+                resp.put("message", "sdfs1");
+                resp.put("bizId", "asdasd");
+                resp.put("requestId", "asd");
+
+                // 添加参数
+                if ("OK".equals(resp.get("code").toString())) {
+                    smsRecord.setSendStatus(1);
+                    smsRecord.setSendFailMsg("");
+                } else {
+                    smsRecord.setSendStatus(0);
+                    smsRecord.setSendFailMsg(resp.get("message").toString());
+                }
+                smsRecord.setBizId(resp.get("bizId").toString());
+                smsRecord.setRequestId(resp.get("requestId").toString());
+                smsRecord.setUpdateTime(new Date());
+
+                // 添加短信发送记录
+                sendSmsRecordDao.update(smsRecord);
+            }
+        } catch (RuntimeException e) {
+            logger.error("发送清关成功的短信失败:", e);
+        } catch (Exception e) {
+            logger.error("发送清关成功的短信失败:", e);
+        }
+    }
+
+}

+ 27 - 0
kmall-admin/src/main/java/com/kmall/admin/task/AliyunSmsTask.java

@@ -0,0 +1,27 @@
+package com.kmall.admin.task;
+
+import com.kmall.admin.service.aliyunsms.SendSmsRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * 阿里云短信定时任务
+ *
+ * @author zhuhh
+ * @date 2021-12-9 11:37:26
+ */
+@Component
+public class AliyunSmsTask {
+    @Autowired
+    private SendSmsRecordService sendSmsRecordService;
+
+    /**
+     * 定时扫描 send_sms_record 表的发送失败短信并重新发送
+     */
+    @Scheduled(fixedRate = 10000)
+    public void reSendFailMsg() {
+       // todo,测试屏蔽
+       // sendSmsRecordService.reSendFailMsg();
+    }
+}

+ 285 - 0
kmall-admin/src/main/java/com/kmall/admin/utils/SMSUtils.java

@@ -0,0 +1,285 @@
+package com.kmall.admin.utils;
+
+import com.aliyun.dysmsapi20170525.Client;
+import com.aliyun.dysmsapi20170525.models.*;
+import com.aliyun.teaopenapi.models.Config;
+import com.kmall.admin.properties.AliSMSProperties;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 阿里云短信工具类
+ *
+ * @author zhuhh
+ * @date 2021-12-4 14:44:56
+ */
+public class SMSUtils {
+    private static Log logger = LogFactory.getLog(SMSUtils.class);
+
+    /**
+     * 初始化账号Client
+     *
+     * @param aliSMSProperties
+     * @return client
+     * @throws Exception
+     */
+    public static Client createClient(AliSMSProperties aliSMSProperties) throws Exception {
+        Config config = new Config()
+                .setAccessKeyId(aliSMSProperties.getAccessKeyId())
+                .setAccessKeySecret(aliSMSProperties.getAccessKeySecret())
+                .setEndpoint(aliSMSProperties.getEndpoint());
+
+        return new Client(config);
+    }
+
+    /**
+     * 发送消息
+     *
+     * @param aliSMSProperties 短信参数,配置文件里配置
+     * @param params 待发送参数集合
+     * @return Map
+     * @throws Exception
+     */
+    public static Map<String, Object> sendSms(AliSMSProperties aliSMSProperties, Map<String, Object> params) throws Exception {
+        Client client = createClient(aliSMSProperties);
+
+        // 1.设置发送参数
+        SendSmsRequest request = new SendSmsRequest();
+        // 接收短信的手机号码(必填)。支持对多个手机号码发送短信,手机号码之间以半角逗号(,)分隔。上限为1000个手机号码
+        request.setPhoneNumbers(params.get("phoneNumbers").toString());
+        // 短信签名名称(必填)
+        if (params.get("signName") != null && StringUtils.isNotBlank(params.get("signName").toString())) {
+            request.setSignName(params.get("signName").toString());
+        } else {    // 短信签名名称为空则读取配置文件默认短信签名名称
+            request.setSignName(aliSMSProperties.getSignName());
+        }
+        // 短信模板CODE(必填)
+        if (params.get("templateCode") != null && StringUtils.isNotBlank(params.get("templateCode").toString())) {
+            request.setTemplateCode(params.get("templateCode").toString());
+        } else {    // 读取配置文件的清关短信模板CODE
+            request.setTemplateCode(aliSMSProperties.getCustomTemplateCode());
+        }
+        // 短信模板变量对应的实际值(非必填),JSON字符串,支持多个参数,示例:{"name":"张三","number":"15038****76"}
+        if (params.get("templateParam") != null && StringUtils.isNotBlank(params.get("templateParam").toString())) {
+            request.setTemplateParam(params.get("templateParam").toString());
+        }
+        // 外部流水扩展字段(非必填)
+        if (params.get("outId") != null && StringUtils.isNotBlank(params.get("outId").toString())) {
+            request.setOutId(params.get("outId").toString());
+        }
+
+        // 2.发送短信
+        SendSmsResponse resp = null;
+        Map<String, Object> result = new HashMap<>(5);
+        try {
+            resp = client.sendSms(request);
+            result.put("code", resp.body.getCode());
+            result.put("message", resp.body.getMessage());
+            // 发送回执ID
+            result.put("bizId", resp.body.getBizId());
+            // 请求ID
+            result.put("requestId", resp.body.getRequestId());
+        } catch (RuntimeException e) {
+            logger.error("发送短信失败,失败手机号码:" + params.get("phoneNumbers").toString());
+            logger.error("发送短信失败:" + resp.body.getMessage());
+            throw new RuntimeException("发送短信失败:", e);
+        }
+
+        return result;
+    }
+
+
+    /**
+     * 批量发送消息,支持在一次请求中分别向多个不同的手机号码发送不同签名的短信
+     *
+     * @param aliSMSProperties 短信参数,配置文件里配置
+     * @param params 待发送参数集合
+     * @return Map
+     * @throws Exception
+     */
+    public static Map<String, Object> SendBatchSms(AliSMSProperties aliSMSProperties, Map<String, Object> params) throws Exception {
+        Client client = createClient(aliSMSProperties);
+
+        // 1.设置发送参数
+        SendBatchSmsRequest request = new SendBatchSmsRequest();
+        // 接收短信的手机号码(必填),JSON数组格式的字符串
+        request.setPhoneNumberJson(params.get("phoneNumbersJson").toString());
+        // 短信签名名称(必填),JSON数组格式的字符串,短信签名的个数必须与手机号码的个数相同
+        request.setSignNameJson(params.get("signNameJson").toString());
+        // 短信模板CODE(必填)
+        request.setTemplateCode(params.get("templateCode").toString());
+        // 短信模板变量对应的实际值(非必填),JSON数组格式的字符串
+        if (params.get("templateParamJson") != null && StringUtils.isNotBlank(params.get("templateParamJson").toString())) {
+            request.setTemplateParamJson(params.get("templateParamJson").toString());
+        }
+
+        // 2.发送短信
+        SendBatchSmsResponse resp = null;
+        Map<String, Object> result = new HashMap<>(5);
+        try {
+            resp = client.sendBatchSms(request);
+
+            result.put("code", resp.body.getCode());
+            result.put("message", resp.body.getMessage());
+            // 发送回执ID
+            result.put("bizId", resp.body.getBizId());
+            // 请求ID
+            result.put("requestId", resp.body.getRequestId());
+        } catch (RuntimeException e) {
+            logger.error("批量发送短信失败,失败手机号码:" + params.get("phoneNumbers").toString());
+            logger.error("批量发送短信失败:" + resp.body.getMessage());
+        }
+
+        return result;
+    }
+
+    /**
+     * 查询短信发送记录和发送状态
+     *
+     * @param aliSMSProperties 短信参数,配置文件里配置
+     * @param params 待发送参数集合
+     * @return Map
+     * @throws Exception
+     */
+    public static Map<String, Object> querySendDetails(AliSMSProperties aliSMSProperties, Map<String, Object> params) throws Exception {
+        Client client = createClient(aliSMSProperties);
+
+        // 1.设置发送参数
+        QuerySendDetailsRequest request = new QuerySendDetailsRequest();
+        // 接收短信的手机号码(必填)
+        request.setPhoneNumber(params.get("phoneNumbers").toString());
+        // 短信发送日期,格式为yyyyMMdd(必填)
+        request.setSendDate(params.get("sendDate").toString());
+        // 发送回执ID(非必填)
+        if (params.get("bizId") != null && StringUtils.isNotBlank(params.get("bizId").toString())) {
+            request.setBizId(params.get("bizId").toString());
+        }
+        // 指定每页显示的短信记录数量(必填)
+        request.setPageSize(Long.parseLong(params.get("pageSize").toString()));
+        // 指定发送记录的当前页码(必填)
+        request.setCurrentPage(Long.parseLong(params.get("currentPage").toString()));
+
+        // 发送请求
+        QuerySendDetailsResponse resp = null;
+        Map<String, Object> result = new HashMap<>(5);
+        try {
+            resp = client.querySendDetails(request);
+
+            result.put("code", resp.body.getCode());
+            result.put("message", resp.body.getMessage());
+            // 短信发送总条数
+            result.put("totalCount", resp.body.getTotalCount());
+            // 请求ID
+            result.put("requestId", resp.body.getRequestId());
+            // 短信发送明细
+            result.put("smsSendDetailDTOs", resp.body.getSmsSendDetailDTOs());
+        } catch (RuntimeException e) {
+            logger.error("查询短信发送记录和发送状态失败,失败手机号码:" + params.get("phoneNumbers").toString());
+            logger.error("查询短信发送记录和发送状态失败:" + resp.body.getMessage());
+        }
+
+        return result;
+    }
+
+    /**
+     * 申请短信签名
+     *
+     * @param aliSMSProperties 短信参数,配置文件里配置
+     * @param params 待发送参数集合
+     * @return Map
+     * @throws Exception
+     */
+    public static Map<String, Object> addSMSSign(AliSMSProperties aliSMSProperties, Map<String, Object> params) throws Exception {
+        Client client = createClient(aliSMSProperties);
+
+        // 1.设置发送参数
+        AddSmsSignRequest request = new AddSmsSignRequest();
+        // 签名名称
+        request.setSignName(params.get("signName").toString());
+        // 签名来源
+        request.setSignSource(Integer.parseInt(params.get("signSource").toString()));
+        // 短信签名申请说明
+        request.setRemark(params.get("remark").toString());
+        // 签名文件列表
+        request.setSignFileList((List<AddSmsSignRequest.AddSmsSignRequestSignFileList>)params.get("signFileList"));
+
+        // 发送请求
+        AddSmsSignResponse resp = null;
+        Map<String, Object> result = new HashMap<>(5);
+        try {
+            resp = client.addSmsSign(request);
+            result.put("code", resp.body.getCode());
+            result.put("message", resp.body.getMessage());
+            // 请求ID
+            result.put("requestId", resp.body.getRequestId());
+            // 签名名称
+            result.put("signName", resp.body.getSignName());
+        } catch (RuntimeException e) {
+            logger.error("申请短信签名失败:" + resp.body.getMessage());
+        }
+
+        return result;
+    }
+
+    /**
+     * 申请短信模板
+     *
+     * @param aliSMSProperties 短信参数,配置文件里配置
+     * @param params 待发送参数集合
+     * @return Map
+     * @throws Exception
+     */
+    public static Map<String, Object> AddSMSTemplate(AliSMSProperties aliSMSProperties, Map<String, Object> params) throws Exception {
+        Client client = createClient(aliSMSProperties);
+
+        // 1.设置发送参数
+        AddSmsTemplateRequest request = new AddSmsTemplateRequest();
+        // 短信类型
+        request.setTemplateType(Integer.parseInt(params.get("templateType").toString()));
+        // 模板名称
+        request.setTemplateName(params.get("templateName").toString());
+        // 模板内容
+        request.setTemplateContent(params.get("templateContent").toString());
+        // 短信模板申请说明
+        request.setRemark(params.get("remark").toString());
+
+        // 发送请求
+        AddSmsTemplateResponse resp = null;
+        Map<String, Object> result = new HashMap<>(5);
+        try {
+            resp = client.addSmsTemplate(request);
+            result.put("code", resp.body.getCode());
+            result.put("message", resp.body.getMessage());
+            // 请求ID
+            result.put("requestId", resp.body.getRequestId());
+            // 短信发送明细
+            result.put("templateCode", resp.body.getTemplateCode());
+        } catch (RuntimeException e) {
+            logger.error("申请短信模板失败:" + resp.body.getMessage());
+        }
+
+        return result;
+    }
+
+    public static void main(String[] args) throws Exception {
+        // 本地测试
+        AliSMSProperties aliSMSProperties = new AliSMSProperties();
+        aliSMSProperties.setCustomTemplateCode("SMS_229645099");
+        aliSMSProperties.setEndpoint("dysmsapi.aliyuncs.com");
+        aliSMSProperties.setSignName("珠海免税MALL");
+        aliSMSProperties.setAccessKeyId("LTAI5tJRFwGrMcqt8RcKgkuy");
+        aliSMSProperties.setAccessKeySecret("ffflN7qdiU8z9yJOunwaH0kYNrwkLJ");
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("phoneNumbers", "13160675953");
+
+        // Map<String, Object> result = sendSms(aliSMSProperties, map);
+        // System.out.println(result.get("code"));
+    }
+
+}

+ 12 - 0
kmall-admin/src/main/resources/conf/aliyun-sms.properties

@@ -0,0 +1,12 @@
+# \u963F\u91CC\u4E91\u77ED\u4FE1\u53C2\u6570\u914D\u7F6E
+
+# AccessKey ID\uFF0C\u6D77\u63A7\u63D0\u4F9B
+ali.sms.accessKeyId=LTAI5tJRFwGrMcqt8RcKgkuy
+# AccessKey Secret\uFF0C\u6D77\u63A7\u63D0\u4F9B
+ali.sms.accessKeySecret=ffflN7qdiU8z9yJOunwaH0kYNrwkLJ
+# \u8BBF\u95EE\u7684\u57DF\u540D
+ali.sms.endpoint=dysmsapi.aliyuncs.com
+# \u77ED\u4FE1\u7B7E\u540D\u540D\u79F0\uFF0C\u6D77\u63A7\u63D0\u4F9B
+ali.sms.signName=\u73E0\u6D77\u514D\u7A0EMALL
+# \u77ED\u4FE1\u6A21\u677FCODE\uFF0C\u6D77\u63A7\u63D0\u4F9B
+ali.sms.customTemplateCode=SMS_229645099

+ 69 - 0
kmall-admin/src/main/resources/mybatis/mapper/aliyunsms/SendSmsRecordDao.xml

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<!--短信发送记录表-->
+<mapper namespace="com.kmall.admin.dao.aliyunsms.SendSmsRecordDao">
+    <resultMap type="com.kmall.admin.entity.aliyunsms.SendSmsRecord" id="sendSmsRecordMap">
+        <result property="id" column="id"/>
+        <result property="orderSn" column="order_sn"/>
+        <result property="clearNo" column="clear_no"/>
+        <result property="phoneNumbers" column="phone_numbers"/>
+        <result property="sendStatus" column="send_status"/>
+        <result property="sendFailMsg" column="send_fail_msg"/>
+        <result property="requestId" column="request_id"/>
+        <result property="bizId" column="biz_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <insert id="save" parameterType="com.kmall.admin.entity.aliyunsms.SendSmsRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into send_sms_record
+            (
+            `order_sn`,
+            `clear_no`,
+            `phone_numbers`,
+            `send_status`,
+            `send_fail_msg`,
+            `request_id`,
+            `biz_id`,
+            `create_time`,
+            `update_time`
+            )
+        values
+            (
+            #{orderSn},
+            #{clearNo},
+            #{phoneNumbers},
+            #{sendStatus},
+            #{sendFailMsg},
+            #{requestId},
+            #{bizId},
+            #{createTime},
+            #{updateTime}
+            )
+    </insert>
+
+    <update id="update" parameterType="com.kmall.admin.entity.aliyunsms.SendSmsRecord">
+        update send_sms_record
+        <set>
+            <if test="orderSn != null">`order_sn` = #{orderSn},</if>
+            <if test="clearNo != null">`clear_no` = #{clearNo},</if>
+            <if test="phoneNumbers != null">`phone_numbers` = #{phoneNumbers},</if>
+            <if test="sendStatus != null">`send_status` = #{sendStatus}, </if>
+            <if test="sendFailMsg != null">`send_fail_msg` = #{sendFailMsg}, </if>
+            <if test="requestId != null">`request_id` = #{requestId}, </if>
+            <if test="bizId != null">`biz_id` = #{bizId}, </if>
+            <if test="createTime != null">`create_time` = #{createTime},</if>
+            <if test="updateTime != null">`update_time` = #{updateTime},</if>
+        </set>
+        where id = #{id}
+    </update>
+
+    <select id="queryBySendStatus" resultMap="sendSmsRecordMap">
+		select
+		    `id`,`order_sn`,`clear_no`,`phone_numbers`,`send_status`,`send_fail_msg`,`request_id`,`biz_id`
+		from send_sms_record
+		where `send_status` = #{sendStatus}
+	</select>
+
+</mapper>

+ 16 - 0
sql/send_sms_record.sql

@@ -0,0 +1,16 @@
+create table send_sms_record
+(
+    id            int auto_increment
+        primary key,
+    order_sn      varchar(32)  not null comment '订单编号',
+    clear_no      varchar(20)  not null comment '清单编号',
+    phone_numbers varchar(256) not null comment '手机号码,多个以英文逗号分隔',
+    send_status   tinyint      not null comment '发送状态,0:发送失败,1:发送成功',
+    send_fail_msg varchar(256) null comment '发送失败原因',
+    request_id    varchar(64)  null comment '请求id-阿里云短信接口返回',
+    biz_id        varchar(32)  null comment '回执id-阿里云短信接口返回',
+    create_time   datetime     not null comment '创建时间',
+    update_time   datetime     not null comment '更新时间'
+)
+    comment '短信发送记录表';
+