Enviar SMS PHPSMS php. Mandar SMS con php

SMS masivo desde 2002

Utiliza nuestra pasarela para enviar SMS con php fácilmente. Aprovecha los ejemplos de código que te proporcionamos más abajo para utilizar el servicio php sms gateway.

PHP SMS: Si programas habitualmente con PHP puedes enviar SMS desde tus desarrollos para confirmar a los clientes una compra, mandar una clave de activación, mandar alertas de funcionamiento o errores en el servicio, o para mandar un SMS a los usuarios registrados en la web con la última oferta.

Consulta nuestra documentación técnica para mandar SMS (API SMS) y comprobarás por qué somos la mejor plataforma de SMS y el mejor socio que puedes encontrar para enviar SMS desde tus desarrollos en php.

A continuación se presentan dos ejemplos de código para el envío de SMS con php. En el primero se utiliza curl y se encapsula la funcionalidad de envío en una clase que se puede instanciar desde otros archivos php. En el segundo ejemplo se utiliza directamente un socket para efectuar la petición http.

El código y las librerías utilizadas, más otros ejemplos en otros lenguajes de programación, se pueden descargar aquí. Si quieres conocer todos los detalles, consulta la especificación técnica.

Ejemplo de envío de SMS con php con clases y curl

// Copyright (c) 2018, Altiria TIC SL
// All rights reserved.
// El uso de este código de ejemplo es solamente para mostrar el uso de la pasarela de envío de SMS de Altiria
// Para un uso personalizado del código, es necesario consultar la API de especificaciones técnicas, donde también podrás encontrar
// más ejemplos de programación en otros lenguajes y otros protocolos (http, REST, web services)
// https://www.altiria.com/api-envio-sms/

class AltiriaSMS {
	
	public $url;
	public $domainId;
	public $login;
	public $password;
	public $debug;

	public function getUrl() {
		return $this->url;
	}

	public function setUrl($val) {
		$this->url = $val;
		return $this;
	}
	public function getDomainId() {
		return $this->domain;
	}

	public function setDomainId($val) {
		$this->domain = $val;
		return $this;
	}
	public function getLogin() {
		return $this->login;
	}

	public function setLogin($val) {
		$this->login = $val;
		return $this;
	}
	public function getPassword() {
		return $this->password;
	}

	public function setPassword($val) {
		$this->password = $val;
		return $this;
	}
	public function getDebug() {
		return $this->debug;
	}

	public function setDebug($val) {
		$this->debug = $val;
		return $this;
	}

	public function sendSMS($destination, $message, $senderId=null) {

		$return=false;

		// Set the curl parameters.
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $this->getUrl());
		curl_setopt($ch, CURLOPT_VERBOSE, 1);
		
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded; charset=UTF-8'));
		curl_setopt($ch, CURLOPT_HEADER, false);
		// Max timeout in seconds to complete http request	
		curl_setopt($ch, CURLOPT_TIMEOUT, 60);

		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_POST, 1);


		 $COMANDO='cmd=sendsms&domainId='.$this->getDomainId().'&login='.$this->getLogin().'&passwd='.$this->getPassword();
		 $COMANDO.='&msg='.urlencode($message);

		//Como destinatarios se admite un array de teléfonos, una cadena de teléfonos separados por comas o un único teléfono
		if (is_array($destination)){
			foreach ($destination as $telefono) {
				$this->logMsg("Add destination ".$telefono);
				$COMANDO.='&dest='.$telefono;
			}
		}
		else{
			if( strpos($destination, ',') !== false ){
				$destinationTmp= '&dest='.str_replace(',','&dest=',$destination).'&';
				$COMANDO .=$destinationTmp;
				$this->logMsg("Add destination ".$destinationTmp);
			 }
			 else{
				$COMANDO.='&dest='.$destination;

			 }
		}

		//No es posible utilizar el remitente en América pero sí en España y Europa
		if (!isset($senderId) || empty($senderId)) {
			$this->logMsg("NO senderId ");
		}
		else{				
			$COMANDO.='&senderId='.$senderId;
			$this->logMsg("Add senderId ".$senderId);
		}


		// Set the request as a POST FIELD for curl.
		curl_setopt($ch, CURLOPT_POSTFIELDS, $COMANDO);

		// Get response from the server.
		$httpResponse = curl_exec($ch);


		if(curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200){
			$this->logMsg("Server Altiria response: ".$httpResponse);

			if (strstr($httpResponse,"ERROR errNum")){
				$this->logMsg("Error sending SMS: ".$httpResponse);
				return false;
			}
			else
				$return = $httpResponse;
		}
		else{
			$this->logMsg("Error sending SMS: ".curl_error($ch).'('.curl_errno($ch).')'.$httpResponse);

			$return = false;
		}

		curl_close($ch);
		return $return;
	}


	public static function getCredit() {
		$return=false;
		// Set the curl parameters.
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $this->getUrl());
		curl_setopt($ch, CURLOPT_VERBOSE, 1);
		
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded; charset=UTF-8'));
		curl_setopt($ch, CURLOPT_HEADER, false);
		// Max timeout in seconds to complete http request
		curl_setopt($ch, CURLOPT_TIMEOUT, 60);

		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_POST, 1);



		$COMANDO='cmd=getcredit&domainId='.$this->getDomainId().'&login='.$this->getLogin().'&passwd='.$this->getPassword();
		

		// Set the request as a POST FIELD for curl.
		curl_setopt($ch, CURLOPT_POSTFIELDS, $COMANDO);

		// Get response from the server.
		$httpResponse = curl_exec($ch);


		if(curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200){
			$this->logMsg("Server Altiria response: ".$httpResponse);

			if (strstr($httpResponse,"ERROR errNum")){
				$this->logMsg("Error asking SMS credit: ".$httpResponse);
				$return = false;
			}
			else
				$return = $httpResponse;
		}
		else{
			$this->logMsg("Error asking SMS credit: ".curl_error($ch).'('.curl_errno($ch).')'.$httpResponse);

			$return = false;
		}

		curl_close($ch);
		return $return;
	}

	public function logMsg($msg) {
		if ($this->getDebug()===true)
			error_log("\n".date(DATE_RFC2822)." : ".$msg."\r\n", 3, "app.log");
	}

}

 

