Bonjour,
Je suis actuelement sur un projet basé sur SWITCHVOX !!!
pour ma part de developpeur je dois creer une interface web pour interagir avec l'apps switchvox notament:

  • recuperer la liste des appels en attente etc ...
    L'apps switchvox dispose d'un API auquel j'ai acces, l'acces est securiser par login/password
    MON PROBLEME EST LE SUIVANT:
    je voudrais utiliser la fonction cURL de PHP pour communiquer avec l'api de l'apps switchvox mais je n'y arrive pas !!!
    j'ai construis une fonction methode cURL donc voici le code ci-dessous:
    cette fonction a pour but de se connecter a un api securiser par login/password de transmettre des information json et d'en recuperer le retour !!!

<?php
function do_post_request($lien, $header, $postDataJson){
$curl = curl_init();

    $opts = [
        CURLOPT_URL => $lien,
        CURLOPT_HTTPHEADER =>$header,
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        //login/mot de pass de connection a l'api
        CURLOPT_USERPWD => "admin:admin",
        CURLOPT_CONNECTTIMEOUT => 2,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => TRUE,
        CURLOPT_MAXREDIRS => 2,
        CURLOPT_COOKIESESSION => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $postDataJson,
    ];

    curl_setopt_array($curl, $opts);

    // response of the POST request

    $response = curl_exec($curl);

    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

    $responseBody = json_decode($response);

    curl_close($curl);

    return $httpCode;

}

$header = array("Content-Type:application/json", "Accept:application/json");

$fichier = 'requette.xml';

$lien = 'https://10.0.0.80/json';
$request = array( "method" => "switchvox.currentCalls.getList" );
$parameters = array();
$postData = array(
    "request" => $request
);
// encoding object
$postDataJson = json_encode($postData);

//print_r($postDataJson);

$httpCode = do_post_request($lien, $header, $postDataJson);

if ($httpCode >= 200 && $httpCode < 300) {
echo 'ca marche';
}else {

code...
echo $httpCode;

}
?>

Quand j'execute mon script, j'obtiens "0" !!!
Je ne s'ais pas là ou ca bloc !

Pouvez m'aidez a faire fonctionner mon code ?
Merci !!!

11 réponses


keulu
Réponse acceptée

tu as aussi ca pour tester

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

sinon, j'ai remarqué que tu appelle ton ip avec https. tu peux pas l'appeler avec http ?

$lien = 'https://10.0.0.80/json';

