Spanish Enviar notificaciones Push utilizando Google

cuellar

Member
Licensed User
Longtime User
Estás usando debug key o private sing key?
 

cuellar

Member
Licensed User
Longtime User
Ah, espera...es que no tienes registro.php en tu servidor
 

desof

Well-Known Member
Licensed User
Longtime User
Ah, espera...es que no tienes registro.php en tu servidor

Solo he subido serverPush.php a mi servidor con el contenido que detallo abajo:

B4X:
<?php
/**
*    Google Cloud Messenger
*    Ejemplo de HTTP POST REQUEST
*    Extraido de la documentacion de google: https://developers.google.com/cloud-messaging/
*
*
*    https://gcm-http.googleapis.com/gcm/send
*    Content-Type:application/json
*    Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
*  
*    { "data": {
*    "score": "5x1",
*    "time": "15:10"
*    },
*    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
*    }
**/

function enviarMensajeGCM($GCMregid, $mensaje, $otrodato, $apiKey){


$GCMapiKey = $apiKey;

// Registro Id del dispositivo
$registrationIDs = $GCMregid;

// Se establecen las variables que se van a mandar por POST
$cty="Content-Type: application/json";

// URL para el envio de los mensajes
//$url = 'https://android.googleapis.com/gcm/send';   //Antigua URL
$url = 'https://gcm-http.googleapis.com/gcm/send';

$fields = array(
                'data' => array( "mensaje" => $mensaje , "dato" => $otrodato),
                'to'   => $registrationIDs
                );

$headers = array(
                    'Authorization: key=' . $apiKey,
                    'Content-Type: application/json'
                );

              
// Abre una conexión
$ch = curl_init();

// Establece el url, numero de variables Post y los datos del mensaje

curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );

// Ejecuta el post
$res_GCM_funcion = curl_exec($ch);

if ($res_GCM_funcion === FALSE) {
    die('Curl failed: ' . curl_error($ch));
}
      
// Cierra la conexión
curl_close($ch);

//decodifica en el array $res la cadena Json que devuelve Google
$res = json_decode($res_GCM_funcion,true);

//Devuelve el array
return $res;

}

?>
 

cuellar

Member
Licensed User
Longtime User
Te falta esa parte para terminar el proceso de registro.
Registro.php se encarga de almacenar el id que devuelve google en la tabla de la base de datos.
 

cuellar

Member
Licensed User
Longtime User
Esa es la función que envia los mensajes. Necesitas un archivo php llamado registro.php que guarde los ids en la tabla.
¿Has creado la tabla?
 

desof

Well-Known Member
Licensed User
Longtime User
Esa es la función que envia los mensajes. Necesitas un archivo php llamado registro.php que guarde los ids en la tabla.
¿Has creado la tabla?

No amigo por que tu me dijiste ayer que ibamos a completar el paso 3 que era escribir una vez que verifiquemos la conexion con el servidor.
Donde esta el Code de Registro.php ?
Asi veo como son los nombres de la base de datos.
Ya tengo una base de datos ahi y solo creare una tabla entonces
 

cuellar

Member
Licensed User
Longtime User
Mañana te subiré un ejemplo básico porque registro.php no existe. Esperaba a que tú te animaras a programarlo. Te aconsejo que aprendas aunque sea un poquito PHP y otros lenguajes, que diversifiques, así te resultará todo más facil y comprensible. Invertir tiempo en aprender es una buenísima idea. Lo mismo con los idiomas.
 

desof

Well-Known Member
Licensed User
Longtime User
Mañana te subiré un ejemplo básico porque registro.php no existe. Esperaba a que tú te animaras a programarlo. Te aconsejo que aprendas aunque sea un poquito PHP y otros lenguajes, que diversifiques, así te resultará todo más facil y comprensible. Invertir tiempo en aprender es una buenísima idea. Lo mismo con los idiomas.

La verdad es que comparto plenamente lo que dices ! y lo haría de tener tiempo pero no me dá. Esta es una aplicacion que la hice como beneficencia para mi municipio y solo en los ratitos que me quiero despejar de mis otras actividades.
Ahora entiendo por que me preguntaste que tal con php?
Gracias 1000!
 

cuellar

Member
Licensed User
Longtime User
Hola, como te dije anteriormente, hoy te pongo un ejemplo de registro y envio de mensajes en php.
Ten en cuenta que son ejemplos básicos y la seguridad no está trabajada. Si te sirven estos ejemplos búscate más información con respecto a la seguridad y completa el código.

Espero que esto te ayude.


registro.php
PHP:
<?

