Bonjour,

Voila je travail avec une api, en executant la requêtte suivante, on me sort une erreur

$headers = array(
    "Authorization: montoken",
    "Accept: application/json", 
    "Content-Type: application/json",
    "Cache-Control: no-cache",
    ); 
    $url="https://urldelapi.com";

    $dat=array(
        "merchant_key"=> "7cbbb9c5",
        "currency"=> "OUV",
        "order_id"=> "ORDER052FD54",
        "amount"=> 50000,
        "return_url"=> "monsite.com?paiement=return",
        "cancel_url"=> "monsite.com?paiement=cancel",
        "notif_url"=> "monsite.com?paiement=ok",
        "lang"=> "fr"
       ); 
    //$dat=json_encode($dat);
    /*initialisation de la session*/ 
    $ch = curl_init(); 
    // /*configuration des options*/ 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLFTPSSL_TRY, false);
    curl_setopt($ch, CURLOPT_FAILONERROR, false);
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER,true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POST,true); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS,$dat); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 

    $CurlResponse = curl_exec($ch); 

voici l'erreur:

HTTP/1.1 100 Continue

HTTP/1.1 413 Request Entity Too Large
Date: Sat, 23 Dec 2017 00:01:00 GMT
Server: Apigee Router
Content-Type: application/problem+json; charset=utf-8
Content-Length: 198
Cache-Control: no-store
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Access-Control-Allow-Origin:
Access-Control-Expose-Headers: X-Result-Count, X-Total-Count
X-OAPI-Request-Id: opopecballrt01-25890-2553232-1

{"code":66,"message":"Request entity too large","descripti'.

Je n'arrive pas à trouver l'erreur dans le code, j'ai besoin de votre aide

18 réponses


Personne pour M'aider

Salut,
Peut être ça ?

$headers = array(
    "Authorization: montoken",
    "Accept: application/json", 
    "Content-Type: application/json",
    "Cache-Control: no-cache",
    "Expect: 100-Continue"
    ); 

@plus

Pierre

ca viens générallement d'un soucis coté serveur. le 413 viens très souvent du fait que tu envoit trop d'informations (le POST est trop lourd).

ca peux venir de php, apache ou nginx.

Ce qui est bizarre dans ton cas, c'est que j'ai pas l'impression que ton $dat soit "énorme"... ca le fait avec tous les navigateurs ? apparement il y a un soucis connu entre FF et orange... (c'est ton cas ?)

t'as essayé chrome, IE/edge, ou autre ?

Salut,
Quand le lis la doc de php :
CURLOPT_POSTFIELDS :
Toutes les données à passer lors d'une opération de HTTP POST. Pour envoyer un fichier, préfixez le nom du fichier avec un @ et utilisez le chemin complet. Le type de fichier peut être explicitement spécifié en faisant suivre le nom du fichier par le type au format ';type=mimetype'. Ce paramètre peut être passé sous la forme d'une chaîne encodée URL, comme 'para1=val1&para2=val2&...' ou sous la forme d'un tableau dont le nom du champ est la clé, et les données du champ la valeur.
Si le paramètre value est un tableau, l'en-tête Content-Type sera définie à multipart/form-data**.
Depuis PHP 5.2.0, value doit être un tableau si les fichiers sont passés à cette option avec le préfixe @. Depuis PHP 5.5.0, le préfixe @ est obsolète et les fichiers peuvent être envoyés en utilisant CURLFile. Le préfixe @ peut être désactivé, pour passer sans danger des valeurs commençant par @, en définissant l'option CURLOPT_SAFE_UPLOAD à TRUE.

dans ton cas,
curl_setopt($ch, CURLOPT_POSTFIELDS,$dat); // $dat est un tableau

Ce n'est pas le cas.
toi tu fais :
Content-Type: application/json

d'après la doc, tu devrais faire :
Content-Type: multipart/form-data

@plus

Pierre

J'ai éssayé "Content-Type: multipart/form-data" Mais on m'affiche une erreur du genre "Bad Request..."
J'ai aussi tester le code avec différent navigateur j'obtiens toujours une erreur 413,

Je me demande si ce n'est pas l'erreur du au conflit énnoncé par @keulu qui parle de FF et Orange

est ce qu'il faudra pas que tu encode ton tableau en JSON avant de l'envoyer ?

curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($dat));

@keulu
Ce paramètre peut être passé sous la forme d'une chaîne encodée URL, comme 'para1=val1&para2=val2&...' ou sous la forme d'un tableau dont le nom du champ est la clé, et les données du champ la valeur.

bonne idée, mais pas en json

@plus
Pierre

En l'occurence, si, on peut envoyer directement un JSON en CURL, comme le fait keulu, c'est notamment le cas de 95% des API.
Seulement, ça ne se récupère pas de la même manière ensuite.
C'est à dire qu'on ne fera pas $_POST ['variable']mais file_get_contents('php://input');

ben comme on a pas l'info sur l'api utilisé, on peux pas en déduire la spec ^^

je suis allé voir sur Apigee. tu construits tes API avec de la documentation swagger. Donc peut etre eventuelelment que tu as un environnement de test sur le site ? en balancant ton tableau, est ce que tu as le meme comportement ?

@Kenor, oui tout a fait correcte, mais ca c'est les Specs de l'api qui vont t'indiquer comment envoyer tes données. la il ne construit pas une api, il veut s'en servir. Donc faut voir ce qu'ils disent sur leur documentation concernant l'envoi des données en POST.

Voilà ce qu'on me dit de faire sur la documentation

https://api.orange.com/orange-money-webpay/dev/v1/webpayment

Authorization: Bearer IW3gdUVOvQVcO7mGNsOZgwdhDNvE
Accept: application/json
Content-Type: application/json
{
  "merchant_key": "a86b2087",
  "currency": "OUV",
  "order_id": "MY_ORDER_ID_08082105_0023457",
  "amount": 1200,
  "return_url": "http://myvirtualshop.webnode.es",
  "cancel_url": "http://myvirtualshop.webnode.es/txncncld/",
  "notif_url": "http://www.merchant-example2.org/notif",
  "lang": "fr"
}

Salut, j'ai essayé le lien, il ya une erreur liée au certificat SSL, j'ai ajouté cette ligne :

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Et maintenant j'ai cette erreur, après un var_dump

 public 'code' => int 24
  public 'message' => string 'Missing body field' (length=18)
  public 'description' => string 'Wrong parameter - Some body fields contain invalid values' (length=57)

"Certains champs du corps contiennent des valeurs non valides"

tu as mis quoi comme valeur, fait un var_dump de $dat (avant le json_encode) ?

je n'aie fait que modifié le token et le merchantk_key dans la classe que j'ai pris sur github

Bonsoir.
Une erreur que j'ai relevé, c'est que tu mets Authorization: montoken alors qu'il te faut faire Authorization: Bearer montoken, il te manque donc Bearer lorsque tu définis le token dans les headers.

dans la classe que j'ai pris sur github

Il nous serait utile que tu nous donne le lien de la classe puisqu'elle est sur GitHub.
Par contre, si tu utilises une classe externe, ça m'étonne que tu utilises directement curl au lieu de passer par la classe.

Lartak, il parle de la classe que j'ai mis un peu au dessus (qui contient Bearer)

Biensur, @Lartak, j'ai mis Bearer, mais c'est toujours la même chose