A continuación se muestra un ejemplo en el que se utiliza la clase anterior (AltiriaSMS) para hacer el envío. Esta clase tiene que estar incluida en el archivo httpPHPAltiria.php que es el que se está instanciando en el ejemplo.

 

// Copyright (c) 2018, Altiria TIC SL
// All rights reserved.
// El uso de este código de ejemplo es solamente para mostrar el uso de la pasarela de envío de SMS de Altiria
// Para un uso personalizado del código, es necesario consultar la API de especificaciones técnicas, donde también podrás encontrar
// más ejemplos de programación en otros lenguajes y otros protocolos (http, REST, web services)
// https://www.altiria.com/api-envio-sms/

// XX, YY y ZZ se corresponden con los valores de identificacion del
// usuario en el sistema.
include('httpPHPAltiria.php');

$altiriaSMS = new AltiriaSMS();
$altiriaSMS->setUrl("http://www.altiria.net/api/http");
$altiriaSMS->setDomainId('XX');
$altiriaSMS->setLogin('YY');
$altiriaSMS->setPassword('ZZ');

$altiriaSMS->setDebug(true);

//$sDestination = '346xxxxxxxx';
$sDestination = '346xxxxxxxx,346yyyyyyyy';
//$sDestination = array('346xxxxxxxx','346yyyyyyyy');

//No es posible utilizar el remitente en América pero sí en España y Europa
$response = $altiriaSMS->sendSMS($sDestination, "Mensaje de prueba");
//Utilizar esta llamada solo si se cuenta con un remitente autorizado por Altiria
//$response = $altiriaSMS->sendSMS($sDestination, "Mensaje de prueba", "remitente");

if (!$response)
  echo "El envío ha terminado en error";
else
  echo $response;

Ejemplo de envío de SMS con php y sockets

Si en el servidor desde donde se está ejecutando el código no está disponible curl, siempre es posible abrir directamente una conexión con el servidor de altiria mediante sockets para enviar los datos del SMS y los teléfonos destinatarios.

// Copyright (c) 2018, Altiria TIC SL
// All rights reserved.
// El uso de este código de ejemplo es solamente para mostrar el uso de la pasarela de envío de SMS de Altiria
// Para un uso personalizado del código, es necesario consultar la API de especificaciones técnicas, donde también podrás encontrar
// más ejemplos de programación en otros lenguajes y otros protocolos (http, REST, web services)
// https://www.altiria.com/api-envio-sms/