$conexion = mysqli_connect("localhost", "database_user", "database_password", "database_name");
$nuevoRegistro = $_POST['codigoRegistro'];
$nuevoRegistro = mysqli_real_escape_string($conexion,$nuevoRegistro);
mysqli_set_charset($conexion, "utf8");
if (mysqli_connect_errno()) {
    printf("Conexión fallida: %s\n", mysqli_connect_error());
    mysqli_close($conexion);
    exit;
} else {
    $sql = "CREATE  TABLE IF NOT EXISTS c2dm (idc2dm INT(11) NOT NULL AUTO_INCREMENT,
    idregistro VARCHAR(1024) NOT NULL UNIQUE,
    PRIMARY KEY (idc2dm))";
    $resultado = mysqli_query($conexion,$sql);
    if ($resultado) {
        if (isset($nuevoRegistro) && !empty($nuevoRegistro)) {
            $sql2= "INSERT INTO c2dm (idregistro) VALUES ('".$nuevoRegistro."')";
            $resultado2 = mysqli_query($conexion,$sql2);
            if ($resultado2) {
                    echo 'Registro insertado con exito';
            }
        } else {
            echo 'no hay datos para insertar';
        }
    }  
}
mysqli_close($conexion);
?>


enviaPush.php
PHP:
<?

$mysqli = mysqli_connect("localhost", "database_user", "database_password", "database_name");
mysqli_set_charset($mysqli, "utf8");
if (mysqli_connect_errno()) {
    printf("Conexión fallida: %s\n", mysqli_connect_error());
    mysqli_close($mysqli);
    exit;
} else {
    $sql="SELECT * FROM c2dm";
    $resultado = mysqli_query($mysqli,$sql);
    if ($resultado) {
        $numeroRegistros=mysqli_num_rows($resultado);
        while ($info = mysqli_fetch_array($resultado))
        {
            $aDispositivos[] = array("id" => stripslashes($info['idc2dm']), "registro" =>stripslashes($info['idregistro']));
        }
    }
}
mysqli_close($mysqli);

?>

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
    <h2>Enviar Notificacion push</h2>
    <p>Selecciona el dispositivo y escribe el mensaje.</p>
    <form action="enviaPushProceso.php" method="post">
        <div>Mensaje:&nbsp&nbsp&nbsp&nbsp<input type="text" name="mensaje" maxlength="50"></div><br>
        <div>Dispositivo:
            <select id="idregistro" name="idregistro">
                <? 
                    foreach($aDispositivos as $key => $valor){
                        echo '<option value="'.$valor['registro'].'">Dispositivo '.$valor['id'].'</option>';
                    }
                ?>
            </select>
        </div><br>
        <div>
            <input  id="btn-load" type="submit" value="Enviar Mensaje">
        </div>
    </form>
</body>


enviaPushProceso.php
PHP:
<?

$conexion = mysqli_connect("localhost", "database_user", "database_password", "database_name");
$idRegistro = $_POST['idregistro'];
$mensajeEnvio = $_POST['mensaje'];
$GoogleApiKey = "RIadGGw4TTgfeer.......jjeeAS5YYgjddmqQp98";
$otroDatoEnvio = "hola mundo";

mysqli_set_charset($conexion, "utf8");
if (mysqli_connect_errno()) {
    printf("Conexión fallida: %s\n", mysqli_connect_error());
    mysqli_close($conexion);
    exit;
} else {
    $sql = "SELECT * FROM c2dm WHERE idregistro ='".$_POST['idregistro']."'";
    $resultado = mysqli_query($conexion,$sql);
    if ($resultado) {
        $numeroRegistros=mysqli_num_rows($resultado);
        if ($numeroRegistros == 1) {
                $resultadoGCM = enviarMensajeGCM($idRegistro,$mensajeEnvio, $otroDatoEnvio, $GoogleApiKey);
        } else {
                echo 'error';
        }
    }  
}
mysqli_close($conexion);

function enviarMensajeGCM($GCMregid, $mensaje, $otrodato, $apiKey){
    $GCMapiKey = $apiKey;
 
    // Registro Id del dispositivo
    $registrationIDs = $GCMregid;
 
    // Se establecen las variables que se van a mandar por POST
    $cty="Content-Type: application/json";
 
    // URL para el envio de los mensajes
    //$url = 'https://android.googleapis.com/gcm/send';   //Antigua URL
    $url = 'https://gcm-http.googleapis.com/gcm/send';
 
    $fields = array(
    'data' => array( "mensaje" => $mensaje , "otrodato" => $otrodato),
    'to'   => $registrationIDs
    );
 
    $headers = array(
    'Authorization: key=' . $apiKey,
    'Content-Type: application/json'
    );
 
 
    // Abre una conexión
    $ch = curl_init();
 
    // Establece el url, numero de variables Post y los datos del mensaje
 
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_POST, true );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );
 
    // Ejecuta el post
    $res_GCM_funcion = curl_exec($ch);
     
    if ($res_GCM_funcion === FALSE) {
        die('Curl failed: ' . curl_error($ch));
    }
 
    // Cierra la conexión
    curl_close($ch);
 
    //decodifica en el array $res la cadena Json que devuelve Google
    $res = json_decode($res_GCM_funcion,true);
    echo 'Google responde: ';
    echo '<br>multicast_id: ';
    echo $res['multicast_id'];
    echo '<br>success: ';
    echo $res['success'];
    echo '<br>failure: ';
    echo $res['failure'];
    echo '<br>canonical_ids: ';
    echo $res['canonical_ids'];
    echo '<br>success: ';
    echo $res['success'];
    echo '<br>message_id: ';
    echo $res['results'][0]['message_id'];
    echo '<br>registration_id: ';
    echo $res['results'][0]['registration_id'];
    echo '<br>error: ';
    echo $res['results'][0]['error'];
 
 
    //Devuelve el array
    return $res;
 
}

