HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/teamdemo.sports-crowd.com/app/Services/WhatsAppService.php
<?php

namespace App\Services;

use App\IntegrationProvider;
use Illuminate\Support\Facades\Http;

class WhatsAppService
{
    protected $token;
    protected $phoneId;
    protected $url;
    const GREETING_TEMPLATE = 'saludo';
    const FAREWELL_TEMPLATE = 'despedir';
    const LANGUAGE_DEFAULT = 'es_MX';

    public function __construct()
    {
        $provider = IntegrationProvider::where('alias', 'whatsapp-api')
            ->where('active', 1)
            ->first();

        if (!$provider) {
            throw new \Exception("No hay configuración activa para WhatsApp (whatsapp-api).");
        }

        $this->token = $provider->token;
        $this->phoneId = $provider->nit;
        $this->url = $provider->endpoint;
    }

    public function greeting($to)
    {
        $template = self::GREETING_TEMPLATE;
        $language = self::LANGUAGE_DEFAULT;
        $response = Http::withToken($this->token)->post(
            "{$this->url}/{$this->phoneId}/messages",
            [
                "messaging_product" => "whatsapp",
                "to"                => $to,
                "type"              => "template",
                "template"          => [
                    "name"          => $template,
                    "language"      => ["code" => $language],
                    "components"    => []
                ]
            ]
        );

        return $response->json();
    }

    public function uploadFile($filePath)
    {
        $response = Http::withToken($this->token)
            ->attach('file', file_get_contents($filePath), basename($filePath))
            ->post(
                "{$this->url}/{$this->phoneId}/media",
                [
                    "messaging_product" => "whatsapp",
                    "type"              => mime_content_type($filePath),
                ]
            );

        return $response->json();
    }

    public function validateFile($fileId)
    {
        $response = Http::withToken($this->token)->get(
            "{$this->url}/{$fileId}"
        );

        return $response->json();
    }

    public function sendFile($to, $fileId, $documentName)
    {
        $response = Http::withToken($this->token)->post(
            "{$this->url}/{$this->phoneId}/messages",
            [
                "messaging_product" => "whatsapp",
                "to"                => $to,
                "type"              => "document",
                "document"          => [
                    "id"            => $fileId,
                    "filename"      => $documentName,
                    "caption"       => "Aquí están tus entradas"
                ]
            ]
        );

        return $response->json();
    }

    public function farewell($to, $params = [])
    {
        $template = self::FAREWELL_TEMPLATE;
        $language = self::LANGUAGE_DEFAULT;
        $response = Http::withToken($this->token)->post(
            "{$this->url}/{$this->phoneId}/messages",
            [
                "messaging_product" => "whatsapp",
                "to"                => $to,
                "type"              => "template",
                "template"          => [
                    "name"          => $template,
                    "language"      => ["code" => $language],
                    "components"    => [
                        [
                            "type" => "body",
                            "parameters" => array_map(fn($param) => [
                                "type" => "text",
                                "text" => $param
                            ], $params)
                        ]
                    ]
                ]
            ]
        );

        return $response->json();
    }

    public function sendPublicDocument($to, $link)
    {
        $response = Http::withToken($this->token)->post(
            "{$this->url}/{$this->phoneId}/messages",
            [
                "messaging_product" => "whatsapp",
                "to"                => $to,
                "type"              => "document",
                "document"          => [
                    "link"          => $link,
                    "filename"      => "Boletas.pdf"
                ]
            ]
        );

        return $response->json();
    }

    public function sendMessageDocument($to, $link, $template = 'saludo_pedido', $language = self::LANGUAGE_DEFAULT)
    {
        $response = Http::withToken($this->token)->post(
            "{$this->url}/{$this->phoneId}/messages",
            [
                "messaging_product" => "whatsapp",
                "to"                => $to,
                "type"              => "template",
                "template"          => [
                    "name"          => $template,
                    "language"      => ["code" => $language],
                    "components"    => [
                        [
                            "type" => "header",
                            "parameters" => [
                                [
                                    "type" => "document",
                                    "document" => [
                                        "link" => $link,
                                        "filename" => "Boletas.pdf"
                                    ]
                                ]
                            ]
                        ],
                    ]
                ]
            ]
        );

        return $response->json();
    }
}