initSoap(); $result = $this->soapService->getKakaotalkChannels($corpNum); return $this->formatResult($result, 'channels'); }, __('message.fetched')); } /** * 카카오톡 채널 관리 URL */ public function channelManagementUrl() { return ApiResponse::handle(function () { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->getKakaotalkChannelManagementUrl($corpNum, $member->barobill_id); return $this->formatResult($result, 'url'); }, __('message.fetched')); } /** * 카카오톡 템플릿 목록 */ public function templates(Request $request) { $data = $request->validate([ 'channel_id' => 'required|string', ]); return ApiResponse::handle(function () use ($data) { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->getKakaotalkTemplates($corpNum, $data['channel_id']); return $this->formatResult($result, 'templates'); }, __('message.fetched')); } /** * 카카오톡 템플릿 관리 URL */ public function templateManagementUrl() { return ApiResponse::handle(function () { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->getKakaotalkTemplateManagementUrl($corpNum, $member->barobill_id); return $this->formatResult($result, 'url'); }, __('message.fetched')); } /** * 알림톡 발송 */ public function sendAlimtalk(Request $request) { $data = $request->validate([ 'sender_id' => 'required|string', 'template_name' => 'required|string', 'receiver_name' => 'required|string', 'receiver_num' => 'required|string', 'title' => 'nullable|string', 'message' => 'required|string', 'buttons' => 'nullable|array', 'buttons.*.Name' => 'required_with:buttons|string', 'buttons.*.ButtonType' => 'required_with:buttons|string', 'buttons.*.Url1' => 'nullable|string', 'buttons.*.Url2' => 'nullable|string', 'sms_message' => 'nullable|string', 'sms_subject' => 'nullable|string', 'reserve_dt' => 'nullable|string', ]); return ApiResponse::handle(function () use ($data) { [$member, $corpNum] = $this->initSoap(); $buttons = $data['buttons'] ?? []; if (! empty($buttons)) { $result = $this->soapService->sendATKakaotalkEx( $corpNum, $data['sender_id'], $data['sender_id'], $data['template_name'], $data['receiver_name'], $data['receiver_num'], $data['title'] ?? '', $data['message'], $buttons, $data['sms_message'] ?? '', $data['sms_subject'] ?? '', '', $data['reserve_dt'] ?? '' ); } else { $result = $this->soapService->sendATKakaotalk( $corpNum, $data['sender_id'], $data['sender_id'], $data['template_name'], $data['receiver_name'], $data['receiver_num'], $data['title'] ?? '', $data['message'], $data['sms_message'] ?? '', $data['sms_subject'] ?? '', '', $data['reserve_dt'] ?? '' ); } return $this->formatResult($result, 'send_key'); }, __('message.created')); } /** * 알림톡 대량 발송 */ public function sendAlimtalkBulk(Request $request) { $data = $request->validate([ 'sender_id' => 'required|string', 'template_name' => 'required|string', 'messages' => 'required|array|min:1', 'messages.*.ReceiverName' => 'required|string', 'messages.*.ReceiverNum' => 'required|string', 'messages.*.Title' => 'nullable|string', 'messages.*.Message' => 'required|string', 'messages.*.SmsMessage' => 'nullable|string', 'messages.*.SmsSubject' => 'nullable|string', 'reserve_dt' => 'nullable|string', ]); return ApiResponse::handle(function () use ($data) { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->sendATKakaotalks( $corpNum, $data['sender_id'], $data['sender_id'], $data['template_name'], $data['messages'], $data['reserve_dt'] ?? '' ); return $this->formatResult($result, 'send_key'); }, __('message.created')); } /** * 친구톡 텍스트 발송 */ public function sendFriendtalk(Request $request) { $data = $request->validate([ 'sender_id' => 'required|string', 'channel_id' => 'required|string', 'receiver_name' => 'required|string', 'receiver_num' => 'required|string', 'message' => 'required|string', 'buttons' => 'nullable|array', 'sms_message' => 'nullable|string', 'sms_subject' => 'nullable|string', 'ad_yn' => 'nullable|boolean', 'reserve_dt' => 'nullable|string', ]); return ApiResponse::handle(function () use ($data) { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->sendFTKakaotalk( $corpNum, $data['sender_id'], $data['channel_id'], $data['receiver_name'], $data['receiver_num'], $data['message'], $data['buttons'] ?? [], $data['sms_message'] ?? '', $data['sms_subject'] ?? '', $data['ad_yn'] ?? false, $data['reserve_dt'] ?? '' ); return $this->formatResult($result, 'send_key'); }, __('message.created')); } /** * 친구톡 이미지 발송 */ public function sendFriendtalkImage(Request $request) { $data = $request->validate([ 'sender_id' => 'required|string', 'channel_id' => 'required|string', 'receiver_name' => 'required|string', 'receiver_num' => 'required|string', 'message' => 'required|string', 'image_url' => 'required|string', 'buttons' => 'nullable|array', 'sms_message' => 'nullable|string', 'sms_subject' => 'nullable|string', 'ad_yn' => 'nullable|boolean', 'reserve_dt' => 'nullable|string', ]); return ApiResponse::handle(function () use ($data) { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->sendFIKakaotalk( $corpNum, $data['sender_id'], $data['channel_id'], $data['receiver_name'], $data['receiver_num'], $data['message'], $data['image_url'], $data['buttons'] ?? [], $data['sms_message'] ?? '', $data['sms_subject'] ?? '', $data['ad_yn'] ?? false, $data['reserve_dt'] ?? '' ); return $this->formatResult($result, 'send_key'); }, __('message.created')); } /** * 친구톡 와이드 이미지 발송 */ public function sendFriendtalkWide(Request $request) { $data = $request->validate([ 'sender_id' => 'required|string', 'channel_id' => 'required|string', 'receiver_name' => 'required|string', 'receiver_num' => 'required|string', 'message' => 'required|string', 'image_url' => 'required|string', 'buttons' => 'nullable|array', 'sms_message' => 'nullable|string', 'sms_subject' => 'nullable|string', 'ad_yn' => 'nullable|boolean', 'reserve_dt' => 'nullable|string', ]); return ApiResponse::handle(function () use ($data) { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->sendFWKakaotalk( $corpNum, $data['sender_id'], $data['channel_id'], $data['receiver_name'], $data['receiver_num'], $data['message'], $data['image_url'], $data['buttons'] ?? [], $data['sms_message'] ?? '', $data['sms_subject'] ?? '', $data['ad_yn'] ?? false, $data['reserve_dt'] ?? '' ); return $this->formatResult($result, 'send_key'); }, __('message.created')); } /** * 전송 결과 조회 (단건) */ public function getSendResult(string $sendKey) { return ApiResponse::handle(function () use ($sendKey) { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->getSendKakaotalk($corpNum, $sendKey); return $this->formatResult($result, 'result'); }, __('message.fetched')); } /** * 전송 결과 조회 (다건) */ public function getSendResults(Request $request) { $data = $request->validate([ 'send_keys' => 'required|array|min:1', 'send_keys.*' => 'required|string', ]); return ApiResponse::handle(function () use ($data) { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->getSendKakaotalks($corpNum, $data['send_keys']); return $this->formatResult($result, 'results'); }, __('message.fetched')); } /** * 예약 발송 취소 */ public function cancelReserved(string $sendKey) { return ApiResponse::handle(function () use ($sendKey) { [$member, $corpNum] = $this->initSoap(); $result = $this->soapService->cancelReservedKakaotalk($corpNum, $sendKey); return $this->formatResult($result, 'result'); }, __('message.deleted')); } /** * 바로빌 회원 조회 및 SOAP 초기화 */ private function initSoap(): array { $member = $this->getMember(); if (! $member) { throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException( __('error.barobill.member_not_found', [], 'ko') ?: '바로빌 회원사가 등록되어 있지 않습니다.' ); } $this->soapService->initForMember($member); return [$member, $member->biz_no]; } private function getMember(): ?BarobillMember { $tenantId = app('tenant_id'); return BarobillMember::withoutGlobalScopes() ->where('tenant_id', $tenantId) ->first(); } private function formatResult(array $result, string $key): array { if (! ($result['success'] ?? false)) { throw new \Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException( $result['error'] ?? '바로빌 API 호출 실패' ); } return [$key => $result['data'] ?? null]; } }