composer require altiria/sms-php-client
Ejemplos de programación en PHP para integrar el envío de SMS.
Utiliza la API de Altiria 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.
Tiempo de integración: 15 minutos.
La forma más sencilla es utilizar el paquete de Composer de Altiria. Los pasos son:
Proporcionamos unos mensajes gratuitos para que puedas probar el funcionamiento con una cuenta de prueba.
composer require altiria/sms-php-client
Puedes encontrarlo en la página de GitHub del proyecto.
Introduce tu usuario y contraseña en el constructor de la clase AltiriaClient.
Recoge el número de teléfono y el texto del mensaje de tu aplicación y pásalos como parámetros para enviar el SMS. Estos campos normalmente están en una base de datos mySQL o algún campo de un formulario 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.
El paquete de Composer se instala con la siguiente instrucción
composer require altiria/sms-php-client
El código PHP necesario para enviar SMS quedaría así.
use \AltiriaSmsPhpClient\AltiriaClient; use \AltiriaSmsPhpClient\AltiriaModelTextMessage; use \AltiriaSmsPhpClient\Exception\GeneralAltiriaException; try { //Personaliza las credenciales de acceso $client = new AltiriaClient('user@mydomain.com', 'mypassword'); $textMessage = new AltiriaModelTextMessage('346XXXXXXXX', 'Mensaje de prueba'); $client-> sendSms($textMessage); echo '¡Mensaje enviado!'; } catch (GeneralAltiriaException $exception) { echo 'Mensaje no aceptado:'.$exception->getMessage(); }
Para que funcione es necesario proporcionar al constructor de la clase el usuario y contraseña de la cuenta de Altiria.
Descarga
Guía para la integración de SMS API
Lista de tareas detallada, checklist, para asegurarte que no se olvida nada importante en la integración de API SMS. Independiente del lenguaje de programación elegido.
Los usos del envío de SMS en un código PHP puede ser:
Sin cuotas de alta
Sin cuotas de mantenimiento
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:
<?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 (AltiriaSMS) para hacer el envío de SMS con PHP. 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.
En el caso de que no se pueda utilizar Composer ni la librería curl php, siempre es posible abrir un socket para realizar la conexión con el servidor de Altiria y enviar el SMS.
El código sería el siguiente
<?php // 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 // 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 .='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<br />\n"; $output .= "Compruebe que ha configurado correctamente la direccion/url "; $output .= "suministrada por altiria<br>"; 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: <br>".$buf."<br>"; } //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)."<br />\n"; $output .= "Compruebe que ha configurado correctamente la direccion/url "; $output .= "suministrada por Altiria<br>"; return $output; } //Se comprueba la respuesta de Altiria if (strstr($buf,"ERROR")){ $output = $buf."<br />\n"; $output .= " Ha ocurrido algun error. Compruebe la especificacion<br>"; return $output; } else { $output = $buf."<br />\n"; $output .= " Exito<br>"; 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; ?>
La API SMS se puede utilizar con los siguientes protocolos de comunicación:
Descubre las funcionalidades avanzadas de Altiria para el envío de SMS
Confirmación de entrega
Remitente personalizado
Estadísticas
Programación de envíos
SMS largos, más de 160 caracteres
Editor de landing
Unicode. Acentos y otros alfabetos
Elimina teléfonos duplicados
Textos personalizados
Plantillas de mensajes
Recordatorio de citas