Bonjour à tous.
Je me permets de poser mon problème ici car je n'arrive pas à trouver la solution malgré des cherches et des contacts avec le support de Paypal.
Mon problème est le suivant. J'ai mis en place un système de paiement sur un site avec paypal. J'ai suivis le tuto sur ce sujet. Pendant la période de test avec la sandbox tous fonctionnait parfaitement.
Mais au moment de passer en production, je n'ai plus eu de retour sur ma base de donnée... Le système de paypal tombe sur une erreur 500 quand il communique avec la fonction notify.
Je vous mets le controller paypal ci-dessous:
[code]
<?php
class PaypalController extends AppController{
public $uses = array('User','Transaction');
function notify(){
$email_account = Configure::read('Paypal.mail');
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
$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://ipnpb.paypal.com', 443, $errno, $errstr, 30);
if (!$fp) {
echo "%NIP-F-SOCKOPEN, HTTP error " . $errno . " " . $errstr;
exit;
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
if ($payment_status == "Completed") {
if ($email_account == $receiver_email) {
$hid = $custom['hid'];
$uid = $custom['uid'];
$this->Transaction->save(array(
'price_ht' => $payment_ht,
'tax' => $payment_tax,
'price' => $payment_ht+$payment_tax,
'trans_id' => $txn_id,
'user_id'=> $uid,
'hunt_id'=> $hid,
'action' => 'payer',
'paiement' => 'paypal',
'name'=> $name,
'country'=> $country,
'city' => $city,
'address'=> $address
));
$transaction_id = $this->Transaction->id;
$pattern = '/([0-9]+)-/';
preg_match($pattern,$transaction_id, $matches);
$transaction_id = $matches['1'];
debug($transaction_id);
// Gestion participation
$this->loadModel('UsersParticipant');
$p['UsersParticipant']['user_id'] = $uid;
$p['UsersParticipant']['hunt_id'] = $hid;
if($this->UsersParticipant->save($p,true,array('user_id','hunt_id'))){
$p['UsersParticipant']['user_id'] = $uid;
$p['UsersParticipant']['hunt_id'] = $hid;
$p['UsersParticipant']['transaction_id'] = $transaction_id;
if($this->UsersParticipant->save($p,true,array('user_id','hunt_id','transaction_id'))){
$this->Session->setFlash("Votre participation à la chasse a été enregistré","notif");
$this->loadModel('Hunt');
$this->Hunt->recursive = 0;
$p['part'] = $this->Hunt->find('first',array(
'conditions' => array('Hunt.id' => $hid),
'fields' => array('Hunt.nbpartinc','Hunt.nbpart','Hunt.id', 'Hunt.date_ouv', 'Hunt.duree_ouv', 'Hunt.duree', 'Hunt.name')
)
);
$nbpart = $p['part']['Hunt']['nbpartinc'] + 1;
$this->Hunt->id = $p['UsersParticipant']['hunt_id'];
$this->Hunt->saveField('nbpartinc',$nbpart);
if($nbpart == $p['part']['Hunt']['nbpart']) {
$this->Hunt->saveField('statut',2);
if(!isset($p['part']['Hunt']['date_ouv']) || $p['part']['Hunt']['date_ouv'] = '0000-00-00'){
$date_ouv = date("Y/m/d", strtotime('now +'.$p['part']['Hunt']['duree_ouv'].' days'));
$this->Hunt->saveField('date_ouv',$date_ouv);
$date_fin = date("Y/m/d", strtotime($date_ouv+$p['part']['Hunt']['duree'].' days'));
$this->Hunt->saveField('date_fin',$date_fin);
}
App::uses('CakeEmail','Network/Email');
$valide = new CakeEmail();
$valide->from('noreply@dream-pursuit.com')
->to($this->Auth->user('mail'))
->subject('Dream Pursuit | Confirmation de votre paiement')
->emailFormat('html')
->template('valide', 'mailsite')
->viewVars(array('hname'=>$p['part']['Hunt']['name'],'date' => $date))
->send();
}
$date = date("d/m/Y H:i");
$link = array('controller'=>'users','action'=>'chasses_insc');
App::uses('CakeEmail','Network/Email');
$user = new CakeEmail();
$user->from('noreply@dream-pursuit.com')
->to($this->Auth->user('mail'))
->subject('Dream Pursuit | Confirmation de votre paiement')
->emailFormat('html')
->template('paiement_ok', 'mailsite')
->viewVars(array('hname'=>$p['part']['Hunt']['name'],'price'=>$payment_amount, 'date' => $date, 'link' => $link,'nbpart' => $p['part']['Hunt']['nbpart']))
->send();
}
}
// Fin ByNow
}
}
} elseif (strcmp ($res, "INVALID") == 0) {
$hid = $custom['hid'];
$uid = $custom['uid'];
$this->Transaction->save(array(
'price_ht' => $payment_ht,
'tax' => $payment_tax,
'price' => $payment_ht+$payment_tax,
'trans_id' => $txn_id,
'user_id' => $uid,
'hunt_id' => $hid,
'action' => 'Erreur',
'paiement' => 'paypal',
'name' => $name,
'country' => $country,
'city' => $city,
'address' => $address
));
}
}
fclose ($fp);
}
}
function success(){
if( !$this->Auth->user("id")){
throw new NotFoundException();
}
$this->User->id = $this->Auth->user("id");
$this->Session->write('Auth',$this->User->read());
$this->Session->setFlash("Votre paiement a été pris en compte<br />Votre participation à la chasse a été enregistré","notif");
$this->redirect(array('controller'=>'users','action'=>'profil'));
}
function cancel(){
$this->Session->setFlash("Une erreur est survenu lors de votre annulation","notif");
$this->redirect(array('controller'=>'users','action'=>'profil'));
}
}
?>
[/code]
En indiquant directement dans le navigateur l'url de la fonction notify, j'ai bien un retour sur ma base de donnée...
Merci de votre aide et bonne journée.