?>


Modifica lo que está en negrita
B4X:
Sub MessageArrived (Intent As Intent)
    Dim Mensaje, CollapseKey, Otrodato As String 'ignore
    If Intent.HasExtra("mensaje") Then Mensaje = Intent.GetExtra("mensaje")
    If Intent.HasExtra("otrodato") Then Otrodato = Intent.GetExtra("otrodato")
    If Intent.HasExtra("collapse_key") Then CollapseKey = Intent.GetExtra("collapse_key")

    'Here you should handle the new message:
    Log("New message arrived: " & Data)
    ToastMessageShow("New message: " & Data, True)
  
    Dim AvisoNotificacion As Notification
     AvisoNotificacion.Initialize
     AvisoNotificacion.AutoCancel=True
     AvisoNotificacion.Icon ="icon"
     AvisoNotificacion.SetInfo("Nueva notificacion",Mensaje & " " & Otrodato,Main)
     AvisoNotificacion.Notify(1)
 
End Sub

Edito: No me marca la negrita en el código, modifica lo que veas cambiado.
 
Last edited:

Descartex

Well-Known Member
Licensed User
Longtime User
Muy buenas.
Me he puesto a probar el ejemplo del GCM y consigo registrar el token, pero a la hora de ejecutar un mensaje, en mi caso con
http://192.168.0.101:51044/send?password=123&text=Adios
me sale esto en el debug del b4j:
java.lang.RuntimeException: java.lang.NoClassDefFoundError: android/app/Service
y en la ventana del navegador, esto:
HTTP ERROR: 500
Problem accessing /send. Reason:

java.lang.RuntimeException: java.lang.NoClassDefFoundError: android/app/Service

La verdad es q estoy mas perdido que un pinguino en un garaje...

Un poquito de ayuda? :-D
Muchas gracias!!!
 

Descartex

Well-Known Member
Licensed User
Longtime User
B4j.
Me sale eso en el debug del b4j y el error 500 en el navegador.
Un saludo.
 

dar2o3

Active Member
Licensed User
Longtime User
La verdad es que pueden estar fallando un montón de cosas.

1 Api key gcm imagino que has creado una nueva.

2 Abrir los puertos del router en este caso el 51044.

3 Cambiar los valores del config.txt
board_url=http://b4aserver.basic4ppc.com/c2dm_board.php
server_password=9034f3po4gj34
api_key=AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxfgRuo

4 Si no has tocado el ejemplo tal y como viene los permisos del manifest.xml serán los correctos...


Si subes el código que tienes, si quieres le echo un vistazo a ver si veo el problema.
 

Descartex

Well-Known Member
Licensed User
Longtime User
Muy buenas.
Algo habre roto ayer, hoy, sin tocar el codigo, a la primera, me sale la pantalla de "enviado a 1 dispositivo".

Ahora la pregunta del millon... cuanto tardan en llegar? :D

Un saludo y muchas gracias.
 

Descartex

Well-Known Member
Licensed User
Longtime User

Descartex

Well-Known Member
Licensed User
Longtime User
Muchas gracias.
Ya funciona. Era simplemente eso.
Me acaban de llegar los mensajes que andaban pululando por la red de ayer y, como bien comentais, casi instantáneamente han llegado.
Un saludo y de nuevo gracias.
 

miqueas

New Member
También una manera fácil de integrar notificaciones Push en la plataforma Android, es integrando el Servicio INDIGITALL, ha sido desarrollado con la última tecnología para garantizar la máxima efectividad y simplificar el proceso de creación y envío de Notificaciones con imagen animada, Segmentadas, Geolocalizadas y muchas funciones.

Aquí puedes mirar la instalación sencilla para tu plataforma Android:

https://docs.indigitall.com/es/indigitallsetup/mobilepushquickstart/android.html
 
Top