본문으로 건너뛰기

선물하기 자동알림 LMS 발송 고정

PHP 8 · GODO26
변경 파일 수: 3개
변경 파일 목록
총 3개
변경 파일 코드
추가삭제
Admin/crm/message_config.php+12-1
변경 전message_config.php
<div class="ncua-table ncua-table--vertical">
<table>
<tr>
<th><div data-tooltip-seq="018">자동알림 90byte 초과시 전송 방법</div>
</th>
<td>
<div class="ncua-radio-group ncua-flex ncua-flex-gap">
</details>
</section>
<?php endif; ?>
 
 
 
 
 
 
 
 
 
 
 
</section>
 
<!-- 카카오 친구톡 섹션 -->
 
변경 후message_config.php
<div class="ncua-table ncua-table--vertical">
<table>
<tr>
<th><div>자동알림 90byte 초과시 전송 방법</div>
</th>
<td>
<div class="ncua-radio-group ncua-flex ncua-flex-gap">
</details>
</section>
<?php endif; ?>
<section class="ncua-card__body accordion-section">
<details class="ncua-accordion ncua-accordion--gray" open>
<summary>자동알림 90byte 초과시 전송 방법 확인사항</summary>
<ul class="ncua-accordion__content">
<li class="ncua-notice-info">SMS는 최대 90byte까지만 발송 가능합니다.</li>
<li class="ncua-notice-info">내용 또는 변수 값에 따라 90byte를 넘을 경우, 선택한 전송 방법으로 발송됩니다.</li>
<li class="ncua-notice-info">해당 설정은 SMS 자동알림, 자동알림 대체발송(SMS 내용으로 발송)에만 적용됩니다.</li>
<li class="ncua-notice-info text-danger">선물하기 자동알림 발송 메시지 내용이 90byte를 초과할 경우, SMS 발송 설정과 무관하게 LMS로 자동 발송됩니다.</li>
</ul>
</details>
</section>
</section>
 
<!-- 카카오 친구톡 섹션 -->
 
Admin/goods/present_config/function_config.php+1
변경 전function_config.php
<h3 class="ncua-card__title ncua-flex ncua-align-items-center" data-tooltip-seq="001" data-tooltip-icon-type="fill">기능 설정</h3>
</header>
<section class="ncua-card__body js-track-change">
 
<div class="ncua-table ncua-table--vertical">
<table>
<tbody>
 
변경 후function_config.php
<h3 class="ncua-card__title ncua-flex ncua-align-items-center" data-tooltip-seq="001" data-tooltip-icon-type="fill">기능 설정</h3>
</header>
<section class="ncua-card__body js-track-change">
<div class="ncua-notice-info" style="margin-bottom:16px;">선물하기 자동알림 발송 메시지 내용이 90byte를 초과할 경우, SMS 발송 설정과 무관하게 LMS로 자동 발송됩니다.</div>
<div class="ncua-table ncua-table--vertical">
<table>
<tbody>
 
