Browse Source

Sms短信发送

linhuili 3 years ago
parent
commit
5d8ac8a640

+ 5 - 0
dmp-cloud/dmp-message/pom.xml

@@ -75,6 +75,11 @@
             </exclusions>
         </dependency>
         <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jpush-client</artifactId>
+            <version>3.3.10</version>
+        </dependency>
+        <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
         </dependency>

+ 17 - 0
dmp-cloud/dmp-message/src/main/java/com/persagy/dmp/message/controller/MessageController.java

@@ -12,6 +12,8 @@ import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.message.model.vo.MessageVO;
 import com.persagy.dmp.message.service.IMessageService;
+import com.persagy.dmp.sender.service.IMessageSender;
+import com.persagy.dmp.sender.service.MessageSenderFactory;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -36,6 +38,20 @@ public class MessageController {
     private IMessageService service;
 
     /**
+     * 消息发送
+     * @param messageVO
+     */
+    @PostMapping("/send")
+    public CommonResult<MessageVO> send(@RequestBody MessageVO messageVO) throws Exception{
+        if(messageVO == null){
+            throw new BusinessException(ResponseCode.A0400.getCode(), "消息体不能为空!");
+        }
+        MessageSenderFactory messageSenderFactory = new MessageSenderFactory();
+        messageSenderFactory.sendMessage(messageVO);
+        return CommonResult.success(messageVO);
+    }
+
+    /**
      * 查询消息
      * @param criteria
      * @return
@@ -49,6 +65,7 @@ public class MessageController {
         return ResultHelper.multi(page.getRecords(), page.getTotal());
     }
 
+
     /**
      * 新增消息
      * @param vo

+ 104 - 1
dmp-cloud/dmp-message/src/main/java/com/persagy/dmp/sender/service/impl/SmsMessageSender.java

@@ -1,8 +1,19 @@
 package com.persagy.dmp.sender.service.impl;
 
+import cn.jpush.api.JPushClient;
+import cn.jpush.api.push.PushResult;
+import cn.jpush.api.push.model.Options;
+import cn.jpush.api.push.model.Platform;
+import cn.jpush.api.push.model.PushPayload;
+import cn.jpush.api.push.model.audience.Audience;
+import cn.jpush.api.push.model.notification.AndroidNotification;
+import cn.jpush.api.push.model.notification.IosAlert;
+import cn.jpush.api.push.model.notification.IosNotification;
+import cn.jpush.api.push.model.notification.Notification;
 import com.persagy.dmp.message.model.vo.MessageVO;
 import com.persagy.dmp.message.model.vo.SenderRegister;
 import com.persagy.dmp.sender.service.IMessageSender;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 /**
@@ -11,15 +22,107 @@ import org.springframework.stereotype.Service;
  * @date 2021-05-24
  */
 @Service
+@Slf4j
 public class SmsMessageSender implements IMessageSender {
 
+    private String appKey;
+    private String masterSecret;
+
+   // public static final String push_notification = "https://api.jpush.cn/v3/push";
+
     @Override
     public boolean initParam(SenderRegister register) {
-        return false;
+        this.appKey = register.getAccessKey();
+        this.masterSecret = register.getAccessSecret();
+        return true;
     }
 
     @Override
     public void send(MessageVO vo) {
+        PushPayload jpushMessage = buildPushRequest(vo);
+        this.doSend(jpushMessage);
+    }
+
+    /**
+     * 构建推送参数
+     * @param vo
+     * @return
+     */
+    private PushPayload buildPushRequest(MessageVO vo) {
+        PushPayload.Builder builder = PushPayload.newBuilder();
+        builder.setPlatform(Platform.android_ios());
+        builder.setAudience(Audience.alias(vo.getUserId()));
+        Notification.Builder notificationBuilder = Notification.newBuilder();
+        //android 参数设置
+        AndroidNotification.Builder androidNotifiBuilder =
+                AndroidNotification.newBuilder()
+                        .setTitle(vo.getTitle())
+                        .setAlert(vo.getContent());
+        notificationBuilder.addPlatformNotification(androidNotifiBuilder.build());
+
+        //ios 参数设置
+        IosAlert alert = IosAlert.newBuilder()
+                .setTitleAndBody(vo.getTitle(), null, vo.getContent())
+                .build();
+        notificationBuilder.addPlatformNotification(IosNotification.newBuilder()
+                .setAlert(alert)
+                .setContentAvailable(true)
+                .setMutableContent(true)
+                //.addExtras(vo.getExtras())
+                .autoBadge()
+                .build());
 
+        return builder.setNotification(notificationBuilder.build())
+                .setOptions(Options.newBuilder()
+                        .setApnsProduction(false)
+                        .setTimeToLive(24 * 60 * 60 * 2)
+                        .build())
+                .build();
     }
+
+
+    /**
+     * 执行发送
+     * 5次重试
+     * @param pushPayload
+     * @return 返回的消息Id,为空表示执行失败
+     */
+    private String doSend(PushPayload pushPayload) {
+        int count = 1;
+        // 最多重试5次
+        while (count <= 5) {
+            try {
+                JPushClient jpushClient = new JPushClient(masterSecret, appKey);
+                PushResult result = jpushClient.sendPush(pushPayload);
+                log.info("Sms发送结果:{}"+result);
+                if (result.isResultOK()) {
+                    //发送成功,返回消息ID
+                    return String.valueOf(result.msg_id);
+                } else {
+                    //发送失败
+                    if (result.error.getCode() == 2002) {
+                        log.warn("极光API调用频率超出限制");
+                    } else if (result.error.getCode() == 1011) {
+                        log.info("没有设备满足推送目标,可能是因为没有登录");
+                    } else {
+                        String errorMessage = "极光API出错, statusCode=" + result.getResponseCode()
+                                + ", code=" + result.error.getCode()
+                                + ", msg=" + result.error.getMessage();
+                        log.error(errorMessage);
+                    }
+                }
+                return String.valueOf(result.msg_id);
+            } catch (Exception e) {
+                log.error("{}:{},重试第{}次", pushPayload.getSendno(), e.getMessage(), count);
+                count++;
+                try {
+                    Thread.sleep(1000);
+                } catch (InterruptedException interruptedException) {
+                }
+                continue;
+            }
+        }
+        return null;
+    }
+
 }

+ 4 - 4
dmp-cloud/dmp-message/src/main/resources/db/init/data.sql

@@ -1,7 +1,7 @@
 -- ----------------------------
 --  Data for `dt_message_send_register`
 -- ----------------------------
-replace into `dc_dic`.`dt_message_send_register` ( `id`, `extra`, `clazz`, `valid`, `access_secret`, `access_key`, `modified_time`, `code`, `modifier`, `creator`, `ts`, `creation_time`, `name`) values ( '1442323973911048193', '扩展参数', 'AppMessageSender.clazz', '1', '32fad323', 'jdiadaflljnd02901nda', null, 'SD001', null, null, '2021-09-27 11:03:27', null, '发送渠道-001');
-replace into `dc_dic`.`dt_message_send_register` ( `id`, `extra`, `clazz`, `valid`, `access_secret`, `access_key`, `modified_time`, `code`, `modifier`, `creator`, `ts`, `creation_time`, `name`) values ( '1442776995401244674', '扩展参数1', 'MailMessageSender.clazz', '1', '31323', 'jdiadaf1ljnd02901nda', null, 'SD002', null, null, '2021-09-28 17:03:35', null, '发送渠道-002');
-replace into `dc_dic`.`dt_message_send_register` ( `id`, `extra`, `clazz`, `valid`, `access_secret`, `access_key`, `modified_time`, `code`, `modifier`, `creator`, `ts`, `creation_time`, `name`) values ( '1442776995418021889', '扩展参数1', 'SmsMessageSender.clazz', '1', '3132323', 'jdiadaf132jnd02901nda', null, 'SD003', null, null, '2021-09-28 17:03:35', null, '发送渠道-003');
-replace into `dc_dic`.`dt_message_send_register` ( `id`, `extra`, `clazz`, `valid`, `access_secret`, `access_key`, `modified_time`, `code`, `modifier`, `creator`, `ts`, `creation_time`, `name`) values ( '1442776995422216194', '扩展参数1', 'MessageServiceImpl.clazz', '1', '3132323', 'jdiadaf132jnd02901nda', null, 'SD004', null, null, '2021-09-28 17:03:35', null, '发送渠道-004');
+REPLACE INTO `dc_dic`.`dt_message_send_register` (`id`, `code`, `name`, `access_key`, `access_secret`, `extra`, `clazz`, `creator`, `creation_time`, `modifier`, `modified_time`, `valid`, `ts`) VALUES ('1442776995401244674', 'SD002', '发送渠道-002', 'jdiadaf1ljnd02901nda', '31323', '扩展参数1', 'mailMessageSender', NULL, NULL, NULL, NULL, 1, '2021-09-28 17:03:35');
+REPLACE INTO `dc_dic`.`dt_message_send_register` (`id`, `code`, `name`, `access_key`, `access_secret`, `extra`, `clazz`, `creator`, `creation_time`, `modifier`, `modified_time`, `valid`, `ts`) VALUES ('1442776995422216194', 'SD004', '发送渠道-004', 'jdiadaf132jnd02901nda', '3132323', '扩展参数1', 'messageServiceImpl', NULL, NULL, NULL, NULL, 1, '2021-09-28 17:03:35');
+REPLACE INTO `dc_dic`.`dt_message_send_register` (`id`, `code`, `name`, `access_key`, `access_secret`, `extra`, `clazz`, `creator`, `creation_time`, `modifier`, `modified_time`, `valid`, `ts`) VALUES ('1442778797748199425', 'Standard000002', 'App推送', 'LTAI4Fiw96r3sTXMDTomnCr4', 'H0nHRWbXD5OkH4CJNiZvAGx5q5ZxmJ', 'app消息推送', 'appMessageSender', NULL, NULL, NULL, NULL, 1, '2021-12-07 18:48:51');
+REPLACE INTO `dc_dic`.`dt_message_send_register` (`id`, `code`, `name`, `access_key`, `access_secret`, `extra`, `clazz`, `creator`, `creation_time`, `modifier`, `modified_time`, `valid`, `ts`) VALUES ('1442778797748199426', 'Standard000004', 'Sms推送', 'b491d448a828bf322f7787b3', '2955dae7240216e7ad2f3c42', 'Android,ios消息推送', 'smsMessageSender', NULL, NULL, NULL, NULL, 1, '2021-12-07 18:48:27');