package itn.let.kakao.kakaoComm; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import itn.com.cmm.util.StringUtil; import itn.let.kakao.kakaoComm.kakaoApi.KakaoApiJsonSave; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgdata.service.MjonMsgDataService; import itn.let.mjo.spammsg.web.ComGetSpamStringParser; import itn.let.sym.site.service.JoinSettingVO; import itn.let.uss.umt.service.MberManageVO; @Component public class KakaoSendUtil { @Autowired KakaoApiJsonSave kakaoApiJsonSave; @Resource(name = "MjonMsgDataService") private MjonMsgDataService mjonMsgDataService; /** * @Method Name : kakaoSendPrice * @작성일 : 2023. 2. 14. * @작성자 : WYH * @Method 설명 : 카카오 전송 가격 설정 */ public KakaoVO kakaoSendPrice(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 kakaoAtPrice = mberManageVO.getKakaoAtPrice(); /** 대체문자 여부 체크(있으면 대체문자 가격으로 없으면 카카오톡 가격으로) */ //대체문자 발송 여부 확인 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); } 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; } /** * @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 kakaoSendList = new ArrayList(); //전체 받는사람 수량만큼 반복 확인 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); } 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.kakaoApiJsonSave(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; } 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) { // 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 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 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); } } } System.out.println(tmpContents); return tmpContents; } /* * 카카오 친구톡 치환문자 내용 스팸 필터 * 치환변수 내용 및 템플릿 내용, 스팸필터 단어 리스트를 전달하면 스팸 문구 포함 문구 리턴 * 없으면 공백을 리턴 * * */ public String getKakaoFTCntRepToSpamFilter(List varValList, List resultSpamTxt, String contents) throws Exception { String spmFilterTxt = ""; for(int i=0; i < varValList.size(); i++) { //String[] array = varValList.get(i)[0].split("¶"); String tmpContents = getKakaoFTCntReplace(varValList.get(i)[0], contents); System.out.println(tmpContents); //입력 문장에 대해서 우회 문장 또는 특수 기호 입력 제거 등 문장 재구성 처리, 한글 자모음 분리 및 재조함도 함께 처리함. String resultParser = ComGetSpamStringParser.getSpamTextParse(tmpContents).trim(); //List 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 String getKakaoFTCntToSpamFilter(List 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 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 ""; } }