PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2025 → Push
Push
Débuté par Fred, 03 juin 2026 16:10 - Aucune réponse
Posté le 03 juin 2026 - 16:10
Bonjour à tous,

Je développe un projet de notification push en version WM28 UPDATE 5. J'avoue que c'est la première fois que je fais du PUSH.
J'ai utilisé comme base l'exemple fourni par Windev.

Mon projet comprend donc 2 applications Android, une qui envoie et l'autre qui reçoit les push et un service web SOAP. L'enregistrement des tokens est correct. J'utilise le npeFirebaseCM_v1 de chez Google, le seul disponible aujourd'hui. J'ai déclaré mon application sur Firebase et j'ai récupéré les 2 fichiers JSON.

Mais, le NotifPushEnvoie me renvoie cette erreur :
errcomplet :
erreur lors de l'appel au webservice :
- Appel WL: - Fonction<>
- Niveau : erreur non fatale
- Message d’erreur système :
- La vérification du certificat SSL ou de la clé SSH a échoué.
- Que s’est il passé ?
- Une erreur système a été détectée pendant l’envoi de la requête HTTP

J'ai fait des petits tests avec ce code :

cReq est un httpRequête
cReq.URL = "https://oauth2.googleapis.com/token"
cRep est un httpRéponse = HTTPEnvoie(cReq)
SI ErreurDétectée ALORS
Erreur("OAUTH ERROR = " + ErreurInfo(errComplet))
SINON
Info("OAUTH ok")
FIN

Le retour est "OAUTH ok"

Et avec ce code :

cMaRequête est un httpRequête
cMaRequête.URL = "https://www.google.com"
cMaRéponse est un httpRéponse = HTTPEnvoie(cMaRequête)

SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
SINON
fAjouteTexte("C:\Temp\http.txt",cMaRéponse.Contenu)
FIN


La encore il n'y a pas d'erreur dans le retour.

Voici mon code webservice :

Procedure EnvoieAndroid(sMessage est une chaîne, sContenu est une chaîne, sTitre est une chaîne, sTexteDeroulant est une chaîne, bVibration est un booléen, ...
bLED est un booléen, bSupprimable est un booléen, bApplicationActive est un booléen, Site_ID est un entier sur 8 octets) : chaîne

// Variables
tabIdentifiantsAEnvoyer est un tableau de Buffers
tabIdentifiantsAEnvoyerTemp est un tableau de Buffers
ListeReponse est un tableau de Buffer
bufIdentifiant est un Buffer
tabTokensInvalides est un tableau de Buffer
nNbTokensInvalides est un entier



SI gsCléAPIAndroid = "" ALORS
RENVOYER "Veuillez saisie une clé Google API"
FIN

