File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
package itn.let.kakao.kakaoComm;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import itn.com.cmm.util.StringUtil;
import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave;
import itn.let.mail.service.StatusResponse;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.spammsg.web.ComGetSpamStringParser;
import itn.let.module.base.PriceAndPoint;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.uss.umt.service.MberManageVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class KakaoSendUtil {
@Autowired
KakaoApiJsonSave kakaoApiJsonSave;
@Resource(name = "MjonMsgDataService")
private MjonMsgDataService mjonMsgDataService;
@Autowired
private PriceAndPoint priceAndPoint;
@Autowired
private MjonCommon mjonCommon;
// 단문 메세지 타입
public static final String SHORT_MSG_TYPE = "SMS";
// 장문 메세지 타입
public static final String LONG_MSG_TYPE = "MMS";
/**
* @methodName : kakaoSendPrice_advc
* @author : 이호영
* @date : 2025. 3. 7.
* @description : 기존 kakaoSendPrice 개선
* @return : KakaoVO
* @param kakaoVO
* @param statusResponse
* @return
* @throws Exception
*
*/
public List<KakaoSendAdvcVO> populateSendLists(KakaoVO kakaoVO, StatusResponse statusResponse) throws Exception {
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
// String befCash = kakaoVO.getBefCash();
log.info(" +kakaoVO.getVarListMap().size() :: [{}]", kakaoVO.getVarListMap().size());
List<KakaoSendAdvcVO> kakaoSendAdvcListVO = new ArrayList<>();
// 예약 시간 기본값 설정
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// ReqDate가 비어 있으면 현재 시간으로 설정, 그렇지 않으면 ReqDate로 설정
// 화면에서 예약문자면 예약시간을 regDate로 설정한다.
Date baseDate;
if (StringUtils.isEmpty(kakaoVO.getReqDate())) {
kakaoVO.setReqDate(sdf.format(now)); // ReqDate에 현재 시간 설정
baseDate = now;
} else {
baseDate = sdf.parse(kakaoVO.getReqDate()); // ReqDate를 baseDate로 설정
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(baseDate); // calendar에 baseDate 설정
int counter = 0; // 분할 건수 카운터
// Map에 총 갯수가 수신자 갯수와 동일함
for(Map<String, String> variables : kakaoVO.getVarListMap()) {
KakaoSendAdvcVO sendVO = new KakaoSendAdvcVO();
// step1
// Step 1-1: 값 치환 및 수신번호 셋팅
String templateContent = kakaoVO.getTemplateContent(); // 알림톡 템플릿
// Step 1-2: 수신자 정보 설정 (callToList는 항상 설정).
if (variables.containsKey("callToList")) {
sendVO.setCallTo(variables.get("callToList"));
variables.remove("callToList"); // 사용 후 제거.
}
// Step 1-3: 템플릿 치환데이터 설정
// TxtReplYn이 "Y"일 때만 치환 수행
if ("Y".equals(kakaoVO.getTxtReplYn())) {
templateContent = replaceTemplateVariables(templateContent, variables);
}
sendVO.setTemplateContent(templateContent);
// Step 1-4: 실패 대체 문자 치환데이터 설정
if("Y".equals(kakaoVO.getSubMsgSendYn())) {
String subMsgTxt = kakaoVO.getSubMsgTxt(); // 실패 대체 치환 문자
// TxtReplYn이 "Y"일 때만 치환 수행
if ("Y".equals(kakaoVO.getSubMsgTxtReplYn())) {
subMsgTxt = replaceTemplateVariables(subMsgTxt, variables);
}
sendVO.setSubMsgTxt(subMsgTxt);// 실패
}
/*
log.info("kakaoSendAdvcVO Details: [callTo={}\n, templateContent=\n{}\n, subMsgTxt=\n{}]\n\n\n\n",
kakaoSendAdvcVO.getCallTo(),
kakaoSendAdvcVO.getTemplateContent(),
kakaoSendAdvcVO.getSubMsgTxt()
);
*/
// step3
// 바이트 수 체크 및 금액설정
// 시스템 기본 단가 정보 불러오기
JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
// 사용자 개인 단가 정보 불러오기
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId());
Float kakaoAtPrice = mberManageVO.getKakaoAtPrice();
// 유효한 단가 계산
float shortPrice = getValidPrice(mberManageVO.getShortPrice(), sysJoinSetVO.getShortPrice());
float longPrice = getValidPrice(mberManageVO.getLongPrice(), sysJoinSetVO.getLongPrice());
// 공통 가격 설정
kakaoVO.setSmsPrice(shortPrice);
kakaoVO.setMmsPrice(longPrice);
if("Y".equals(kakaoVO.getSubMsgSendYn())) {
int smsTxtByte = mjonCommon.getSmsTxtBytes(sendVO.getSubMsgTxt());
String sendType = getMsgType(smsTxtByte);
if ("INVALID".equals(sendType)) {
statusResponseSet(statusResponse, HttpStatus.BAD_REQUEST, "전송 문자 길이를 초과하였습니다.");return kakaoSendAdvcListVO;
}
boolean isMms = "MMS".equals(sendType);
kakaoAtPrice = isMms ? longPrice : shortPrice;
kakaoVO.setKakaoAtPrice(getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice()));
} else {
kakaoAtPrice = getValidPrice(mberManageVO.getKakaoAtPrice(), sysJoinSetVO.getKakaoAtPrice());
kakaoVO.setKakaoAtPrice(kakaoAtPrice);
}
// step4
// 예약 시간 설정 및 분할 데이터 설정
if ("Y".equalsIgnoreCase(kakaoVO.getReserveYn())) {
// 분할 발송일 경우
if ("on".equalsIgnoreCase(kakaoVO.getDivideChk())) {
if (counter == Integer.parseInt(kakaoVO.getDivideCnt())) { // 지정된 건수마다 간격 추가
counter = 0;
calendar.add(Calendar.MINUTE, Integer.parseInt(kakaoVO.getDivideTime()));
}
counter++;
}
// 예약 시간 설정
}
// 즉시 발송인경우 현재 시간
// 예약인 경우 위에 설정한 시간 입력
sendVO.setReqDate(sdf.format(calendar.getTime()));
// step5
// 전송 메세지 설정 kakaoSendMsg 참고
// kakaoSendAdvcVO.setSendType("AT");
sendVO.setMsgType("8");
sendVO.setUserId(kakaoVO.getUserId());
}
return kakaoSendAdvcListVO;
}
public Float getValidPrice(Float personalPrice, Float defaultPrice) {
return (personalPrice != null && personalPrice > 0) ? personalPrice : defaultPrice;
}
/**
* @methodName : getMsgType
* @author : 이호영
* @date : 2025. 3. 12.
* @description : 메세지 타입 구하기
* @return : String
* @param smsTxtByte
* @return
*
*/
private String getMsgType(int smsTxtByte) {
// TODO Auto-generated method stub
String msgType = SHORT_MSG_TYPE;
// 1. 2000 Byte 초과는 에러 처리
if (smsTxtByte > 2000) {
return "INVALID";
}
// 2. 문자 길이에 따라 메시지 타입 설정 (90 Byte 초과는 장문)
if (smsTxtByte > 90) {
msgType = LONG_MSG_TYPE;
}
return msgType;
}
/**
* @methodName : replaceTemplateVariables
* @author : 이호영
* @date : 2025. 3. 12.
* @description : 헬퍼 메서드: 템플릿 변수 치환
* @return : String
* @param content
* @param variables
* @return
*/
private String replaceTemplateVariables(String content, Map<String, String> variables) {
String result = content;
for (Map.Entry<String, String> entry : variables.entrySet()) {
String placeholder = entry.getKey();
String value = entry.getValue();
result = result.replace(placeholder, value);
}
return result;
}
/**
* @Method Name : kakaoSendPrice
* @작성일 : 2023. 2. 14.
* @작성자 : WYH
* @Method 설명 : 카카오 전송 가격 설정
*/
public KakaoVO kakaoSendPrice(KakaoVO kakaoVO) throws Exception {
System.out.println(" :: kakaoSendPrice :: ");
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
// String befCash = kakaoVO.getBefCash();
MjonMsgVO mjonMsgVO = new MjonMsgVO();
mjonMsgVO.setUserId(kakaoVO.getUserId());
String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
//1.시스템 기본 단가 정보 불러오기
JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
//2.사용자 개인 단가 정보 불러오기
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId());
Float kakaoAtPrice = mberManageVO.getKakaoAtPrice();
/** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */
//대체문자 발송 여부 확인
System.out.println(" :: kakaoVO.getSubMsgSendYn() :: "+ kakaoVO.getSubMsgSendYn());
if(kakaoVO.getSubMsgSendYn().equals("Y")) {
String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
int callToCnt = kakaoVO.getCallToList().length;
String sendType = "";
for(int count =0; count < callToCnt; count++) {
String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) {
tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count);
// tempSubMagTxt = kakaoSubMagTxtRepl_advc(tempSubMagTxt, kakaoVO, count);
System.out.println("+ tempSubMagTxt :: "+ tempSubMagTxt);
}
int bytes = tempSubMagTxt.getBytes(charset).length;
if(bytes < 2000) {
if(bytes > 90) {
sendType = "MMS";
break;
}else {
sendType = "SMS";
}
}else {
kakaoVO.setResultCode("2000");
return kakaoVO;
}
}
if(sendType.equals("MMS")) {
//협의 단가가 없으면 시스템 단가로 지정
if(mberManageVO.getLongPrice() < 1) {
kakaoAtPrice = sysJoinSetVO.getLongPrice();
kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
}else {
kakaoAtPrice = mberManageVO.getLongPrice();
kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
if(mberManageVO.getKakaoAtPrice() < 1) {
kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
}else {
kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice());
}
}
}else {
//협의 단가가 없으면 시스템 단가로 지정
if(mberManageVO.getShortPrice() < 1) {
kakaoAtPrice = sysJoinSetVO.getShortPrice();
kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
}else {
kakaoAtPrice = mberManageVO.getShortPrice();
kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
if(mberManageVO.getKakaoAtPrice() < 1) {
kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
}else {
kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice());
}
}
}
}else {
if(kakaoAtPrice < 1) { //협의 단가가 없으면 시스템 단가로 지정
kakaoAtPrice = sysJoinSetVO.getKakaoAtPrice();
kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
kakaoVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
}else {
kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
kakaoVO.setKakaoAtPrice(mberManageVO.getKakaoAtPrice());
}
}
/** 전송인원 확인*/
int totCallCnt = kakaoVO.getCallToList().length;
Float kakaoTotPrice = totCallCnt * kakaoAtPrice; // 총결제 금액 = 총 전송수량 * 카카오 알림톡 단가
String totPrice = kakaoTotPrice.toString();
System.out.println("@@@@@@@ : "+kakaoTotPrice +" = "+totCallCnt+" * "+kakaoAtPrice);
kakaoVO.setEachPrice(kakaoAtPrice.toString());
kakaoVO.setBefCash(userMoney); // 고객 충전금액
kakaoVO.setBefPoint(userPoint); // 고객 충전 포인트
kakaoVO.setTotPrice(totPrice); // 총 카카오 전송 금액
return kakaoVO;
}
/**
* @Method Name : kakaoFTSendPrice
* @작성일 : 2024. 1. 17.
* @작성자 : WYH
* @Method 설명 : 카카오 친구톡 전송 가격 설정
*/
public KakaoVO kakaoFTSendPrice(KakaoVO kakaoVO) throws Exception {
//사용자 현재 보유 금액 불러오기(문자 발송 금액 차감 이전 금액)
String befCash = kakaoVO.getBefCash();
//VO에서 현재 보유금액이 없으면 디비에서 조회해서 불러옴
if("".equals(befCash) || befCash == null) {
}
MjonMsgVO mjonMsgVO = new MjonMsgVO();
mjonMsgVO.setUserId(kakaoVO.getUserId());
String userMoney = mjonMsgDataService.selectBeforeCashData(mjonMsgVO);
String userPoint = mjonMsgDataService.selectBeforePointData(mjonMsgVO);
//1.시스템 기본 단가 정보 불러오기
JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
//2.사용자 개인 단가 정보 불러오기
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(kakaoVO.getUserId());
Float kakaoFtPrice = mberManageVO.getKakaoFtPrice();
/** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */
//대체문자 발송 여부 확인
if(kakaoVO.getSubMsgSendYn().equals("Y")) {
String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
int callToCnt = kakaoVO.getCallToList().length;
String sendType = "";
for(int count =0; count < callToCnt; count++) {
String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) {
tempSubMagTxt = kakaoFTSubMagTxtRepl(tempSubMagTxt, kakaoVO, count);
}
int bytes = tempSubMagTxt.getBytes(charset).length;
if(bytes < 2000) {
if(bytes > 90) {
sendType = "MMS";
break;
}else {
sendType = "SMS";
}
}else {
kakaoVO.setResultCode("2000");
return kakaoVO;
}
}
if(sendType.equals("MMS")) {
//협의 단가가 없으면 시스템 단가로 지정
if(mberManageVO.getLongPrice() < 1) {
kakaoFtPrice = sysJoinSetVO.getLongPrice();
kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice());
}else {
kakaoFtPrice = mberManageVO.getLongPrice();
kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
if(mberManageVO.getKakaoFtPrice() < 1) {
kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice());
}else {
kakaoVO.setKakaoFtPrice(mberManageVO.getKakaoFtPrice());
}
}
}else {
//협의 단가가 없으면 시스템 단가로 지정
if(mberManageVO.getShortPrice() < 1) {
kakaoFtPrice = sysJoinSetVO.getShortPrice();
kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice());
}else {
kakaoFtPrice = mberManageVO.getShortPrice();
kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
if(mberManageVO.getKakaoFtPrice() < 1) {
kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice());
}else {
kakaoVO.setKakaoFtPrice(mberManageVO.getKakaoFtPrice());
}
}
}
}else {
if(kakaoFtPrice < 1) { //협의 단가가 없으면 시스템 단가로 지정
kakaoFtPrice = sysJoinSetVO.getKakaoFtPrice();
kakaoVO.setSmsPrice(sysJoinSetVO.getShortPrice());
kakaoVO.setMmsPrice(sysJoinSetVO.getLongPrice());
kakaoVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice());
}else {
kakaoVO.setSmsPrice(mberManageVO.getShortPrice());
kakaoVO.setMmsPrice(mberManageVO.getLongPrice());
kakaoVO.setKakaoFtPrice(mberManageVO.getKakaoFtPrice());
}
}
/** 전송인원 확인*/
int totCallCnt = kakaoVO.getCallToList().length;
Float kakaoTotPrice = totCallCnt * kakaoFtPrice; // 총결제 금액 = 총 전송수량 * 카카오 친구톡 단가
String totPrice = kakaoTotPrice.toString();
System.out.println("@@@@@@@ : "+kakaoTotPrice +" = "+totCallCnt+" * "+kakaoFtPrice);
kakaoVO.setEachPrice(kakaoFtPrice.toString());
kakaoVO.setBefCash(userMoney); // 고객 충전금액
kakaoVO.setBefPoint(userPoint); // 고객 충전 포인트
kakaoVO.setTotPrice(totPrice); // 총 카카오 전송 금액
return kakaoVO;
}
/**
* @methodName : selectSendPriceOfKakaoAtAndSmsAndMms
* @author : 이호영
* @date : 2023.03.02
* @description : 알림톡 / sms / mms 가격 불러오기
* @param String userID
* @return MberManageVO
* @throws Exception
*/
public MberManageVO selectSendPriceOfKakaoAtAndSmsAndMms(String userId) throws Exception {
//1.시스템 기본 단가 정보 불러오기
JoinSettingVO sysJoinSetVO = mjonMsgDataService.selectJoinSettingInfo();
//2.사용자 개인 단가 정보 불러오기
MberManageVO mberManageVO = mjonMsgDataService.selectMberManageInfo(userId);
// kakao 단가
// 사용자 개인 단가가 없으면 시스템 단가로
if(mberManageVO.getKakaoAtPrice() == 0.0f)
mberManageVO.setKakaoAtPrice(sysJoinSetVO.getKakaoAtPrice());
//카카오 친구톡 개인 단가가 없는 경우 시스템 단가로
if(mberManageVO.getKakaoFtPrice() == 0.0f)
mberManageVO.setKakaoFtPrice(sysJoinSetVO.getKakaoFtPrice());
// SMS 인경우
// 사용자 개인 단가가 없으면 시스템 단가로
if(mberManageVO.getShortPrice() == 0.0f)
mberManageVO.setShortPrice(sysJoinSetVO.getShortPrice());
// // MMS 인경우
// 사용자 개인 단가가 없으면 시스템 단가로
if(mberManageVO.getLongPrice() == 0.0f)
mberManageVO.setLongPrice(sysJoinSetVO.getLongPrice());
return mberManageVO;
}
/**
* @Method Name : kakaoSendMsg
* @작성일 : 2023. 2. 14.
* @작성자 : WYH
* @Method 설명 : 카카오톡 전송 메세지 설정
*/
public KakaoVO kakaoSendMsg(KakaoVO kakaoVO) throws Exception {
List<KakaoVO> kakaoSendList = new ArrayList<KakaoVO>();
//전체 받는사람 수량만큼 반복 확인
int callToCnt = kakaoVO.getCallToList().length;
try {
for(int count =0; count < callToCnt; count++) {
KakaoVO setSendMsgVO = new KakaoVO();
setSendMsgVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호
// 카카오 전송내용 설정
// 변환문자 포함(Y), 미포함(N)
if(kakaoVO.getTxtReplYn().equals("Y")) {
String templateContent = kakaoSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, count);
setSendMsgVO.setTemplateContent(templateContent);
if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) {
String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count);
String subTitle = kakaoVO.getTemplateSubtitle();
// title = title +"§§"+ subTitle;
setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType());
setSendMsgVO.setTemplateTitle(title);
}
}else {
if(kakaoVO.getTemplateEmphasizeType().equals("TEXT")) {
String title = kakaoSubMagTxtRepl(kakaoVO.getTemplateTitle(), kakaoVO, count);
String subTitle = kakaoVO.getTemplateSubtitle();
// title = title +"§§"+ subTitle;
setSendMsgVO.setTemplateEmphasizeType(kakaoVO.getTemplateEmphasizeType());
setSendMsgVO.setTemplateTitle(title);
}
// 템플릿 내용 설정
setSendMsgVO.setTemplateContent(kakaoVO.getTemplateContent());
}
//대체문자 포함(Y), 미포함(N)
if(kakaoVO.getSubMsgSendYn().equals("Y")) {
String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
kakaoVO.setKakaoSubMagOrgnlTxt(tempSubMagTxt);
if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) {
tempSubMagTxt = kakaoSubMagTxtRepl(tempSubMagTxt, kakaoVO, count);
}
System.out.println("@@ 대체문자내용 : " + tempSubMagTxt);
setSendMsgVO.setSubMsgTxt(tempSubMagTxt);
int FrBytes = tempSubMagTxt.getBytes(charset).length;
System.out.println("@@ 대체문자길이 : " + FrBytes);
//메세지 길이가 90Byte가 초과시 MMS
if(FrBytes > 90) {
setSendMsgVO.setSubMsgType("MMS");
}else {// 아니면 SMS
setSendMsgVO.setSubMsgType("SMS");
}
System.out.println("@@ 대체문자타입 : " + setSendMsgVO.getSubMsgType());
}
if(kakaoVO.getBizJsonYn().equals("Y")) {
kakaoVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호
String[] varValInfo = null;
if( kakaoVO.getVarValList().size() != 0) {
varValInfo = kakaoVO.getVarValList().get(count);
}
String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, varValInfo);
// String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave_advc(kakaoVO, varValInfo);
// String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count));
setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명
}
kakaoSendList.add(setSendMsgVO);
}
kakaoVO.setKakaoSendList(kakaoSendList);
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
}
return kakaoVO;
}
/**
* @Method Name : kakaoFTSendMsg
* @작성일 : 2024. 1. 17.
* @작성자 : 우영두
* @Method 설명 : 카카오 친톡 전송 메세지 설정
*/
public KakaoVO kakaoFTSendMsg(KakaoVO kakaoVO) throws Exception {
List<KakaoVO> kakaoSendList = new ArrayList<KakaoVO>();
//전체 받는사람 수량만큼 반복 확인
int callToCnt = kakaoVO.getCallToList().length;
try {
for(int count =0; count < callToCnt; count++) {
KakaoVO setSendMsgVO = new KakaoVO();
setSendMsgVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호
// 카카오 전송내용 설정
// 변환문자 포함(Y), 미포함(N)
if(kakaoVO.getTxtReplYn().equals("Y")) {
String templateContent = kakaoFTSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, count);
setSendMsgVO.setTemplateContent(templateContent);
}else {
// 템플릿 내용 설정
setSendMsgVO.setTemplateContent(kakaoVO.getTemplateContent());
}
//대체문자 포함(Y), 미포함(N)
if(kakaoVO.getSubMsgSendYn().equals("Y")) {
String charset = "euc-kr"; //문자 바이트 계산에 필요한 캐릭터 셋 : 한글 2Byte로 계산
String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
kakaoVO.setKakaoSubMagOrgnlTxt(tempSubMagTxt);
if(kakaoVO.getSubMsgTxtReplYn().equals("Y")) {
tempSubMagTxt = kakaoFTSubMagTxtRepl(tempSubMagTxt, kakaoVO, count);
}
setSendMsgVO.setSubMsgTxt(tempSubMagTxt);
int FrBytes = tempSubMagTxt.getBytes(charset).length;
//메세지 길이가 90Byte가 초과시 MMS
if(FrBytes > 90) {
setSendMsgVO.setSubMsgType("MMS");
}else {// 아니면 SMS
setSendMsgVO.setSubMsgType("SMS");
}
}
if(kakaoVO.getBizJsonYn().equals("Y")) {
kakaoVO.setDestPhone(kakaoVO.getCallToList()[count]); // 수신 번호
String[] varValInfo = null;
if( kakaoVO.getVarValList().size() != 0) {
varValInfo = kakaoVO.getVarValList().get(count);
}
String jsonFileName = kakaoApiJsonSave.kakaoApiFTJsonSave(kakaoVO);
// String jsonFileName = kakaoApiJsonSave.kakaoApiJsonSave(kakaoVO, kakaoVO.getVarValList().get(count));
setSendMsgVO.setBizJsonName(jsonFileName); //json 파일명
}
kakaoSendList.add(setSendMsgVO);
}
kakaoVO.setKakaoSendList(kakaoSendList);
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
}
return kakaoVO;
}
public String kakaoSendMsgTest(KakaoVO kakaoVO) throws Exception {
String templateContent = "";
try {
templateContent = kakaoSubMagTxtRepl(kakaoVO.getTemplateContent(), kakaoVO, 0);
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
}
return templateContent;
}
public String kakaoSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) {
System.out.println("tempSubMagTxt : "+ tempSubMagTxt);
// String tempSubMagTxt = kakaoVO.getSubMsgTxt().replace("\r\n", "\n");
// String tempSubMagTxt = msgTxt;
//대체문자에 변환문자가 있는경우
String[] varNm = new String[kakaoVO.getVarNmList().size()];
int q=0;
if(varNm.length != 0) {
for(String temp : kakaoVO.getVarNmList()) {
temp = temp.replaceAll("\\#\\{" , "§§");
temp = temp.replaceAll("\\}" , "§");
varNm[q] = temp;
q++;
}
List<String[]> varValList = kakaoVO.getVarValList(); // value 값
tempSubMagTxt = tempSubMagTxt.replaceAll(String.valueOf((char)13), "");
tempSubMagTxt = tempSubMagTxt.replaceAll("\\#\\{" , "§§");
tempSubMagTxt = tempSubMagTxt.replaceAll("\\}" , "§");
String[] array = varValList.get(count)[0].split("§");
for(int i=0; i < varNm.length; i++) {
if (tempSubMagTxt.indexOf(varNm[i]) > -1) {
if(array[i] != null) {
System.out.println("as : "+varNm[i] +" : "+ StringUtil.getString(array[i]).replace('Ï', ','));
tempSubMagTxt = tempSubMagTxt.replaceAll(varNm[i] , StringUtil.getString(array[i]).replace('Ï', ','));
System.out.println(varNm[i] +" : "+ array[i].replace('Ï', ','));
}else {
tempSubMagTxt = tempSubMagTxt.replaceAll(varNm[i] , "");
}
}
}
}
return tempSubMagTxt;
}
public String kakaoFTSubMagTxtRepl(String tempSubMagTxt, KakaoVO kakaoVO, int count) throws Exception{
List<String[]> varValList = kakaoVO.getVarValList();
tempSubMagTxt = getKakaoFTCntReplace(varValList.get(count)[0], tempSubMagTxt);
return tempSubMagTxt;
}
/*
* 카카오 친구톡 치환 내용에 대한 변환 처리
*
*
* */
public String getKakaoFTCntReplace(String varValStr, String contents) throws Exception{
String[] array = varValStr.split("¶");
String tmpContents = contents;
for(int j=0; j < array.length; j++) {
String tmpVarVal = array[j].replaceAll("§", ",");
if(tmpVarVal.length() > 0) {
if(tmpContents.contains("#{이름}") && j == 0) {
tmpContents = tmpContents.replaceAll("\\#\\{이름\\}", tmpVarVal);
}
//1번째에 핸드폰 번호가 포함 되어 있어서 건너뜀
if(tmpContents.contains("#{1}") && j == 2) {
tmpContents = tmpContents.replaceAll("\\#\\{1\\}", tmpVarVal);
}
if(tmpContents.contains("#{2}") && j == 3) {
tmpContents = tmpContents.replaceAll("\\#\\{2\\}", tmpVarVal);
}
if(tmpContents.contains("#{3}") && j == 4) {
tmpContents = tmpContents.replaceAll("\\#\\{3\\}", tmpVarVal);
}
if(tmpContents.contains("#{4}") && j == 5) {
tmpContents = tmpContents.replaceAll("\\#\\{4\\}", tmpVarVal);
}
}
}
return tmpContents;
}
/*
* 카카오 친구톡 치환문자 내용 스팸 필터
* 치환변수 내용 및 템플릿 내용, 스팸필터 단어 리스트를 전달하면 스팸 문구 포함 문구 리턴
* 없으면 공백을 리턴
*
* */
public String getKakaoFTCntRepToSpamFilter(List<String[]> varValList, List<String> resultSpamTxt, String contents) throws Exception {
String spmFilterTxt = "";
for(int i=0; i < varValList.size(); i++) {
String tmpContents = getKakaoFTCntReplace(varValList.get(i)[0], contents);
//입력 문장에 대해서 우회 문장 또는 특수 기호 입력 제거 등 문장 재구성 처리, 한글 자모음 분리 및 재조함도 함께 처리함.
String resultParser = ComGetSpamStringParser.getSpamTextParse(tmpContents).trim();
//List<String> jasoList = HangulParser.disassemble(resultParser);
//String assembleStr = HangulParser.assemble(jasoList);
//데이터베이스에 등록된 스팸문구와 일치하는 단어/문구가 있는지 체크함.
int spmCnt = 0;
for(String spmTxt : resultSpamTxt) {
String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim();
if(resultParser.contains(parserStr)) {
//스팸 단어/문구가 있으면 콤마로 연결시킨 후 리턴해줌.
spmFilterTxt += spmTxt + ",";
spmCnt++;
}
}
if(spmCnt > 0) {//스팸문자가 포함되어 있으면 문자열 끝 , 단어 삭제 처리
if (StringUtil.getWordRight(spmFilterTxt.trim(), 1).equals(",")) {
// 처음부터 idx 만큼 잘라낸 나머지 글자
spmFilterTxt = StringUtil.getWordLeft(spmFilterTxt.trim(), 1);
}
System.out.println("++++++++++++++ spmFilterTxt ::: "+spmFilterTxt);
return spmFilterTxt;
}
}
return "";
}
/*
* 치환문자가 없는 내용에 대한 스팸필터링 처리
*
* */
public String getKakaoFTCntToSpamFilter(List<String> resultSpamTxt, String contents) throws Exception {
String spmFilterTxt = "";
//for(int i=0; i < varValList.size(); i++) {
//String[] array = varValList.get(i)[0].split("¶");
String tmpContents = contents;
System.out.println(tmpContents);
//입력 문장에 대해서 우회 문장 또는 특수 기호 입력 제거 등 문장 재구성 처리, 한글 자모음 분리 및 재조함도 함께 처리함.
String resultParser = ComGetSpamStringParser.getSpamTextParse(tmpContents).trim();
//List<String> jasoList = HangulParser.disassemble(resultParser);
//String assembleStr = HangulParser.assemble(jasoList);
System.out.println("++++++++++++++ spam resultParser ::: "+resultParser);
//데이터베이스에 등록된 스팸문구와 일치하는 단어/문구가 있는지 체크함.
int spmCnt = 0;
for(String spmTxt : resultSpamTxt) {
String parserStr = ComGetSpamStringParser.getSpamTextParse(spmTxt).trim();
if(resultParser.contains(parserStr)) {
//스팸 단어/문구가 있으면 콤마로 연결시킨 후 리턴해줌.
spmFilterTxt += spmTxt + ",";
spmCnt++;
}
}
if(spmCnt > 0) {//스팸문자가 포함되어 있으면 문자열 끝 , 단어 삭제 처리
if (StringUtil.getWordRight(spmFilterTxt.trim(), 1).equals(",")) {
// 처음부터 idx 만큼 잘라낸 나머지 글자
spmFilterTxt = StringUtil.getWordLeft(spmFilterTxt.trim(), 1);
}
System.out.println("++++++++++++++ spmFilterTxt ::: "+spmFilterTxt);
return spmFilterTxt;
}
//}
return "";
}
public static void statusResponseSet (StatusResponse statusResponse, HttpStatus httpStatus, String msg ) {
statusResponse.setStatus(httpStatus);
statusResponse.setMessage(msg);
}
}