Bonjour,
J'essai de mettre en place un mini paiement en ligne sur mon site. J'ai suivit le tutoriel et tout marche très bien mise à part l'insertion dans la base de donnée de mes transactions. En débuggeant un peu la méthode notif de mon controller, je me suis aperçu que l'erreur pourrai venir en fait des en-têtes (header).
Voici le code de ma méthode notif :
public function notify(){
// Pas de rendu
$this->autoRender = false;
// Variable d'initialisation
$email_account = Configure::read('Paypal.mail');
$req = 'cmd=_notify-validate';
// Récupération du contenu renvoyer par Paypal
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
// Création d'un header sécuriser et ouverture de notre socket
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen('ssl://www.'.Configure::read('Paypal.sandbox').'paypal.com', 443, $errno, $errstr, 30);
// Récupération des variables utiles (Paiement) renvoyer par Paypal
$item_name = $_POST'item_name'];
$payment_status = $_POST'payment_status'];
$payment_amount = $_POST'mc_gross'];
$payment_fee = $_POST'mc_fee'];
$payment_currency = $_POST'mc_currency'];
$name = $_POST'address_name'];
$address = $_POST'address_street'];
$city = $_POST'address_city'];
$postal_code = $_POST'address_zip'];
$country = $_POST'address_country'];
$txn_id = $_POST'txn_id'];
$receiver_email = $_POST'receiver_email'];
$payer_email = $_POST'payer_email'];
$ipn_track_id = $_POST'ipn_track_id'];
if (!$fp) {
} else {
// On vérifie que le paiement est bien conforme a Paypal
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
$this->log($res, 'Paypal');
if (strcmp ($res, "VERIFIED") == 0) {
// Si le paiement à le status Completed
if ( $payment_status == "Completed") {
// Que le compte créditer est le même que celui définit dans la config
if ( $email_account == $receiver_email) {
// Et que le prix payer est le même que celui définit sur le site
if( $payment_amount == $this->config'paypal_amount'] ) {
// On sauvegarde la transaction
$this->Transaction->save(array(
'name' => $name,
'email' => $payer_email,
'address' => $address,
'city' => $city,
'postal_code' => $postal_code,
'country' => $country,
'payment_currency' => $payment_currency,
'payment_status' => $payment_status,
'payment_fee' => $payment_fee,
'payment_amount' => $payment_amount,
'item_name' => $item_name,
'txn_id' => $txn_id,
'ipn_track_id' => $ipn_track_id
));
}
}
}else {
$this->log('Failed paiement','Paypal');
}
exit();
}else if (strcmp ($res, "INVALID") == 0) {
$this->log('Invalide paiement','Paypal');
}
}
fclose ($fp);
}
}
Dans mon while, j'écris ceci :
$this->log($res, 'Paypal');
Et voici ce que m'affiche le log :
2012-10-12 07:12:45 Paypal: HTTP/1.0 400 Bad Request
2012-10-12 07:12:45 Paypal: Server: BigIP
2012-10-12 07:12:45 Paypal: Connection: close
2012-10-12 07:12:45 Paypal: Content-Length: 19
2012-10-12 07:12:45 Paypal:
2012-10-12 07:12:45 Paypal: Invalid Host header
Je ne comprend pas d'ou peut venir l'erreur.
Merci pour votre aide.
Ton header il faut mettre un header Host :
$header .= "Host: www.sandbox.paypal.com\r\n";
ils ont fait un changement ya qques semaines
Ok j'ai finalement trouver la solution (grâce à toi Jonathan). En fait j'ai du rajouter le port 443 dans mon header host, sinon ça ne marche pas :
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: www." . Configure::read('Paypal.sandbox') . "paypal.com:443\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen('ssl://www.' . Configure::read('Paypal.sandbox') . 'paypal.com', 443, $errno, $errstr, 30);
Merci encore
Salut et merci pour ta réponse,
j'avais malheureusement déjà essayer cette solution mais qui ne marche pas (ou alors je m'y prend mal??). Voici mon nouveau header :
// Création d'un header sécuriser et ouverture de notre socket
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Host: www.sandbox.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen('ssl://www.'.Configure::read('Paypal.sandbox').'paypal.com', 443, $errno, $errstr, 30);
J'avais même essayer de rajouter un Connection:Close dans le header comme ils l'indiqué dans certains forum mais sans succès. Là je ne sais plus quoi faire.
Il me renvoi bien le $_POST avec les données dedans, l'erreur se passe au niveau de la boucle while.