Viewing file: InboundController.php (11.51 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Http\Controllers;
use App\Events\SendMail; use App\Models\Contact; use App\Models\CustomerNumber; use App\Models\Exception; use App\Models\Group; use App\Models\Keyword; use App\Models\Label; use App\Models\Message; use App\SmsProvider\SendSMS; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Textlocal; use Twilio\TwiML\MessagingResponse; use Vonage\Client\Credentials\Basic;
class InboundController extends Controller {
public function process($type, Request $request) { cache()->put('webhook', 'true'); try { $json = []; $requestData = []; if ($type == 'vonage') { $inbound = \Vonage\SMS\Webhook\Factory::createFromGlobals(); $requestData['vonage_message_id'] = $MessageSid = $inbound->getMessageId(); $requestData['from'] = $From = $inbound->getFrom(); $requestData['to'] = $To = $inbound->getTo(); $requestData['body'] = $Body = $inbound->getText(); } else if ($type == 'telnyx') { $json = json_decode(file_get_contents("php://input"), true); $From = $json["data"]["payload"]["from"]["phone_number"]; $To = $json["data"]["payload"]["to"][0]["phone_number"]; $Body = $json["data"]["payload"]["text"]; $event_type = $json['data']['event_type']; $requestData['from'] = $From; $requestData['to'] = $To; $requestData['body']=$Body;
if (isset($event_type) && $event_type != "message.received") { exit(); } }else if ($type == 'thinq') { $requestData['body']= $Body = $request->message; $requestData['from']= $From = "+1".str_replace('+1','',$request->from); $requestData['to']= $To = "+1".str_replace('+1','',$request->to); }else if($type == 'plivo'){ $requestData['from']= $From = $_REQUEST["From"]; $requestData['to']= $To = $_REQUEST["To"]; $requestData['body']= $Body = $_REQUEST["Text"]; }else if($type == 'message_bird'){ $requestData['from']= $From = $request->originator; $requestData['to']=$To = $request->recipient; $requestData['body']= $Body = $request->body; }else if($type == 'infobip'){ if (!isset($request->results["from"]) || !isset($request->results["to"]) || !isset($request->result["text"])){ Log::info('Invalid data'); exit(); } $requestData['from']= $From = $request->results["from"]; $requestData['to']=$To = $request->results["to"]; $requestData['body']= $Body = $request->result["text"]; } else { $requestData['from'] = $From = "+".str_replace('+','',$request["From"]); $requestData['to'] = $To = "+".str_replace('+','',$request["To"]); $requestData['body'] = $Body = $request["Text"]; }
$this->inboundMessage($type, $From, $To, $Body, $requestData); } catch (\Exception $ex) { Log::error($ex->getMessage()); }
}
function sendForwardMessage($smsQueue) { try { $sendSMS = new SendSMS(); $sendSMS->setMessage($smsQueue) ->process();
} catch (\Exception $ex) { Log::error("forward message error"); } }
public function gatewayStatus(Request $request) {
$sms_gateway_data = [ 'message_sent_date' => $request->sent_date, 'part_number' => $request->part_number, 'message_cost' => $request->message_cost, 'message_status' => $request->message_status, 'dlr_date' => $request->dlr_date, ]; try { if ($request->message_id && $request->status) { $queue = Message::where('sms_gateway_message_id', $request->message_id)->first(); $queue->sms_gateway_status = $request->status; $queue->sms_gateway_value = json_encode($sms_gateway_data); $queue->save(); } } catch (\Exception $ex) { Log::error($ex->getMessage()); } return response()->json([], 200);
}
function trigger_webhook($customer_number, $webhookData) { if (isset($customer_number) && isset($customer_number->webhook_url) && isset($customer_number->webhook_method) && $customer_number->webhook_method == 'post') { $client = new \GuzzleHttp\Client(['verify' => false]); $client->post($customer_number->webhook_url, [ 'form_params' => $webhookData ]);
} else if (isset($customer_number) && isset($customer_number->webhook_url) && isset($customer_number->webhook_method) && $customer_number->webhook_method == 'get') { $client = new \GuzzleHttp\Client(['verify' => false]); $client->get($customer_number->webhook_url, [ 'query' => $webhookData ]); } }
public function webhookDeliver(Request $request) {
try { $json = json_decode(file_get_contents("php://input"), true);
if (isset($json["data"]) && isset($json["data"]["id"])) { $responseCode = isset($json["data"]["errors"]) && isset($json["data"]["errors"][0]) && isset($json["data"]["errors"][0]["code"]) ? $json["data"]["errors"][0]["code"] : null; $messageQueue = Message::where('response_id', $json["data"]["id"])->firstOrFail(); $messageLog = MessageLog::where('response_id', $json["data"]["id"])->firstOrFail(); if ($responseCode) { $messageQueue->response_code = $responseCode; $messageLog->update(['response_code' => $responseCode]); } else { $messageQueue->delivered_at = now(); } $messageQueue->save();
if (isset($json["data"]["errors"])) { $messageLog->update(['status' => 'failed']); $messageQueue->update(['status' => 'failed']); } } return response()->json(['status' => 'success']); } catch (\Exception $ex) { Log::info($ex->getMessage()); return response()->json(['status' => 'failed']); } }
public function checkKeyword($from, $body, $customer_number) { try { $contact = Contact::where('number', $from) ->orWhere('number', str_replace('+', '', $from)) ->orWhere('number', '+' . str_replace('+', '', $from)) ->first(); $label = Label::where('customer_id', $customer_number->customer_id)->where('title', 'new')->first(); if (!$label) { $label = new Label(); $label->title = 'new'; $label->status = 'active'; $label->customer_id = $customer_number->customer_id; $label->color = 'red'; $label->save(); } if (!$contact) { $contact = new Contact(); $contact->customer_id = $customer_number->customer_id; $contact->number = $from; $contact->label_id = $label->id; $contact->save(); } $keyword = null;
if ($customer_number) { $keyword = Keyword::where(DB::raw('lower(word)'), 'like', '%' . strtolower($body) . '%')->where('customer_number_id', $customer_number->id)->first(); }
if ($keyword && isset($keyword->type) && $keyword->type == 'opt_out') { $exception = new Exception(); $exception->customer_id=$contact->customer_id; $exception->number=$contact->number; $exception->save(); exit; } else if ($keyword && isset($keyword->type) && $keyword->type == 'opt_in') { $group=Group::where('customer_id', $contact->customer_id)->where('id', $keyword->group_id)->first(); $contact->update(['keyword_id'=>$keyword->id]); if ($group) { $existingContact = $group->contacts->where('contact_id', $contact->id)->first(); if (!$existingContact) { $group->contacts()->create(['contact_id' => $contact->id, 'customer_id' => $contact->customer_id, 'group_id' => $group->id]); } } exit(); } return; } catch (\Exception $exception) { Log::error($exception->getMessage()); return; } }
function inboundMessage($type, $From, $To, $Body, $requestData = null) {
$customer_number = CustomerNumber::where('number', $To) ->orWhere('number', str_replace('+', '', $To)) ->orWhere('number', '+' . str_replace('+', '', $To)) ->first(); if (!$customer_number) { Log::info("not found in customer number"); echo '<?xml version="1.0" encoding="UTF-8"?> <Response> </Response>'; exit(); }
$this->checkKeyword($From, $Body, $customer_number);
$customer = $customer_number->customer;
$gateway=$customer->gateways()->where('id', $customer_number->dynamic_gateway_id)->first();
if(!$gateway){ Log::info("Gateway not found. Invalid request"); exit(); }
$smsQueue= $customer->messages()->create([ 'from' => $From, 'to' => $To, 'body' => $Body, 'created_at' => now(), 'updated_at' => now(), 'type' => 'inbox', 'status' => 'succeed', 'dynamic_gateway_id' => $gateway->id, ]);
if ($customer_number->forward_to) { $this->sendForwardMessage($smsQueue); } if ($customer_number->webhook_url) { $requestData['webhook_url']=url()->current(); $this->trigger_webhook($customer_number, $requestData); }
if (isset($customer) && isset($customer->email)) { $notification = $customer->settings()->where('name', 'email_notification')->first(); if (isset($notification->value) && $notification->value == 'true' && $Body) { SendMail::dispatch($customer->email, 'You have got a sms from '.$From, $Body); } }
$this->generateResponse($type); // NB: If you are adding new sms gateway make sure you return response based on type
}
public function plivoWebhook($message_id, Request $request) {
}
public function generateResponse($type) { if ($type == 'signalwire') { echo '<?xml version="1.0" encoding="UTF-8"?> <Response> </Response>'; } else if ($type == 'twilio') { $resp = new MessagingResponse(); echo $resp; } else if ($type == 'telnyx') { echo '<?xml version="1.0" encoding="UTF-8"?> <Response> </Response>'; } else if ($type == 'plivo') { echo '<?xml version="1.0" encoding="UTF-8"?> <Response> </Response>'; } } }
|