[HTML] post à .aspx

Bonjour,
un serveur m’envoie la page html suivante (extrait):

[code]

Payweb Card


Obtenir un numéro virtuel


Sélectionnez une carte
M DUPONT MARC (Mastercard) xxxx xxxx 6877 571x Exp. : 01/14 M DUPONT MARC (Mastercard)
xxxx xxxx 6877 571x
Expire fin 01/14

Saisissez le montant et la devise


Montant

Devise

EUR CHF GBP USD CAD JPY AUD (Nous vous conseillons de créer le numéro dans la devise de votre paiement)

Le numéro délivré sera valable jusqu'au 31/05/2013

[/code]

j’envoie (donc?) le post suivant (java.httpclient) :

[code]HttpPost httpost2 = new HttpPost(“https://www.creditmutuel.fr/cmne/fr/services/payweb/wallet.aspx?IDR=O”);

nvps = new ArrayList ();
nvps.add(new BasicNameValuePair("__VIEWSTATE","/db4nfn2fb43dv2dru4nkbd3b4ujdys32vsr4u2="));
nvps.add(new BasicNameValuePair("__EVENTVALIDATION","/uçpg68i4l1n6f8y1l"));
nvps.add(new BasicNameValuePair(“cb”,“0”));
nvps.add(new BasicNameValuePair(“mnt”,“10”));
nvps.add(new BasicNameValuePair(“dev”,“EUR”));

httpost2.setEntity(new UrlEncodedFormEntity(nvps, Consts.ISO_8859_1));

System.out.println(“avant le Post”);
HttpResponse response7 = httpclient.execute(httpost2);
System.out.println(“après le Post”);[/code]

Pouvez-vous me dire quelle grosse ânerie de ma part fait que je n’ai pas de réponse du serveur (attente infinie, j’ai chronométré) ?

Le mieux serait probablement que tu sniffes le réseau pour voir les requêtes aussi bien lorsqu’elles viennent de ton navigateur que lorsque tu les génères en Java. Ça te permettra de voir les différences et donc de trouver où est le couac.

Les problèmes les plus courants sont : absence de certains cookies, absence de Referer, mauvais User Agent (même si le browser-sniffing c’est le mal absolu certains ne s’en privent pas).

:laughing:

Merci syam, j’ai redécouvert cet outil très pratique qu’est le module Tamper Data de Iceweasel.
Il m’indique quelques paires de valeurs à ajouter :

[code]

nvps.add(new BasicNameValuePair("__EVENTTARGET",""));
nvps.add(new BasicNameValuePair("_EVENTARGUMENT",""));
nvps.add(new BasicNameValuePair("__VIEWSTATE","/db4nfn2fb43dv2dru4nkbd3b4ujdys32vsr4u2="));
nvps.add(new BasicNameValuePair("__EVENTVALIDATION","/uçpg68i4l1n6f8y1l"));
nvps.add(new BasicNameValuePair(“cb”,“0”));
nvps.add(new BasicNameValuePair(“mnt”,“10”));
nvps.add(new BasicNameValuePair(“dev”,“978”));
nvps.add(new BasicNameValuePair(“btnValide.x”,“0”));
nvps.add(new BasicNameValuePair(“btnValide.y”,“0”));[/code]

bien que les deux premiers n’apparaissaient pas dans la page html.

Je précise que :

  • j’avais changé le codage en UTF_8 parce que c’était le seul qui marchait dans les post précédents,
  • la valeur “EUR” c’était une trace de mes multiples tentatives dans la recherche des ‘bons’ paramètres
  • ça ne marche toujours pas ! :017

Ben si le contenu du POST est identique entre les deux, la seule piste restante c’est les en-têtes HTTP. Comme je disais dans mon message précédent : cookies (surtout celui de session), referer, user agent et autres.

Ils ont très probablement été rajoutés en javascript au moment où tu postes le formulaire. :wink:

Voici les en-têtes au cas où quelque chose sauterait aux yeux de quelqu’un …

HTTP/1.1 200 OK Date: Sat, 27 Apr 2013 17:07:59 GMT Server: Apache Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Sat, 26 Jul 1997 05:00:00 GMT Pragma: no-cache Vary: User-Agent,Accept-Encoding Content-Type: text/html; charset=ISO-8859-1 Set-Cookie: MIDW_CTX=IDENT_SERVER=10.46.4.129:8003&IDENT_GUID={E3C23C75-87B3-4D77-B21A-95D7CAC635C2}; secure Set-Cookie: ASP.NET_SessionId=ufhwy255frqxq445yy0m4z45; HttpOnly Set-Cookie: mid=1; EXPIRES=Sun, 27-Apr-2014 17:08:00 GMT; PATH=/; SECURE Set-Cookie: SessionTimeout=10; Path=/; Secure Set-Cookie: SessionStart=1367082480; Path=/; Secure Keep-Alive: timeout=7, max=100 Connection: Keep-Alive

Bah les cookies… :wink:

Certains correspondent à ta session en cours (ce qui est forcément important vu que c’est un site bancaire, il va pas te laisser te connecter si tu ne t’es pas authentifié et si tu ne lui indiques pas ta session), et MIDW_CTX m’a tout l’air d’être un cookie pour gérer du load-balancing (autrement dit, pour indiquer au frontal sur quel serveur ta session se trouve).

Tout ça est extrêmement important !

Un grand merci syam :023
C’est effectivement une question de cookie.
un petit httpclient = HttpClients.custom().setDefaultCookieStore(cookieStore).build(); supplémentaire (je ne maîtrise pas tout) a résolu la chose.
:dance: :dance: :dance:

Ôte moi d’un doute… C’est pas toi qui avais déjà posé le même genre de question, et à qui j’avais déjà donné la même réponse ? J’avoue que j’ai la flemme de rechercher, c’était peut-être quelqu’un d’autre…

Bref, tout ça pour dire que les cookies c’est super important, c’est l’élément central qui permet de lier toutes tes différentes requêtes entre elles. Sans eux, chaque requête se comporte comme si tu fermais ton navigateur ET nettoyais les cookies entre les deux, ce qui ne peut décemment pas marcher… (puisque ça ferme tes sessions au passage) :wink:

Oui et non https://www.debian-fr.org/envoi-de-post-a-cgi-en-java-t38377.html
A l’époque, je balbutiais. Aujourd’hui, j’ai plus de bases en java, et httpclient gère tout tout seul (ou presque) cookies, SSL, …
Dans une centaine d’années, je serai au top. :ugeek:

Je ne doute pas que l’API de HttpClient permette de gérer les sessions (et de balancer plusieurs requêtes dans une même session http).