ton $response vaut quoi ? Faut y aller étape par étape. si j'etais toi, j'enleverai tout ce qui peut faire que ca marche pas. (pour l'instant)

  • CURLOPT_CONNECTTIMEOUT => 2,
  • CURLOPT_MAXREDIRS => 2,
  • CURLOPT_COOKIESESSION => true,

Bonjour !
Merci de se pencher sur ma question!
ma variable $response vaut "0" quand j'essai d'executer mon code !

J'essaierai d'enlever les ligne que tu suggrer et je vous reviens !!!
Merci

c'est pas ton $httpCode qui vaut 0 ?

hooopppp !!!! excusez moi ! c plutot la var $httpCode qui vaut 0 !!!
J'ai pas eu l'idée de verifier ce que la variable $response vaut !
Je le fais tous de suite et je vous reviens !!!

Je viens donc d'enlever les ligne:
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_MAXREDIRS => 2,
CURLOPT_COOKIESESSION => true,

et verifier la valeur de la variable $response
Mais toujour mon code ne fonctionne pas !

avec un return $response, ca m'affiche rien ! une page blanche !

J'ai trouvé des piste que je voudrais partagé peut etre que ca aiderais au autres pour qu'il puisse m'aider !!!

  • j'ai rajouter une autre fonctionalité cURL: CURLOPT_SSL_VERIFYPEER => false, pour eviter les histoires de certificat
    quand je reexecute mon code, toujour la variable $response est vide: affiche rien. la variable $httpCode m'affiche toujour "0"
  • poursuivant mes recherche, j'ai trouvé une autre fonction de cURL qui permet d'afficher les erreur:
    if (curl_error($curl)) {
    $curl_error = curl_error($curl);
    }
    quand je place cette fonction mon code devient:
    function do_post_request($lien, $header, $postDataJson){
    $curl = curl_init();

    $opts = [
        CURLOPT_URL => $lien,
        CURLOPT_HTTPHEADER =>$header,
        CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
        CURLOPT_USERPWD => "admin:admin",
        CURLOPT_SSL_VERIFYPEER => false,
        //CURLOPT_CONNECTTIMEOUT => 2,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => TRUE,
        //CURLOPT_MAXREDIRS => 2,
        //CURLOPT_COOKIESESSION => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $postDataJson,
    ];
    
    curl_setopt_array($curl, $opts);
    
    // response of the POST request
    
    $response = curl_exec($curl);
    
    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    
    $responseBody = json_decode($response);
    
    if (curl_error($curl)) { 
       $curl_error =  curl_error($curl); 
    }
    
    curl_close($curl);
    
        //return $httpCode;
        //return $opts;
        //return $response;
        return $curl_error;

    }

    $header = array("Content-Type:application/json", "Accept:application/json");

    $fichier = 'requette.xml';

    $lien = 'https://10.0.0.80/json';

    $request = array( "method" => "switchvox.currentCalls.getList" );
    $parameters = array();
    $postData = array(
    "request" => $request
    );
    // encoding object
    $postDataJson = json_encode($postData);

    //print_r($postDataJson);

$httpCode = do_post_request($lien, $header, $postDataJson);

if ($httpCode >= 200 && $httpCode < 300) {
echo 'mosbi';
}else {

code...
echo $httpCode;

}
et resultat:
return $httpCode; m'affiche 0
return $response; m'affiche rien
return $curl_error; m'affiche " SSL: no alternative certificate subject name matches target host name '10.0.0.80' "

si j'enleve alors la fonction " CURLOPT_SSL_VERIFYPEER => false " et que je rexecute mon code, la variable:
$curl_error m'affiche " SSL certificate problem: self signed certificate in certificate chain "

quelqu'un aurait une idée pour palier a ca ou pour la creation d'un alternative certificate ?

Merci pour votre aide!

Je vois que beaucoup utilisent cURL: CURLOPT_SSL_VERIFYPEER => false,
cela veut dire que l'autorité qui a certifié le certificat n'est pas verifiée, (un certificat auto-signé est vu comme ok)
Si vous avez des problèmes de vérification des CA, pensez à mettre à jour votre fichier cacert.pem
vous pouvez le télécharger sur le site Mozilla et il y a même un outils pour l'extraire de votre navigateur moziilla.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem");

Bonsoir !
Oui effectivement j'approuve votre solution, sauf que apparement je suis obligé de lancer mon apps avec seulement que mozilla ?
et aussi, a chaque fois que mozilla met le certificat a jour il faut que je me rappel pour remettre mon application a jour ?
si joubli d'effectuer cette operation regulieremnt mon apps bugguera tous le temps qu'il faut ?

Je teste votre solution, mais je m'active a configurer un certificat auto signer
Merci !

Pour repondre a Mr keulu,
mon application n'est accessible qu'a l'adresse " https://10.0.0.80/" en https
maintenant en fonction du type de resultat que je souhaite obtenir, je precise https://10.0.0.80/json ou https://10.0.0.80/xml
Merci !

Ooooohhh juste !!!
Mr Keulu, mon code a fonctionné !!!
il ne manquais que cette ligne a ajouter apres la desactivation du controle ssl
Donc en resumer il faut les deux ligne combiner pour eviter l'errer " SSL: no alternative certificate subject name matches target host name "
du coup ca m'evite la configuration de certificat auto signé !
je remet ma fonction complete pour ceux que ca peut aider !
https://hastebin.com/utuqubakaq.php
Merci !