// sDestination: lista de numeros de telefono separados por comas.
// Cada numero debe comenzar por el prefijo internacional de pais.
// sMessage: hasta 160 caracteres
// debug: Si es true muestra por pantalla la respuesta completa del servidor
// sSenderId: no es posible utilizar el remitente en América pero sí en España y Europa
// XX, YY y ZZ se corresponden con los valores de identificacion del
// usuario en el sistema.
function AltiriaSMS($sDestination, $sMessage, $debug, $sSenderId){

 $sData ='cmd=sendsms&';
 $sData .='domainId=XX&';
 $sData .='login=YY&';
 $sData .='passwd=ZZ&';
 //No es posible utilizar el remitente en América pero sí en España y Europa
 $sData .='senderId='.$sSenderId.'&';
 $sData .='dest='.str_replace(',','&dest=',$sDestination).'&';
 $sData .='msg='.urlencode(utf8_encode(substr($sMessage,0,160)));

 //Tiempo máximo de espera para conectar con el servidor = 5 seg
 $timeOut = 5; 
 $fp = fsockopen('www.altiria.net', 80, $errno, $errstr, $timeOut);
 if (!$fp) {
  //Error de conexion o tiempo maximo de conexion rebasado
  $output = "ERROR de conexion: $errno - $errstr
\n";
  $output .= "Compruebe que ha configurado correctamente la direccion/url ";
  $output .= "suministrada por altiria
";
  return $output;
 } else {
  $buf = "POST /api/http HTTP/1.0\r\n";
  $buf .= "Host: www.altiria.net\r\n";
  $buf .= "Content-type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
  $buf .= "Content-length: ".strlen($sData)."\r\n";
  $buf .= "\r\n";
  $buf .= $sData;
  fputs($fp, $buf);
  $buf = "";

  //Tiempo máximo de espera de respuesta del servidor = 60 seg
  $responseTimeOut = 60;
  stream_set_timeout($fp,$responseTimeOut);
  stream_set_blocking ($fp, true);
  if (!feof($fp)){
   if (($buf=fgets($fp,128))===false){
    // TimeOut?
    $info = stream_get_meta_data($fp);
    if ($info['timed_out']){
     $output = 'ERROR Tiempo de respuesta agotado';
     return $output;
    } else {
     $output = 'ERROR de respuesta';
     return $output;
    }
   } else{
    while(!feof($fp)){
     $buf.=fgets($fp,128);
    }
   }
  } else {
   $output = 'ERROR de respuesta';
   return $output;
  }

  fclose($fp);
  
  //Si la llamada se hace con debug, se muestra la respuesta completa del servidor
  if ($debug){
   print "Respuesta del servidor: 
".$buf."
";
  }
  
  //Se comprueba que se ha conectado realmente con el servidor
  //y que se obtenga un codigo HTTP OK 200 
  if (strpos($buf,"HTTP/1.1 200 OK") === false){
   $output = "ERROR. Codigo error HTTP: ".substr($buf,9,3)."
\n";
   $output .= "Compruebe que ha configurado correctamente la direccion/url ";
   $output .= "suministrada por Altiria
";
   return $output;
  }
  //Se comprueba la respuesta de Altiria
  if (strstr($buf,"ERROR")){
   $output = $buf."
\n";
   $output .= " Ha ocurrido algun error. Compruebe la especificacion
";
   return $output;
  } else {
   $output = $buf."
\n";
   $output .= " Exito
";
   return $output; 
  }     
 }
}

//No es posible utilizar el remitente en América pero sí en España y Europa
$resp= AltiriaSMS("346xxxxxxxx,346yyyyyyyy", "Mensaje de prueba", false, "");
//Utilizar esta llamada solo si se cuenta con un remitente autorizado por Altiria
//$resp= AltiriaSMS("346xxxxxxxx,346yyyyyyyy", "Mensaje de prueba", false, "remitente");
echo $resp;

En el ejemplo anterior se está enviando un SMS de prueba a dos teléfonos de España, 346xxxxxxxx y 346yyyyyyyy, que deberán ser sustituidos por los teléfonos con los que se quieraa probar, siempre incluyendo el prefijo internacional.

Características adicionales para mandar SMS con PHP

  • Remitente personalizado: Personalización en el envío de SMS por PHP del remitente de origen por una cadena de texto, por ejemplo, el nombre de su empresa. (*)
  • Confirmación de entrega: Conozca la fecha y hora en la que se ha recibido el SMS enviado o las causas por las que no se ha recibido. (*)
  • Sistema avanzado de control de crédito con aviso automático por email que impide quedarse sin crédito de envío de forma inesperada.
  • Informes automáticos de envío de SMS en PHP y confirmación de entrega, permiten mantener un control periódico de los envíos realizados.
  • Posiblidad de reenvío de SMS pendientes por falta de crédito. Si realizó un envío de SMS mediante PHP y no tenía crédito, los mensajes se quedan encolados en nuestros sistemas hasta que disponga de crédito, de forma que no necesita repetir el envío.

(*) La disponibilidad de la confirmación de entrega al usuario y del remitente personalizado depende de cada país, consúltenos para su país de interés.