Cómo enviar SMS con php

SMS masivo desde 2002

Utiliza nuestra pasarela para enviar SMS con php fácilmente. ¿Quieres enviar SMS desde PHP directamente con tu software, aplicación, página web, CRM, ERP…? Aprovecha los ejemplos de código que te proporcionamos para conectar con la API SMS.

¿Qué pasos son necesarios?

Tiempo necesario: 15 minutos.

Los pasos para enviar SMS con PHP son:

  1. Crea una cuenta de prueba con Altiria.

    Proporcionamos unos mensajes gratuitos para que puedas probar el funcionamiento con una cuenta de prueba.

  2. Descarga la documentación técnica

    La documentación técnica es necesaria para utilizarla como referencia en el desarrollo. Puedes encontrarla en SMS API.

  3. Descarga el código fuente de ejemplo

    Revisa el código fuente de ejemplo que puedes encontrar más abajo en este artículo. También lo encontrarás en las especificaciones o dentro del archivo con todos los códigos de ejemplo en SMS API.

  4. Configura el código fuente para usar la cuenta de prueba

    Personaliza el código fuente con las credenciales de la cuenta de prueba recién creada.

  5. Modifica el código fuente para el destinatario y el texto del mensaje

    Recoge el número de teléfono y el texto del mensaje de tu aplicación para hacer la llamada a la API para el envío de SMS. Estos campos normalmente están en una base de datos mySQL o algún campo de un formulario web.

  6. Ejecuta el código PHP en un servidor web

    Envía la petición al servidor de Altiria y recibe el SMS de prueba en tu propio teléfono móvil con el texto enviado. Hazlo antes de subir el desarrollo a producción

¿Por qué enviar SMS desde PHP?

Los usos del envío de SMS en un código PHP puede ser: confirmar a los clientes una compra, mandar una clave de activación, alertas de funcionamiento o errores en el servicio, o para enviar un SMS a los usuarios registrados en la web con la última oferta.

Algunas empresas que confían en Altiria
Citibank logoCruz Roja logoAcens logoMedicos sin Fronteras logoOccitane en Provence logo
El Corte Inglés Viajes logoLoterias y Apuestas del Estado logoSanitas logoBalearia logoEurope Assistance logo

¿Qué metodos de envío se pueden utilizar?

El método de envío más sencillo es a través de una conexión HTTP con el servidor de Altiria. Esta conexión HTTP se puede establecer de dos maneras:

  • Con la librería curl php. El uso de la librería facilita el desarrollo y hace más sencillo la configuración de los parámetros de conexión.
  • Abriendo directamente un socket para efectuar la petición http. Sólo lo recomendamos en los casos en que el servidor web no tenga instalada la librería curl.

También ofrecemos ejemplos de programación de envío de SMS con web services SOAP y Rest Json SMS. Para personas sin conocimientos técnicos ofrecemos el envío de SMS via web o la conversión de un correo electrónico en un SMS.

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

