shell bypass 403
<?php namespace App\Http\Controllers\Customer; use App\Events\MessageReceived; use App\Http\Controllers\Controller; use App\Models\Blacklists; use App\Models\Campaigns; use App\Models\ChatBox; use App\Models\ChatBoxMessage; use App\Models\ContactGroups; use App\Models\ContactGroupsOptinKeywords; use App\Models\ContactGroupsOptoutKeywords; use App\Models\Contacts; use App\Models\Country; use App\Models\Keywords; use App\Models\Notifications; use App\Models\PhoneNumbers; use App\Models\PlansSendingServer; use App\Models\Reports; use App\Models\Senderid; use App\Models\SendingServer; use App\Models\User; use App\Repositories\Eloquent\EloquentCampaignRepository; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use libphonenumber\NumberParseException; use libphonenumber\PhoneNumberUtil; use Throwable; use Twilio\TwiML\Messaging\Message; use Twilio\TwiML\MessagingResponse; use function PHPUnit\Framework\isNull; class DLRController extends Controller { /** * update dlr * * @param $message_id * @param $status * @param null $sender_id * @param null $phone * * @return mixed */ public static function updateDLR($message_id, $status, $phone = null, $sender_id = null): mixed { $get_data = Reports::query()->when($message_id, function ($query) use ($message_id) { $query->whereLike(['status'], $message_id); })->when($sender_id, function ($query) use ($sender_id) { $query->whereLike(['from'], $sender_id); })->when($phone, function ($query) use ($phone) { $query->whereLike(['to'], $phone); })->first(); if ($get_data) { $get_data->status = $status . '|' . $message_id; $get_data->save(); if ($get_data->campaign_id) { Campaigns::find($get_data->campaign_id)->updateCache(); } } return $status; } /** *twilio dlr * * @param Request $request */ public function dlrTwilio(Request $request) { $message_id = $request->MessageSid; $status = $request->MessageStatus; if ($status == 'delivered' || $status == 'sent') { $status = 'Delivered'; } $this::updateDLR($message_id, $status); } /** * Route mobile DLR * * @param Request $request */ public function dlrRouteMobile(Request $request) { $message_id = $request->sMessageId; $status = $request->sStatus; $sender_id = $request->sSender; $phone = $request->sMobileNo; if ($status == 'DELIVRD' || $status == 'ACCEPTED') { $status = 'Delivered'; } $this::updateDLR($message_id, $status, $sender_id, $phone); } /** * text local DLR * * @param Request $request */ public function dlrTextLocal(Request $request) { $message_id = $request->customID; $status = $request->status; $phone = $request->number; if ($status == 'D') { $status = 'Delivered'; } $this::updateDLR($message_id, $status, null, $phone); } /** * Plivo DLR * * @param Request $request */ public function dlrPlivo(Request $request) { $message_id = $request->MessageUUID; $status = $request->Status; $phone = $request->To; $sender_id = $request->From; if ($status == 'delivered' || $status == 'sent') { $status = 'Delivered'; } $this::updateDLR($message_id, $status, $phone, $sender_id); } /** * SMS Global DLR * * @param Request $request */ public function dlrSMSGlobal(Request $request) { $message_id = $request->msgid; $status = $request->dlrstatus; if ($status == 'DELIVRD') { $status = 'Delivered'; } $this::updateDLR($message_id, $status); } /** * Advance Message System Delivery reports * * @param Request $request */ public function dlrAdvanceMSGSys(Request $request) { $message_id = $request->MessageId; $status = $request->Status; $phone = $request->Destination; $sender_id = $request->Source; if ($status == 'DELIVRD') { $status = 'Delivered'; } $this::updateDLR($message_id, $status, $phone, $sender_id); } /** * nexmo now Vonage DLR * * @param Request $request */ public function dlrVonage(Request $request) { $message_id = $request->messageId; $status = $request->status; $phone = $request->msisdn; $sender_id = $request->to; if ($status == 'delivered' || $status == 'accepted') { $status = 'Delivered'; } $this::updateDLR($message_id, $status, $phone, $sender_id); } /** * infobip DLR * * @param Request $request */ public function dlrInfobip(Request $request) { $get_data = $request->getContent(); $get_data = json_decode($get_data, true); if (isset($get_data) && is_array($get_data) && array_key_exists('results', $get_data)) { $message_id = $get_data['results']['0']['messageId']; foreach ($get_data['results'] as $msg) { if (isset($msg['status']['groupName'])) { $status = $msg['status']['groupName']; if ($status == 'DELIVERED') { $status = 'Delivered'; } $this::updateDLR($message_id, $status); } } } } public function dlrEasySendSMS(Request $request) { $message_id = $request->messageid; $status = $request->status; $phone = $request->mobile; $sender_id = $request->sender; if ($status == 'delivered') { $status = 'Delivered'; } $this::updateDLR($message_id, $status, $phone, $sender_id); } /** * AfricasTalking delivery reports * * @param Request $request */ public function dlrAfricasTalking(Request $request) { $message_id = $request->id; $status = $request->status; $phone = str_replace(['(', ')', '+', '-', ' '], '', $request->phoneNumber); if ($status == 'Success') { $status = 'Delivered'; } $this::updateDLR($message_id, $status, $phone); } /** * 1s2u delivery reports * * @param Request $request */ public function dlr1s2u(Request $request) { $message_id = $request->msgid; $status = $request->status; $phone = str_replace(['(', ')', '+', '-', ' '], '', $request->mno); $sender_id = $request->sid; if ($status == 'DELIVRD') { $status = 'Delivered'; } $this::updateDLR($message_id, $status, $phone, $sender_id); } /** * dlrKeccelSMS delivery reports * * @param Request $request */ public function dlrKeccelSMS(Request $request) { $message_id = $request->messageID; $status = $request->status; if ($status == 'DELIVERED') { $status = 'Delivered'; } $this::updateDLR($message_id, $status); } /** * dlrGatewayApi delivery reports * * @param Request $request */ public function dlrGatewayApi(Request $request) { $message_id = $request->id; $status = $request->status; $phone = str_replace(['(', ')', '+', '-', ' '], '', $request->msisdn); if ($status == 'DELIVRD' || $status == 'DELIVERED') { $status = 'Delivered'; } $this::updateDLR($message_id, $status, $phone); } /** * bulk sms delivery reports * * @param Request $request */ public function dlrBulkSMS(Request $request) { logger($request->all()); } /** * SMSVas delivery reports * * @param Request $request */ public function dlrSMSVas(Request $request) { logger($request->all()); } /** * receive inbound message * * @param $to * @param $message * @param $sending_sever * @param $cost * @param null $from * @param null $media_url * @param null $extra * @param int $user_id * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public static function inboundDLR($to, $message, $sending_sever, $cost, $from = null, $media_url = null, $extra = null, int $user_id = 1): JsonResponse|string { if (config('app.stage') == 'demo') { return response()->json([ 'status' => 'error', 'message' => 'Sorry!! This options is not available in demo mode', ]); } $to = str_replace(['(', ')', '+', '-', ' '], '', trim($to)); if ($from != null) { $from = str_replace(['(', ')', '+', '-', ' '], '', trim($from)); } $success = 'Success'; $failed = null; if ($extra != null) { $sender_id = Senderid::where('sender_id', $extra)->first(); if ($sender_id) { $user_id = $sender_id->user_id; $user = User::find($user_id); $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first(); if (isset($user->customer)) { // Check the customer has permissions using sending servers and has his own sending servers if ($user->customer->getOption('create_sending_server') == 'yes' && in_array('create_sending_servers', json_decode($user->customer->customerPermissions(), true))) { $plan_id = $user->customer->activeSubscription()->plan_id; if (PlansSendingServer::where('plan_id', $plan_id)->count()) { $sending_servers = SendingServer::where('user_id', $user->id)->where('settings', $sending_sever)->where('status', true)->first(); } else { $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first(); } } else { // If customer don't have permission creating sending servers $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first(); } //checking chat box $chatBox = ChatBox::where('to', $to)->where('from', $extra)->where('user_id', $user_id)->first(); if ($chatBox) { $chatBox->notification += 1; $chatBox->save(); } else { $chatBox = ChatBox::create([ 'user_id' => $user_id, 'from' => $extra, 'to' => $to, 'notification' => 1, 'sending_server_id' => $sending_servers->id, ]); } if ($chatBox && $sending_servers) { Notifications::create([ 'user_id' => $user_id, 'notification_for' => 'customer', 'notification_type' => 'chatbox', 'message' => 'New chat message arrive', ]); ChatBoxMessage::create([ 'box_id' => $chatBox->id, 'message' => $message, 'media_url' => $media_url, 'sms_type' => 'sms', 'send_by' => 'to', 'sending_server_id' => $sending_servers->id, ]); $user = User::find($user_id); event(new MessageReceived($user, $message, $chatBox)); } else { $failed .= 'Failed to create chat message '; } } if ($sending_servers) { Reports::create([ 'user_id' => $user_id, 'from' => $from, 'to' => $to, 'message' => $message, 'sms_type' => 'plain', 'status' => "Delivered", 'send_by' => "to", 'cost' => $cost, 'media_url' => $media_url, 'sending_server_id' => $sending_servers->id, ]); } } } else { $phone_number = PhoneNumbers::where('number', $from)->where('status', 'assigned')->first(); if ($media_url) { $sms_type = 'mms'; } else { $sms_type = 'plain'; } if ($phone_number) { $user_id = $phone_number->user_id; } $user = User::find($user_id); // Check the customer has permissions using sending servers and has his own sending servers if ($user->customer->getOption('create_sending_server') == 'yes' && in_array('create_sending_servers', json_decode($user->customer->customerPermissions(), true))) { $plan_id = $user->customer->activeSubscription()->plan_id; if (PlansSendingServer::where('plan_id', $plan_id)->count()) { $sending_servers = SendingServer::where('user_id', $user->id)->where('settings', $sending_sever)->where('status', true)->first(); } else { $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first(); } } else { // If customer don't have permission creating sending servers $sending_servers = SendingServer::where('settings', $sending_sever)->where('status', true)->first(); } if ($sending_servers) { Reports::create([ 'user_id' => $user_id, 'from' => $from, 'to' => $to, 'message' => $message, 'sms_type' => $sms_type, 'status' => "Delivered", 'send_by' => "to", 'cost' => $cost, 'media_url' => $media_url, 'sending_server_id' => $sending_servers->id, ]); if (isset($user->customer)) { //checking chat box $chatBox = ChatBox::where('to', $to)->where('from', $from)->where('user_id', $user_id)->first(); if ($chatBox) { $chatBox->notification += 1; $chatBox->save(); } else { $chatBox = ChatBox::create([ 'user_id' => $user_id, 'from' => $from, 'to' => $to, 'notification' => 1, 'sending_server_id' => $sending_servers->id, ]); } if ($chatBox) { Notifications::create([ 'user_id' => $user_id, 'notification_for' => 'customer', 'notification_type' => 'chatbox', 'message' => 'New chat message arrive', ]); ChatBoxMessage::create([ 'box_id' => $chatBox->id, 'message' => $message, 'media_url' => $media_url, 'sms_type' => 'sms', 'send_by' => 'to', 'sending_server_id' => $sending_servers->id, ]); $user = User::find($user_id); event(new MessageReceived($user, $message, $chatBox)); } else { $failed .= 'Failed to create chat message '; } //check keywords $keyword = Keywords::where('user_id', $user_id) ->select('*') ->selectRaw('lower(keyword_name) as keyword,keyword_name') ->where('keyword_name', strtolower($message)) ->where('status', 'assigned')->first(); if ($keyword) { $phoneUtil = PhoneNumberUtil::getInstance(); $phoneNumberObject = $phoneUtil->parse('+' . $to); $country_code = $phoneNumberObject->getCountryCode(); $country = Country::where('country_code', $country_code)->first(); if ( ! $country) { $failed .= "Permission to send an SMS has not been enabled for the region indicated by the 'To' number: " . $to; } //checking contact message $contact_groups = ContactGroups::where('customer_id', $user_id)->select('id')->cursor()->pluck('id')->toArray(); $optInContacts = ContactGroupsOptinKeywords::whereIn('contact_group', $contact_groups)->where('keyword', $message)->cursor(); $optOutContacts = ContactGroupsOptoutKeywords::whereIn('contact_group', $contact_groups)->where('keyword', $message)->cursor(); $blacklist = Blacklists::where('user_id', $user_id)->where('number', $to)->first(); if ($optInContacts->count()) { foreach ($optInContacts as $contact) { $exist = Contacts::where('group_id', $contact->contact_group)->where('phone', $to)->first(); if ($blacklist) { $blacklist->delete(); } if ( ! $exist) { $data = Contacts::create([ 'customer_id' => $user_id, 'group_id' => $contact->contact_group, 'phone' => $to, 'first_name' => null, 'last_name' => null, ]); if ($data && $country) { $sendMessage = new EloquentCampaignRepository($campaign = new Campaigns()); if ($contact->ContactGroups->send_keyword_message) { if ($keyword->reply_text) { $sendMessage->quickSend($campaign, [ 'sender_id' => $keyword->sender_id, 'sms_type' => 'plain', 'message' => $keyword->reply_text, 'recipient' => $phoneNumberObject->getNationalNumber(), 'user_id' => $user_id, 'sending_server' => $contact->ContactGroups->sending_server, 'country_code' => $country_code, 'exist_c_code' => true, ]); } } else { if ($contact->ContactGroups->send_welcome_sms && $contact->ContactGroups->welcome_sms) { $sendMessage->quickSend($campaign, [ 'sender_id' => $contact->ContactGroups->sender_id, 'sms_type' => 'plain', 'message' => $contact->ContactGroups->welcome_sms, 'recipient' => $phoneNumberObject->getNationalNumber(), 'user_id' => $user_id, 'sending_server' => $contact->ContactGroups->sending_server, 'country_code' => $country_code, 'exist_c_code' => true, ]); } } $contact->ContactGroups->updateCache('SubscribersCount'); } else { $failed .= 'Failed to subscribe contact list'; } } else { if ($country) { $sendMessage = new EloquentCampaignRepository($campaign = new Campaigns()); $sendMessage->quickSend($campaign, [ 'sender_id' => $keyword->sender_id, 'sms_type' => 'plain', 'message' => __('locale.contacts.you_have_already_subscribed', ['contact_group' => $contact->ContactGroups->name]), 'recipient' => $phoneNumberObject->getNationalNumber(), 'user_id' => $user_id, 'sending_server' => $contact->ContactGroups->sending_server, 'country_code' => $country_code, 'exist_c_code' => true, ]); } $exist->update([ 'status' => 'subscribe', ]); } } } else if ($optOutContacts->count()) { foreach ($optOutContacts as $contact) { if ( ! $blacklist) { $exist = Contacts::where('group_id', $contact->contact_group)->where('phone', $to)->first(); if ($exist) { $data = $exist->update([ 'status' => 'unsubscribe', ]); if ($data && $country) { Blacklists::create([ 'user_id' => $user_id, 'number' => $to, 'reason' => "Optout by User", ]); $chatbox_messages = ChatBox::where('user_id', $user_id)->where('to', $to)->cursor(); foreach ($chatbox_messages as $messages) { $check_delete = ChatBoxMessage::where('box_id', $messages->id)->delete(); if ($check_delete) { $messages->delete(); } } $sendMessage = new EloquentCampaignRepository($campaign = new Campaigns()); if ($contact->ContactGroups->send_keyword_message) { if ($keyword->reply_text) { $sendMessage->quickSend($campaign, [ 'sender_id' => $keyword->sender_id, 'sms_type' => 'plain', 'message' => $keyword->reply_text, 'recipient' => $phoneNumberObject->getNationalNumber(), 'user_id' => $user_id, 'sending_server' => $contact->ContactGroups->sending_server, 'country_code' => $country_code, 'exist_c_code' => true, ]); } } else { if ($contact->ContactGroups->unsubscribe_notification && $contact->ContactGroups->unsubscribe_sms) { $sendMessage->quickSend($campaign, [ 'sender_id' => $contact->ContactGroups->sender_id, 'sms_type' => 'plain', 'message' => $contact->ContactGroups->unsubscribe_sms, 'recipient' => $phoneNumberObject->getNationalNumber(), 'user_id' => $user_id, 'sending_server' => $contact->ContactGroups->sending_server, 'country_code' => $country_code, 'exist_c_code' => true, ]); } } } } } } } else { if ($keyword->reply_text && $country) { $sendMessage = new EloquentCampaignRepository($campaign = new Campaigns()); $sendMessage->quickSend($campaign, [ 'sender_id' => $keyword->sender_id, 'sms_type' => 'plain', 'message' => $keyword->reply_text, 'recipient' => $phoneNumberObject->getNationalNumber(), 'user_id' => $user_id, 'sending_server' => $sending_servers->id, 'country_code' => $country_code, 'exist_c_code' => true, ]); } else { $failed .= 'Related keyword reply message not found.'; } } } } } } if (strtolower($message) == 'stop') { $blacklist = Blacklists::where('user_id', $user_id)->where('number', $to)->first(); if ( ! $blacklist) { Blacklists::create([ 'user_id' => $user_id, 'number' => $to, 'reason' => "Optout by User", ]); $chatbox_messages = ChatBox::where('user_id', $user_id)->where('to', $to)->cursor(); foreach ($chatbox_messages as $messages) { $check_delete = ChatBoxMessage::where('box_id', $messages->id)->delete(); if ($check_delete) { $messages->delete(); } } } } if ($failed == null) { return $success; } return $failed; } /** * twilio inbound sms * * @param Request $request * * @return Message|MessagingResponse * @throws NumberParseException * @throws Throwable */ public function inboundTwilio(Request $request): Message|MessagingResponse { $to = $request->input('From'); $from = $request->input('To'); $message = $request->input('Body'); if ($message == 'NULL') { $message = null; } $response = new MessagingResponse(); if ($to == null || $from == null) { $response->message('From and To value required'); return $response; } $feedback = 'Success'; $NumMedia = (int) $request->input('NumMedia'); if ($NumMedia > 0) { $cost = 1; for ($i = 0; $i < $NumMedia; $i++) { $mediaUrl = $request->input("MediaUrl$i"); $feedback = $this::inboundDLR($to, $message, 'Twilio', $cost, $from, $mediaUrl); } } else { $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); $feedback = $this::inboundDLR($to, $message, 'Twilio', $cost, $from); } if ($feedback == 'Success') { return $response; } return $response->message($feedback); } /** * TwilioCopilot inbound sms * * @param Request $request * * @return Message|MessagingResponse * @throws NumberParseException * @throws Throwable */ public function inboundTwilioCopilot(Request $request): Message|MessagingResponse { $to = $request->input('From'); $from = $request->input('To'); $message = $request->input('Body'); $extra = $request->input('MessagingServiceSid'); if ($message == 'NULL') { $message = null; } $response = new MessagingResponse(); if ($to == null || $from == null || $extra == null) { $response->message('From, To, and MessagingServiceSid value required'); return $response; } $feedback = 'Success'; $NumMedia = (int) $request->input('NumMedia'); if ($NumMedia > 0) { $cost = 1; for ($i = 0; $i < $NumMedia; $i++) { $mediaUrl = $request->input("MediaUrl$i"); $feedback = $this::inboundDLR($to, $message, 'TwilioCopilot', $cost, $from, $mediaUrl, $extra); } } else { $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); $feedback = $this::inboundDLR($to, $message, 'TwilioCopilot', $cost, $from, null, $extra); } if ($feedback == 'Success') { return $response; } return $response->message($feedback); } /** * text local inbound sms * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundTextLocal(Request $request): JsonResponse|string { $to = $request->input('sender'); $from = $request->input('inNumber'); $message = $request->input('content'); if ($to == null || $from == null || $message == null) { return 'Sender, inNumber and content value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'TextLocal', $cost, $from); } /** * inbound plivo messages * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundPlivo(Request $request): JsonResponse|string { $to = $request->input('From'); $from = $request->input('To'); $message = $request->input('Text'); if ($to == null || $message == null) { return 'Destination number and message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'Plivo', $cost, $from); } /** * inbound plivo powerpack messages * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundPlivoPowerPack(Request $request): JsonResponse|string { $to = $request->input('From'); $from = $request->input('To'); $message = $request->input('Text'); if ($to == null || $message == null) { return 'Destination number and message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'PlivoPowerpack', $cost, $from); } /** * inbound bulk sms messages * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundBulkSMS(Request $request): JsonResponse|string { $to = $request->input('msisdn'); $from = $request->input('sender'); $message = $request->input('message'); if ($to == null || $message == null) { return 'Destination number and message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'BulkSMS', $cost, $from); } /** * inbound Vonage messages * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundVonage(Request $request): JsonResponse|string { $to = $request->input('msisdn'); $from = $request->input('to'); $message = $request->input('text'); if ($to == null || $message == null) { return 'Destination number, Source number and message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'Vonage', $cost, $from); } /** * inbound messagebird messages * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundMessagebird(Request $request): JsonResponse|string { $to = $request->input('originator'); $from = $request->input('recipient'); $message = $request->input('body'); if ($to == null || $message == null) { return 'Destination number, Source number and message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'MessageBird', $cost, $from); } /** * inbound signalwire messages * * @param Request $request * * @return Message|MessagingResponse * @throws NumberParseException * @throws Throwable */ public function inboundSignalwire(Request $request): Message|MessagingResponse { $response = new MessagingResponse(); $to = $request->input('From'); $from = $request->input('To'); $message = $request->input('Body'); if ($to == null || $from == null || $message == null) { $response->message('From, To and Body value required'); return $response; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); $feedback = $this::inboundDLR($to, $message, 'SignalWire', $cost, $from); if ($feedback == 'Success') { return $response; } return $response->message($feedback); } /** * inbound telnyx messages * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundTelnyx(Request $request): JsonResponse|string { $get_data = $request->getContent(); $get_data = json_decode($get_data, true); if (isset($get_data) && is_array($get_data) && array_key_exists('data', $get_data) && array_key_exists('payload', $get_data['data'])) { if ($get_data['data']['event_type'] == 'message.received') { $to = $get_data['data']['payload']['from']['phone_number']; $from = $get_data['data']['payload']['to'][0]['phone_number']; $message = $get_data['data']['payload']['text']; if ($to == '' || $message == '' || $from == '') { return 'Destination or Sender number and message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'Telnyx', $cost, $from); } return 'Invalid request'; } return 'Invalid request'; } /** * inbound Teletopiasms messages * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundTeletopiasms(Request $request): JsonResponse|string { $to = $request->input('sender'); $from = $request->input('recipient'); $message = $request->input('text'); if ($to == null || $message == null) { return 'Destination number, Source number and message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'Teletopiasms', $cost, $from); } /** * receive FlowRoute message * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundFlowRoute(Request $request): JsonResponse|string { $data = json_decode($request->getContent(), true); if (isset($data) && is_array($data) && array_key_exists('data', $data)) { $to = $data['data']['attributes']['from']; $from = $data['data']['attributes']['to']; $message = $data['data']['attributes']['body']; if ($from == '' || $message == '' || $to == '') { return 'From, To and Body value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'FlowRoute', $cost, $from); } return 'valid data not found'; } /** * receive inboundEasySendSMS message * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundEasySendSMS(Request $request): JsonResponse|string { $to = $request->input('From'); $from = null; $message = $request->input('message'); if ($message == '' || $to == '') { return 'To and Message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'FlowRoute', $cost, $from); } /** * receive Skyetel message * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundSkyetel(Request $request): JsonResponse|string { $to = $request->input('from'); $from = $request->input('to'); $message = $request->input('text'); if ($to == '' || $from == '') { return 'To and From value required'; } if (isset($request->media) && is_array($request->media) && array_key_exists('1', $request->media)) { $mediaUrl = $request->media[1]; return $this::inboundDLR($to, $message, 'Skyetel', 1, $from, $mediaUrl); } else { $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'Skyetel', $cost, $from); } } /** * receive chat-api message * * @return JsonResponse|bool|string * @throws NumberParseException * @throws Throwable */ public function inboundChatApi(): JsonResponse|bool|string { $data = json_decode(file_get_contents('php://input'), true); foreach ($data['messages'] as $message) { $to = $message['author']; $from = $message['senderName']; $message = $message['body']; if ($message == '' || $to == '' || $from == '') { return 'Author, Sender Name and Body value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'WhatsAppChatApi', $cost, $from); } return true; } /** * callr delivery reports * * @param Request $request */ public function dlrCallr(Request $request) { $get_data = json_decode($request->getContent(), true); $message_id = $get_data['data']['user_data']; $status = $get_data['data']['status']; if ($status == 'RECEIVED' || $status == 'SENT') { $status = 'Delivered|' . $message_id; } $this::updateDLR($message_id, $status); } /** * receive callr message * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundCallr(Request $request): JsonResponse|string { $get_data = json_decode($request->getContent(), true); $to = str_replace('+', '', $get_data['data']['from']); $from = str_replace('+', '', $get_data['data']['to']); $message = $get_data['data']['text']; if ($message == '' || $to == '' || $from == '') { return 'From, To and Text value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'Callr', $cost, $from); } /** * cm com delivery reports * * @param Request $request * * @return mixed|string */ public function dlrCM(Request $request) { $get_data = json_decode($request->getContent(), true); if (is_array($get_data) && array_key_exists('messages', $get_data)) { $message_id = $get_data['messages']['msg']['reference']; $status = $get_data['messages']['msg']['status']['errorCode']; if ($status == 'delivered') { $status = 'Delivered|' . $message_id; } return $this::updateDLR($message_id, $status); } return 'Null Value Return'; } /** * receive cm com message * * @param Request $request * * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundCM(Request $request): JsonResponse|string { $get_data = json_decode($request->getContent(), true); $to = str_replace('+', '', $get_data['from']['number']); $from = str_replace('+', '', $get_data['to']['number']); $message = $get_data['message']['text']; if ($message == '' || $to == '' || $from == '') { return 'From, To and Text value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'CMCOM', $cost, $from); } /** * receive bandwidth message * * @param Request $request * * @return bool|JsonResponse|string|null * @throws NumberParseException * @throws Throwable */ public function inboundBandwidth(Request $request): bool|JsonResponse|string|null { $data = $request->all(); if (isset($data) && is_array($data) && count($data) > 0) { if ($data['0']['type'] == 'message-received') { if (isset($data[0]['message']) && is_array($data[0]['message'])) { $to = $data[0]['message']['from']; $from = $data[0]['to']; $message = $data[0]['message']['text']; if ($message == '' || $to == '' || $from == '') { return 'From, To and Text value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'Bandwidth', $cost, $from); } else { return $request->getContent(); } } else { return $request->getContent(); } } else { return $request->getContent(); } } /** * receive Solucoesdigitais message * * @param Request $request * * @return bool|false * @throws NumberParseException * @throws Throwable */ public function inboundSolucoesdigitais(Request $request): bool { $data = $request->all(); $id_campanha = $data['id_campanha']; $report = Reports::where('status', 'LIKE', "%{$id_campanha}%")->first(); $message = $data['sms_resposta']; $to = $data['nro_telefone']; $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); if ($report) { $from = $report->from; if ($message == '' || $to == '' || $from == '') { return 'From, To and Text value required'; } return $this::inboundDLR($to, $message, 'Solucoesdigitais', $cost, $from, null, null, $report->user_id); } return $this::inboundDLR($to, $message, 'Solucoesdigitais', $cost); } /** * receive inboundGatewayApi message * * @param Request $request * * @return bool|false * @throws NumberParseException * @throws Throwable */ public function inboundGatewayApi(Request $request): bool { $to = $request->input('msisdn'); $from = $request->input('receiver'); $message = $request->input('message'); if ($message == '' || $to == '') { return 'To and Message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'Gatewayapi', $cost, $from); } /** * @param Request $request * @return JsonResponse|string * @throws NumberParseException * @throws Throwable */ public function inboundInteliquent(Request $request) { $to = $request->input('to')[0]; $from = $request->from; $message = $request->text; if ($message == '' || $to == '' || $from == '') { return 'From, To and Message value required'; } $message_count = strlen(preg_replace('/\s+/', ' ', trim($message))) / 160; $cost = ceil($message_count); return $this::inboundDLR($to, $message, 'Inteliquent', $cost, $from); } }