Formulaire et cURL

Eléphanteau du PHP | 47 Messages

19 nov. 2009, 17:48

Bonjour à tous,

Je tente d'utiliser cURL pour l'envoi d'informations à ma banque (autorisation de carte de crédit) Voici ce que j'utilise tiré d'un tuto du web:
$postfields = array();
$postfields["ssl_merchant_id"] = "mon code";
$postfields["ssl_user_id"] = "mon code";
$postfields["ssl_pin"] = "mon nip";
$postfeilds["ssl_test_mode"]="TRUE";  
$postfeilds["ssl_transaction_type"]="ccsale";
$postfeilds["ssl_card_number"]="$trnCardNumber";
$postfeilds["ssl_exp_date"]="$exp_date";
$postfeilds["ssl_amount"]="$montant";;
$postfeilds["ssl_show_form"]="false";
$postfeilds["ssl_email"]="$ssl_email";
$postfeilds["ssl_description"]="$ssl_description";
$postfeilds["ssl_cvv2cvc2_indicator"]="present"; //--CVV2 Indicator
$postfeilds["ssl_cvv2cvc2"]="$trnCardCvd"; //--CVV2 Data
$postfeilds["ssl_avs_address"]="$ssl_avs_adress2"; //AVS Postal Address
$postfeilds["ssl_avs_zip"]="$ssl_avs_zip";//--AVS ZIP Code --;
$postfeilds["ssl_invoice_number"]="$ssl_invoice_number";
$postfeilds["ssl_result_format"]="HTML";
$postfeilds["ssl_receipt_decl_method"]="REDG";
$postfeilds["ssl_receipt_decl_get_url"]="https://www.monsite.ca/decline.php";
$postfeilds["ssl_receipt_apprvl_method"]="REDG";
$postfeilds["ssl_receipt_apprvl_get_url"]="https://www.monsite.ca/confirm_insc.php";

$url = "https://www.myvirtualmerchant.com/VirtualMerchant/process.do"; //argument action dans form
$useragent = "Mozilla/5.0";
$referer = "https://www.monsite.ca/send_info_curl.php"; 
 
//Initialise une session CURL
$ch = curl_init($url);
//CURL options
curl_setopt($ch, CURLOPT_POST, 1);
//On poste les données du tableau $postfields
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
//On définit un useragent ici Mozilla/5.0
//souvent les bots se font passés pour googlebot ce qui finalement est stupide
//On passe donc un useragent banal
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
//On passe un referrer ici on passe la même page $url
curl_setopt($ch, CURLOPT_REFERER, $referer);
//on récupère le contenu de la page de résultat de la soumission dans une chaine
//curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// en cas de redirection (facultatif ici)
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//Page de résultats et fermeture de session
//$result = 
curl_exec($ch);
curl_close($ch);

Normalement avec un formulaire HTML, le "form" envoi les infos au site "myvirtualmechant". celui ci traite l'info et me retourne les autorisations. Avec ce code, rien ne se passe. Je reste avec une page blanche. C'est pas une erreur pcq j'ai ajouter un petit echo 'ok'; pour m'assurer que ce n'était pas une erreur PHP. À l'origine, il y avais un affichage du résultat qui donnait "1"

Pouvez vous m'aider?

Merci

Eléphant du PHP | 245 Messages

20 nov. 2009, 12:31

En fait déjà:
1) ta variable CURLOPT_POSTFIELDS doit etre une chaine formatée version URI et non un tableau
2) Deplus dans certains cas, il y a d'autres variables importantes à initialiser dont CURLOPT_SSL_VERIFYPEER
(pour les données sécurisées)
3) le retour de curl_exec($ch); est une chaine
donc tu doit mettre
$result = curl_exec($ch);
(enlèves le commentaires)
ensuite tu traite la chaine de retour pour pouvoir mettre à jour tes données
Ce qui donne un truc du genre :

//... début du code

$ch = curl_init();
//formatage de la chaine
$message_sous_forme_de_chaine="";

foreach($postfields as id=>value)
{
$message_sous_forme_de_chaine.="$id=$value&";
}
//on enlève le dernier & qui est en trop
$message_sous_forme_de_chaine=substr($message_sous_forme_de_chaine,0,strlen($message_sous_forme_de_chaine)-1);

curl_setopt( $ch, CURLOPT_URL, $url_de_traitement_de_formulaire );
curl_setopt( $ch, CURLOPT_HEADER, FALSE );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $ch, CURLOPT_POST, TRUE );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $message_sous_forme_de_chaine);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);//!!!!!! à mettre absoluement sinon, la liste de certificats existants ne sera pas prise en compte

$returned = curl_exec($ch);
curl_close($ch);

//...fin du code

Dans l'espérance que cela t'aidera.

Eléphanteau du PHP | 47 Messages

20 nov. 2009, 16:51

Merci de ta réponse.

Je travaille sur ça aujourd'hui et je vous en redonne des nouvelles.

Eléphanteau du PHP | 47 Messages

20 nov. 2009, 17:28

Des nouvelles.

ÇA fonctionne... après quelques modification.

Tu avais oublier de mettre les $ pour le foreach. Surement une petite erreur de frappe :)

Code : Tout sélectionner

foreach($postfields as $id=>$value) { $message_sous_forme_de_chaine.="$id=$value&"; }
Voici ce que j'utilise...
//... début du code

$ch = curl_init();

//formatage de la chaine

foreach($postfeilds as $id=>$value)
{
$message_sous_forme_de_chaine.="$id=$value&";
}
//on enlève le dernier & qui est en trop
$message_sous_forme_de_chaine=substr($message_sous_forme_de_chaine,0,strlen($message_sous_forme_de_chaine)-1);

curl_setopt( $ch, CURLOPT_URL, $url);
curl_setopt( $ch, CURLOPT_HEADER, FALSE );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $ch, CURLOPT_POST, TRUE );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $message_sous_forme_de_chaine);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);//!!!!!! à mettre absoluement sinon, la liste de certificats existants ne sera pas prise en compte
curl_setopt($ch, CURLOPT_REFERER, $referer);
$returned = curl_exec($ch);
curl_close($ch);
echo"$returned";
CE que j'ai du ajouter:
curl_setopt($ch, CURLOPT_REFERER, $referer);  
Je dois spécifier dans l'admin de la banque quel page lui envoi les infos. Surement une question de sécurité. Donc je dois envoyer le "referer"

J'Ai aussi ajouter le echo "$returned" pour que la suite de mon site fonctionne. C'est à dire se rendre sur la page de confirmation et d'update de la BDD.


Merci grandement de votre aide. C'est toujours un plaisir de venir ici. On trouve toujours ce que nous avons besoin.

Eléphant du PHP | 217 Messages

20 nov. 2009, 18:48

Un petit truc histoire d'optimiser ton code :
remplace la boucle foreach sur ton tableau et ton substring par :
$message_sous_forme_de_chaine = http_build_query($postfeilds);
C'est plus imple et plus lisible au niveau du code :mrgreen:

Eléphanteau du PHP | 47 Messages

20 nov. 2009, 18:56

Salut,

Effectivement c'est plus simple et ça fonctionne bien.

Merci