diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/controller/SmsController.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/controller/SmsController.java index 0637b8f..64654ac 100644 --- a/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/controller/SmsController.java +++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/controller/SmsController.java @@ -3,18 +3,19 @@ package com.chinaunicom.mall.ebtp.extend.sms.controller; import com.chinaunicom.mall.ebtp.common.base.entity.BaseResponse; import com.chinaunicom.mall.ebtp.extend.sms.constant.SmsErrorEnum; import com.chinaunicom.mall.ebtp.extend.sms.entity.SmsBaseResponseDTO; +import com.chinaunicom.mall.ebtp.extend.sms.entity.SmsCallbackRequestDTO; import com.chinaunicom.mall.ebtp.extend.sms.entity.SmsSendResponseDTO; import com.chinaunicom.mall.ebtp.extend.sms.entity.SmsTemplateDTO; +import com.chinaunicom.mall.ebtp.extend.sms.service.SmsCallbackService; import com.chinaunicom.mall.ebtp.extend.sms.service.SmsService; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; import java.util.Map; +@Slf4j @RestController @RequestMapping("/sms") public class SmsController { @@ -22,6 +23,9 @@ public class SmsController { @Resource private SmsService smsService; + @Resource + private SmsCallbackService smsCallbackService; + private static final String SMS_SUCCESS_CODE = "000000";// 短信接口成功代码 private static final String SMS_ERRER_DESC = "sms错误代码/描述: "; @@ -48,28 +52,29 @@ public class SmsController { "statusCode": "000000", "templateSMS": { "smsMessageSid": "b9fb1cc5acc3428c8d40c87428380b72", - "dateCreated": "20250618100527" + "dateCreated": "20250618100527", + "reqId": "1687056327_1"// 业务ID } } + 发送短信,保存发送记录, 与callback接口配合使用 + reqId: 自定义消息ID,比如可以用某个业务的名字 + callback收到后,会根据业务去处理调用对应业务的方法 */ @GetMapping("/send") - public BaseResponse sendSms(@RequestParam String[] mobiles, @RequestParam String templateId, @RequestParam String[] datas) { -// String[] datas = new String[]{"测试内容"}; // 模板参数 -// return smsService.sendTemplateSms( -// "18686879363", // 接收手机号 -// "1180212", // 模板ID -// datas, // 模板参数 -// null, // 子扩展码 -// null // 自定义消息ID -// ); + public BaseResponse sendSms( + @RequestParam String[] mobiles, + @RequestParam String templateId, + @RequestParam String[] datas, + @RequestParam String reqId, + @RequestParam(required = false) String subAppend) { // 字符串数组转逗号拼接字符串 String mobileStr = String.join(",", mobiles); SmsSendResponseDTO smsSendResponseDTO = smsService.sendTemplateSms( mobileStr, // 接收手机号 templateId, // 模板ID datas, // 模板参数 - null, // 子扩展码 - null // 自定义消息ID + subAppend, // 子扩展码 + reqId // 自定义消息ID ); if (!SMS_SUCCESS_CODE.equals(smsSendResponseDTO.getStatusCode())) { @@ -77,4 +82,25 @@ public class SmsController { } return BaseResponse.success(smsSendResponseDTO.getTemplateSMS()); } + + /** + * 2.2.上行短信/状态报告推送接口 + * 短信回调接口 + * 该接口用于接收短信服务商的回调请求,包括上行短信和状态报告等信息。 + * 短信平台不处理任何返回,只关注接口请求是否200, 所以返回信息没有实际意义 + * smsType String 必选 短信类型,0:上行短信,1:手机接收状态报告 + * 消息总线模式,各个模块哪个需要接收全都调用一次,根据业务ID自行去对应业务表中判断处理 + * @param callbackRequestDTO 回调请求数据 + * @return 返回处理结果 + */ + @PostMapping("/callback") + public BaseResponse smsCallback(@RequestBody SmsCallbackRequestDTO callbackRequestDTO) { + log.info(callbackRequestDTO.toString()); + // 保存 回调信息 + boolean saveResult = smsCallbackService.save(callbackRequestDTO.getRequest()); + // TODO 转发各个业务平台接口 (需在脚手架配置feign) + return BaseResponse.success("Callback received"); + } + + } \ No newline at end of file diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/dao/SmsCallbackMapper.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/dao/SmsCallbackMapper.java new file mode 100644 index 0000000..a04a824 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/dao/SmsCallbackMapper.java @@ -0,0 +1,9 @@ +package com.chinaunicom.mall.ebtp.extend.sms.dao; + +import com.chinaunicom.mall.ebtp.common.base.dao.IBaseMapper; +import com.chinaunicom.mall.ebtp.extend.sms.entity.SmsCallbackRequestDTO; +import com.chinaunicom.mall.ebtp.extend.tianyancha.entity.TianyanchaNormalDTO; + + +public interface SmsCallbackMapper extends IBaseMapper { +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/entity/SmsCallbackRequestDTO.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/entity/SmsCallbackRequestDTO.java new file mode 100644 index 0000000..acc9c19 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/entity/SmsCallbackRequestDTO.java @@ -0,0 +1,37 @@ +package com.chinaunicom.mall.ebtp.extend.sms.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonProperty; + +@Data +@ApiModel(value = "短信回调表", description = "短信回调表") +public class SmsCallbackRequestDTO { + + @JsonProperty("Request") + private Request request; + + @Data + @TableName(value = "sms_callback", autoResultMap = true) + public static class Request { + @TableId(value = "id", type = IdType.ASSIGN_UUID) + private String id;// 主键ID + private String action; // 必选 功能操作标识 ,SMSArrived + private String smsType; // 必选 短信类型,0:上行短信,1:手机接收状态报告 + private String recvTime; // 必选 收到上行短信/短信送达手机时间,格式:yyyyMMddHHmmss + private String apiVersion; // 必选 REST API版本号,格式:YYYY-MM-DD + private String fromNum; // 必选 发送/接收短信的手机号码 + private String content; // 必选 短信内容或短信ID + private String appendCode; // 可选 短信扩展码 + private String subAppend; // 可选 自定义短信扩展码 + private String status; // 可选 短信到达状态 + private String dateSent; // 可选 短信发送时间 + private String deliverCode; // 可选 到达状态描述 + private String reqId; // 可选 第三方自定义消息id + private String smsCount; // 可选 下行短信计费条数 + private String spCode; // 可选 下行通道码号 + } +} diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/service/SmsCallbackService.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/service/SmsCallbackService.java new file mode 100644 index 0000000..0fa9e29 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/service/SmsCallbackService.java @@ -0,0 +1,10 @@ +package com.chinaunicom.mall.ebtp.extend.sms.service; + +import com.chinaunicom.mall.ebtp.common.base.service.IBaseService; +import com.chinaunicom.mall.ebtp.extend.sms.entity.SmsCallbackRequestDTO; +import org.springframework.stereotype.Service; + +@Service +public interface SmsCallbackService extends IBaseService { +} + diff --git a/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/service/impl/SmsCallbackServiceImpl.java b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/service/impl/SmsCallbackServiceImpl.java new file mode 100644 index 0000000..d00cca7 --- /dev/null +++ b/src/main/java/com/chinaunicom/mall/ebtp/extend/sms/service/impl/SmsCallbackServiceImpl.java @@ -0,0 +1,21 @@ +package com.chinaunicom.mall.ebtp.extend.sms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.chinaunicom.mall.ebtp.extend.sms.dao.SmsCallbackMapper; +import com.chinaunicom.mall.ebtp.extend.sms.entity.SmsCallbackRequestDTO; +import com.chinaunicom.mall.ebtp.extend.sms.service.SmsCallbackService; +import com.chinaunicom.mall.ebtp.extend.tianyancha.dao.TianyanchaNormalMapper; +import com.chinaunicom.mall.ebtp.extend.tianyancha.entity.TianyanchaNormalDTO; +import com.chinaunicom.mall.ebtp.extend.tianyancha.service.TianyanchaNormalService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + + +@Service +@Slf4j +public class SmsCallbackServiceImpl extends ServiceImpl implements SmsCallbackService { + + +} \ No newline at end of file