<?php
// Copyright (c) 2020, 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 {
	
	protected $domainId;
	protected $login;
	protected $password;
	protected $senderId;
	protected $encoding;
	protected $concat;
	protected $timeout=60;
	protected $debug;

	protected $url = 'http://www.altiria.net/api/http';

	public function getDomainId() {
		return $this->domainId;
	}

	public function setDomainId($val) {
		$this->domainId = $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 getSenderId() {
		return $this->senderId;
	}

	public function setSenderId($val) {
		$this->senderId = $val;
		return $this;
	}
	public function getEncoding() {
		return $this->encoding;
	}

	public function setEncoding($val) {
		$this->encoding = $val;
		return $this;
	}
	public function getConcat() {
		return $this->concat;
	}

	public function setConcat($val) {
		$this->concat = $val;
		return $this;
	}

	public function getTimeout() {
		return $this->timeout;
	}

	public function setTimeout($val) {
		$this->timeout = $val;
		return $this;
	}	

	public function getDebug() {
		return $this->debug;
	}

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

	public function sendSMS($destination, $message) {

		$return=false;

		// Set the curl parameters.
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $this->url);
		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, $this->getTimeout());

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


		 $COMANDO='cmd=sendsms&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;

			 }
		}
		//domainId solo es necesario si el login no es un email
		$domainId=$this->getDomainId();
		if (!isset($domainId) || empty($domainId)) {
			$this->logMsg("NO domainId");
		}
		else{				
			$COMANDO.='&domainId='.$this->getDomainId();
			$this->logMsg("Add domainId ".$this->getDomainId());
		}

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

		//Concat. Valores posibles true. Si no se especifica o es false, no se envía
		$concat=$this->getConcat();
		if (!isset($concat) || empty($concat) || $concat===false) {
			$this->logMsg("NO concat ");
		}
		else{				
			$COMANDO.='&concat=true';
			$this->logMsg("Add concat true");
		}

		//No es posible utilizar el remitente en América pero sí en España y Europa
		$encoding=$this->getEncoding();
		if (!isset($encoding) || empty($encoding)) {
			$this->logMsg("NO encoding");
		}
		else{
			if ($encoding==='unicode'){
				$COMANDO.='&encoding='.$encoding;
				$this->logMsg("Add encoding ".$encoding);				
			}
			else{
				$this->logMsg("Ignoring encoding. Encoding has no allowed value: ".$encoding);				
			}
		}


		// 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 function getCredit() {
		$return=false;
		// Set the curl parameters.
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $this->url);
		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&login='.$this->getLogin().'&passwd='.$this->getPassword();

		//domainId solo es necesario si el login no es un email
		$domainId=$this->getDomainId();
		$this->logMsg('Dominio: '.$domainId.'.');
		if (!isset($domainId) || empty($domainId)) {
			$this->logMsg("NO domainId");
		}
		else{				
			$COMANDO.='&domainId='.$this->getDomainId();
			$this->logMsg("Add domainId ".$this->getDomainId());
		}
		

		// 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){
		    echo(date(DATE_RFC2822)." : ".$msg."</br>");
		    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.

<?php
// Copyright (c) 2020, 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->setLogin('YY');
$altiriaSMS->setPassword('ZZ');

$altiriaSMS->setDebug(true);

//Use this ONLY with Sender allowed by altiria sales team
//$altiriaSMS->setSenderId('TestAltiria');
//Concatenate messages. If message length is more than 160 characters. It will consume as many credits as the number of messages needed
//$altiriaSMS->setConcat(true);
//Use unicode encoding (only value allowed). Can send áéíóú but message length reduced to 70 characters
//$altiriaSMS->setEncoding('unicode');

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

$response = $altiriaSMS->sendSMS($sDestination, "Mensaje de prueba");

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

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 quiera probar, siempre incluyendo el prefijo internacional.

Otros protocolos de envío de SMS

API SMS REST Json

API SMS REST Json

Pasarela de envío de SMS mediante Web Services REST Json


Web Services SOAP SMS

Web Services SOAP SMS

Pasarela SMS mediante servicios web SOAP


Web de envío SMS

Web de envío SMS

Además de la integración del envío de SMS en su aplicativo, Altiria ofrece un panel de control web en que podrás consultar las estadísticas de envío y descargar informes con el estado de los envíos y la confirmación de entrega.


Mail2SMS: enviar SMS por email

Mail2SMS: enviar SMS por email

Pasarela de envío de SMS masivos por email.


Marketing SMS

Marketing SMS

Además del propio envío de SMS, Altiria te ofrece sugerencias para que tus envíos de SMS sean más efectivos.

Envío de landing web móvil parametrizada

Además del envío de un SMS, la pasarela SMS gateway de Altiria te ofrece la posibilidad de enviar una página web móvil, SMS landing, con información adicional sin las restricciones de espacio de un SMS o con un formulario de contacto para recibir respuesta de tus clientes por SMS o usuarios o enviarles encuestas por SMS, formularios de satisfacción o firma de contratos.

Además de poder parametrizar el texto del mensaje SMS, Altiria también te permite enviar parámetros adicionales  en la petición de envío para parametrizar el contenido de la web y que tus usuarios y clientes reciban un servicio personalizado.

Cobertura internacional

Siempre se debe usar el formato de numeración internacional, incluyendo el código de país. Por ejemplo, para un número de móvil de España sería 346XXXXXXXX. En el ejemplo de código 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 quiera probar, siempre incluyendo el prefijo internacional. Ofrecemos la mejor cobertura internacional con conexiones directas de máxima calidad.

Características adicionales para enviar 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.