497 lines
16 KiB
Java
497 lines
16 KiB
Java
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<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);
|
|
}
|
|
|
|
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<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 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<String[]> varValList, 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 = getKakaoFTCntReplace(varValList.get(i)[0], 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 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 "";
|
|
}
|
|
|
|
}
|