Component/Sms/SmsAuto.php+111-26
변경 전SmsAuto.php
$smsContentForRecipient['contents'], $originalReplaceArguments, $this->smsAutoCodeType, AutoSendChannel::SMS
);
}
$kakaoSmsOverFlag = SmsAutoSendOverType::LIMIT->value;
if ($this->findAutoSendConfigService->isOverSmsLength($replacedKakaoContents)) {
$kakaoSmsOverFlag = $this->findAutoSendConfigService->getSmsSendOverFlag($this->smsAutoConfig)->value;
}
} else {
$kakaoSmsOverFlag = SmsAutoSendOverType::LIMIT->value;
if ($this->findAutoSendConfigService->isOverSmsLength($replacedKakaoContents)) {
$kakaoSmsOverFlag = $this->findAutoSendConfigService->convertCrmToSendOverFlag($this->kakaoCrmConfig);;
}
}
} else {
$replacedKakaoContents = '';
$smsContentForRecipient['contents'], $originalReplaceArguments, $this->smsAutoCodeType, AutoSendChannel::SMS
);
}
$kakaoSmsOverFlag = SmsAutoSendOverType::LIMIT->value;
if ($this->findAutoSendConfigService->isOverSmsLength($replacedKakaoContents)) {
$kakaoSmsOverFlag = $this->findAutoSendConfigService->getSmsSendOverFlag($this->smsAutoConfig)->value;
}
} else {
$kakaoSmsOverFlag = SmsAutoSendOverType::LIMIT->value;
if ($this->findAutoSendConfigService->isOverSmsLength($replacedKakaoContents)) {
$kakaoSmsOverFlag = $this->findAutoSendConfigService->convertCrmToSendOverFlag($this->kakaoCrmConfig);;
}
}
} else {
$replacedKakaoContents = '';
$logData = $this->buildSendLogData($logData);
 
// 발송
$smsOverFlag = $this->findAutoSendConfigService->getSmsSendOverFlag($this->smsAutoConfig);
$message = new \Component\Sms\SmsMessage($contents);
if ($message->exceedSmsLength()) {
$message = match ($smsOverFlag) {
SmsAutoSendOverType::LMS => new \Component\Sms\LmsMessage($contents),
SmsAutoSendOverType::DIVISION => new \Component\Sms\DivisionSmsMessage($contents),
default => new \Component\Sms\SmsMessage($contents),
};
}
 
$transport = \App::load(SmsSender::class);
if ($this->isAutoSend() || !$this->passwordCheckFl) {
// LMS 제목 (설정된 자동발송 문구 제목 - LMS 발송 시에만 SmsSender 에서 사용, 미입력 시 [제목없음])
// 튜닝 상점 대비: 구버전 SmsSender(setSubject 미보유)에서 발송 중단 방지
if (method_exists($transport, 'setSubject')) {
$transport->setSubject($item['messageTitle'] ?? '');
}
$transport->setSmsType($item['smsType']);
$transport->setReceiver($receiverData);
return $transport->send();
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/**
* 카카오 비즈엠 버튼 데이터 생성
* 페이지링크에 송장번호 치환코드가 있는 경우 치환 처리
 
변경 후SmsAuto.php
$smsContentForRecipient['contents'], $originalReplaceArguments, $this->smsAutoCodeType, AutoSendChannel::SMS
);
}
$kakaoSmsOverFlag = $this->resolveKakaoAlternativeSmsOverFlag($replacedKakaoContents, bySmsContent: true);
 
 
 
} else {
$kakaoSmsOverFlag = $this->resolveKakaoAlternativeSmsOverFlag($replacedKakaoContents, bySmsContent: false);
 
 
 
}
} else {
$replacedKakaoContents = '';
$smsContentForRecipient['contents'], $originalReplaceArguments, $this->smsAutoCodeType, AutoSendChannel::SMS
);
}
$kakaoSmsOverFlag = $this->resolveKakaoAlternativeSmsOverFlag($replacedKakaoContents, bySmsContent: true);
 
 
 
} else {
$kakaoSmsOverFlag = $this->resolveKakaoAlternativeSmsOverFlag($replacedKakaoContents, bySmsContent: false);
 
 
 
}
} else {
$replacedKakaoContents = '';
$logData = $this->buildSendLogData($logData);
 
// 발송
$message = $this->createSendMessage($contents);
 
 
 
 
 
 
 
 
 
$transport = \App::load(SmsSender::class);
if ($this->isAutoSend() || !$this->passwordCheckFl) {
// LMS 제목 (설정된 자동발송 문구 제목 - LMS 발송 시에만 SmsSender 에서 사용, 미입력 시 [제목없음])
// 튜닝 상점 대비: 구버전 SmsSender(setSubject 미보유)에서 발송 중단 방지
if (method_exists($transport, 'setSubject')) {
$transport->setSubject($this->resolveSendSubject($item, $recipientKey));
}
$transport->setSmsType($item['smsType']);
$transport->setReceiver($receiverData);
return $transport->send();
}
 
/**
* 치환 완료된 내용으로 SMS 발송 메시지를 생성한다.
*
* @param string $contents 치환 완료된 발송 내용
* @return AbstractMessage 90byte 이하이면 SmsMessage, 초과 시 전송 방법에 따른 메시지
*/
protected function createSendMessage(string $contents): AbstractMessage
{
$smsOverFlag = $this->findAutoSendConfigService->getSmsSendOverFlag($this->smsAutoConfig);
if ($this->isPresentAutoSend()) {
$smsOverFlag = SmsAutoSendOverType::LMS;
}
 
$message = new \Component\Sms\SmsMessage($contents);
if ($message->exceedSmsLength()) {
$message = match ($smsOverFlag) {
SmsAutoSendOverType::LMS => new \Component\Sms\LmsMessage($contents),
SmsAutoSendOverType::DIVISION => new \Component\Sms\DivisionSmsMessage($contents),
default => new \Component\Sms\SmsMessage($contents),
};
}
 
return $message;
}
 
/**
* LMS 발송 시 사용할 제목을 결정한다.
*
* @param array $item 조회된 SMS 템플릿. 등록된 제목은 messageTitle key 에 담긴다
* @param string $recipientKey 수신대상 ('member', 'admin', 'provider', 'recipient')
* @return string 등록된 제목. 선물하기 자동알림이면서 치환코드를 제외한 제목이 비어 있으면 기본 제목
*/
protected function resolveSendSubject(array $item, string $recipientKey): string
{
$messageTitle = $item['messageTitle'] ?? '';
if ($this->isPresentAutoSend()) {
// 실발송 제목은 SmsSender 가 치환코드를 제거한 뒤 공란을 판정하므로 같은 기준으로 봐야
// 치환코드만 등록된 제목이 '[제목없음]' 으로 발송되는 것을 막을 수 있다
$titleWithoutReplaceCode = trim(preg_replace('/#?\{[^}]*\}/u', '', (string) $messageTitle));
if ($titleWithoutReplaceCode === '') {
return $this->getPresentDefaultSubject($recipientKey);
}
}
 
return $messageTitle;
}
 
/**
* 선물하기 자동알림의 LMS 기본 제목을 반환한다.
*
* 선물하기 템플릿에는 제목이 등록돼 있지 않아 LMS 로 발송하면 수신자에게 '[제목없음]' 으로 보인다.
*
* @param string $recipientKey 수신대상 ('member', 'admin', 'provider', 'recipient')
* @return string 기본 제목. 정의된 제목이 없으면 빈 문자열
*/
protected function getPresentDefaultSubject(string $recipientKey): string
{
$defaultSubjects = [
Code::PRESENT => ['common' => '선물 발송 완료', 'recipient' => '선물이 도착했어요'],
Code::PRESENT_REMAIN_THREE => ['common' => '선물 수락 기한 3일 전', 'recipient' => '선물 수락 기한 3일 전'],
Code::PRESENT_REMAIN_ONE => ['common' => '선물 수락 기한 1일 전', 'recipient' => '선물 수락 기한 1일 전'],
Code::PRESENT_ACCEPT => ['common' => '선물 수락 완료', 'recipient' => '선물 수락 완료'],
Code::PRESENT_REJECT => ['common' => '선물 거절 및 환불 접수', 'recipient' => '선물 거절 및 환불 접수'],
Code::PRESENT_CHANGE_DEST => ['common' => '선물 배송지 변경', 'recipient' => '배송지 변경 완료'],
Code::PRESENT_INVOICE_CODE => ['recipient' => '선물 배송 시작'],
Code::PRESENT_REJECT_FAIL => ['common' => '선물 수락기간 만료', 'recipient' => '선물 수락기간 만료'],
];
 
$subjectKey = $recipientKey === 'recipient' ? 'recipient' : 'common';
 
return $defaultSubjects[$this->smsAutoCodeType][$subjectKey] ?? '';
}
 
/**
* 알림톡 발송 실패 시 대체발송할 SMS 의 90byte 초과 전송 방법을 결정한다.
*
* @param string|null $contents 대체발송할 내용. 치환 결과가 비어 있으면 null 이 넘어온다
* @param bool $bySmsContent 대체발송 내용을 SMS 템플릿에서 가져온 경우 true, 알림톡 내용을 그대로 쓰면 false
* @return string SmsAutoSendOverType 값 또는 'none'
*/
protected function resolveKakaoAlternativeSmsOverFlag(?string $contents, bool $bySmsContent): string
{
if (!$this->findAutoSendConfigService->isOverSmsLength($contents)) {
return SmsAutoSendOverType::LIMIT->value;
}
 
if ($this->isPresentAutoSend()) {
return SmsAutoSendOverType::LMS->value;
}
 
if ($bySmsContent) {
return $this->findAutoSendConfigService->getSmsSendOverFlag($this->smsAutoConfig)->value;
}
 
return $this->findAutoSendConfigService->convertCrmToSendOverFlag($this->kakaoCrmConfig);
}
 
/**
* 선물확인 URL 이 절단되거나 분할되면 수신자가 선물을 확인할 수 없어, 선물하기는 상점의 90byte 초과 전송 방법 설정과 무관하게 LMS 로 발송한다.
*/
protected function isPresentAutoSend(): bool
{
return $this->smsType === SmsAutoCode::PRESENT;
}
 
/**
* 카카오 비즈엠 버튼 데이터 생성
* 페이지링크에 송장번호 치환코드가 있는 경우 치환 처리