// Chemin du fichier sur le serveur d'application
sCheminFichierJson = fRepExe() + ["\"] + "Config\push-assistant-firebase-adminsdk-fbsvc-a64f49af70.json"

// Lecture du fichier JSON
SI fFichierExiste(sCheminFichierJson) ALORS

SI fChargeTexte(sCheminFichierJson) = Faux ALORS
RENVOYER "Impossible de charger le json sdk"
SINON
sContenuJson = fChargeTexte(sCheminFichierJson)

SI sContenuJson = "" ALORS
RENVOYER "Json SDK vide. [%sCheminFichierJson%]"
SINON
sContenuJson = Remplace(sContenuJson, "\n", RC)
FIN
FIN
SINON
RENVOYER "Le fichier de configuration Firebase AdminSDK est introuvable."
FIN

// On récupère les identifiants
ListeReponse = ListeIdentifiantsAndroid(Site_ID)

SI ListeReponse..Occurrence > 0 ALORS
// Ajout des identifiants dans un tableau
POUR i = 1 _À_ ListeReponse..Occurrence
bufIdentifiant = ListeReponse[i]
TableauAjoute(tabIdentifiantsAEnvoyer,bufIdentifiant)
FIN

// On gère le fait que les notifications PUSH ne peuvent avoir au maximum que 1000 destinataires
// S'il y a plus de destinataires il faut envoyer plusieurs messages.
POUR i = 0 _À_ (tabIdentifiantsAEnvoyer..Occurrence / 1000)
nDebut est un entier = i * 1000 + 1
nFin est un entier = (i + 1) * 1000

SI nFin > tabIdentifiantsAEnvoyer..Occurrence ALORS
nFin = tabIdentifiantsAEnvoyer..Occurrence
FIN

// On prend les identifiants désirés
TableauCopie(tabIdentifiantsAEnvoyer,tabIdentifiantsAEnvoyerTemp,nDebut,nFin - nDebut + 1)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// On envoie la notification

maNotif est un Notification

maNotif.Message = sMessage
maNotif.Contenu = sContenu

////////////////////////////////////////////////////////////////
// Android

// Titre
maNotif.Titre = sTitre

// Son Android
maNotif.Son = "son_notif.mp3"

// Icône
maNotif.Icone = "Proteck-Congo.ico" // mettre ici l'icône pour la notification

// Groupe des notifications
maNotif..Groupe = "Push"

// Texte déroulant
maNotif.TexteDéroulant = sTexteDeroulant

// Options
maNotif.Vibration = bVibration
maNotif.AffichageLED = bLED
maNotif.Supprimable = bSupprimable
maNotif.ActiveApplication = bApplicationActive

//CODE ORIGINAL
// quand Exception dans
SI PAS NotifPushEnvoie(maNotif,tabIdentifiantsAEnvoyerTemp,sContenuJson,tabTokensInvalides,npeFirebaseCM_v1) ALORS
RENVOYER "Erreur notif :" + RC + ErreurInfo(errComplet)

SINON
// On traite les tokens invalides
SI tabTokensInvalides..Occurrence > 0 ALORS
nNbTokensInvalides += tabTokensInvalides..Occurrence

// On supprime les tokens invalides
SupprimeIdentifiantsAndroid(tabTokensInvalides)
FIN

FIN
// FAIRE
// RENVOYER "EXCEPTION : " + ExceptionInfo()
// fin
FIN
//
SINON
RENVOYER "Aucun identifiant stocké sur le serveur." + "Aucune notification envoyée."
FIN

RENVOYER ""



Et voici le code côté Android:

Procedure PbASignaler(LOCAL nIDPbasignaler est un entier sur 8 octets)

//PAS = Problème à signaler après une ronde
dhDateHeure est une DateHeure = DateHeureSys()
slepb, slecas, nomsite sont des chaînes

WBSVC_SOAP_PUSH..Adresse = "https://ADRESSE_WEB/WBSVC_SOAP_PUSH_WEB/awws/WBSVC_SOAP_PUSH.awws"

SI Ping("8.8.8.8",300) = Vrai ALORS
HLitRecherche(problemeasignaler,IDProblemeASignaler,nIDPbasignaler)
SI HTrouve(problemeasignaler) = Vrai ALORS
slepb = problemeasignaler.Description
FIN

HLitRecherche(sites,IDSite,nIDSite)
SI HTrouve(sites) = Vrai ALORS
nomsite = sites.Nom
FIN

AjoutInformation(DateHeureSys(),"Assistant APS","Rondier " + nomsite,45,nIDSite,gnIDAgent,nIDClient,1,"[%slepb%]" + RC + "Merci d'informer le client dans les plus brefs délais.")

rondesdédiéesenlive.IDClient = nIDClient
rondesdédiéesenlive.IDSite = nIDSite
rondesdédiéesenlive.IDAgent = gnIDAgent
rondesdédiéesenlive.Description = slecas
rondesdédiéesenlive.DateHeurePT = dhDateHeure
HAjoute(rondesdédiéesenlive,hEcritureDéfaut)


SELON nIDPbasignaler
CAS = 1
slecas ="EAUMOINSQUART"
CAS = 2
slecas = "GSLMOINSQUART"
CAS = 3
slecas = "GEHS"
CAS = 4
slecas = "PRTOUV"
CAS = 5
slecas = "FENOUV"
CAS = 6
slecas = "VEHOUV"
CAS = 7
slecas = "SURPHS"
CAS = 8
slecas = "CLIMHS"
CAS = 9
slecas = "GAZ"
FIN

AssistantEvenement.Client_id = nIDClient
AssistantEvenement.Site_id = nIDSite
AssistantEvenement.Agent_id = gnIDAgent
AssistantEvenement.lecas = slecas
AssistantEvenement.evt = "[%slepb%] à : "
AssistantEvenement.dateheure_evt = DateHeureSys()
AssistantEvenement.MailEnvoye = 0
SI HAjoute(AssistantEvenement,hEcritureDéfaut) = Vrai ALORS

ToastAffiche("Message envoyé",toastCourt,cvBas,chCentre)

// Syntaxe :
//EnvoieAndroid(sMessage est une chaîne, sContenu est une chaîne, sTitre est une chaîne, sTexteDeroulant est une chaîne, bVibration est un booléen, ...
//bLED est un booléen, bSupprimable est un booléen, bApplicationActive est un booléen)

//POUR TEST
// cReq est un httpRequête
// cReq.URL = "https://oauth2.googleapis.com/token"
//
// cRep est un httpRéponse = HTTPEnvoie(cReq)
//
// SI ErreurDétectée ALORS
// Erreur("OAUTH ERROR = " + ErreurInfo(errComplet))
// SINON
// Erreur("OAUTH ok")
// FIN

sReponse est une chaîne = WBSVC_SOAP_PUSH.EnvoieAndroid("[%slepb%]","","Votre villa","",Vrai,Faux,Vrai,Faux,nIDSite)//le dernier faux actionclic à modifier

SI ErreurDétectée ALORS
Erreur("Erreur lors de l'appel au Webservice : " + sReponse) //+ ErreurInfo(errComplet)
SINON
ToastAffiche("Notification envoyée")
FIN
FIN

SINON
MsgSMS est une chaîne

MsgSMS = ("," + "PAS" + "," + nIDClient + "," + nIDSite + "," + gnIDAgent + "," + nIDPbasignaler + "," + dhDateHeure + "," + ".")

SMS2CDC(MsgSMS)
FIN

//ferme(FEN_Problème_à_signaler)
gnActiverTimer = 1
gnAffichage = 0
FEN_Menu_principal..Plan = plprincipal


L'erreur retournée par le PUSH semble assez générique. Cela fait 2 jours que je tourne en rond.
Peut être y a t il une subtilité npeFirebaseCM_v1 avec WM28 UPDATE 5 ? En tout cas, ça m'échappe.

Merci de votre aide.

Cordialement,

Fred