Bonjour,
Je reviens vers vous après de nombreuses tentatives de mon côté..
Il y a plusieurs jours que je suis bloqué sur ce sujet!!
Quelqu'un a une idée pour m'orienter ? Votre aide serait grandement appréciée.
J'essaie juste d'apprendre en appliquant à la lettre le tuto Créer un système d'abonnement.
Au niveau de mes tests, la transaction s'effectue correctement sur sandbox de paypal quand je souscris un abonnement.
Le compte vendeur est bel et bien crédité. Par contre il n'y a aucune répercussion sur ma base de données, aucun enregistrement ne s'effectue.
La récupération des données de paypal ne se fait pas !
Je travaille sur un serveur VPS.
voici le résultat du debug de la transaction :

/app/Model/Transaction.php (line 48)
array(
    'WEBSITECODE' => '<form target="_top" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="9T7KJVGXDQ3EU">
<input type="image" src="https://www.sandbox.paypal.com/fr_FR/FR/i/btn/btn_buynow_LG.gif" border="0" name="submit" alt="PayPal - la solution de paiement en ligne la plus simple et la plus sécurisée !">
<img alt="" border="0" src="https://www.sandbox.paypal.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>
',
    'EMAILLINK' => 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9T7KJVGXDQ3EU',
    'HOSTEDBUTTONID' => '9T7KJVGXDQ3EU',
    'TIMESTAMP' => '2014-11-07T13:58:32Z',
    'CORRELATIONID' => 'e64fed9e4e2cd',
    'ACK' => 'Success',
    'VERSION' => '87',
    'BUILD' => '000000'
)

Sauf que je ne récupère rien dans la base de données et je ne génère pas le fichier log !!
Voici le code de notification Paypal :

<?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.1\r\n";
        $header .= "Host: www.".PP_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.'.PP_sandbox.'paypal.com', 443, $errno, $errstr, 30);

        $item_name = $_POST'item_name'];
        $item_number = $_POST'item_number'];
        $payment_status = $_POST'payment_status'];
        $payment_amount = $_POST'mc_gross'];
        $payment_tax = $_POST'tax'];
        $payment_ht = $payment_amount - $payment_tax; 
        $payment_currency = $_POST'mc_currency'];
        $address = $_POST'address_street'];
        $country = $_POST'address_country'];
        $city = $_POST'address_city'];
        $name = $_POST'address_name'];
        $txn_id = $_POST'txn_id'];
        $receiver_email = $_POST'receiver_email'];
        $payer_email = $_POST'payer_email'];
        parse_str($_POST'custom'],$custom);
        //$this->log($_POST,'paypal', $custom); die();

        if (!$fp) {

        } else {
        fputs ($fp, $header . $req);
        while (!feof($fp)) {
            $res = fgets ($fp, 1024);
            if (strcmp ($res, "VERIFIED") == 0) {
                // vérifier que payment_status a la valeur Completed
                if ( $payment_status == "Completed") {
                       if ( $email_account == $receiver_email) {

                            if($custom'action'] == 'subscribe'){
                                $duration = $custom'duration'];
                                $uid = $custom'uid']; 
                                if($payment_ht == Configure::read("Site.prices.$duration")){

                                    $this->Transaction->save(array(
                                        'price' => $payment_ht,
                                        'tax' => $payment_tax,
                                        'txnid' => $txn_id,
                                        'user_id'=> $uid,
                                        'action' => 'subscribe',
                                        'amount' => $duration,
                                        'name'=> $name,
                                        'country'=> $country,
                                        'city' => $city,
                                        'address'=> $address
                                    ));

                                    $this->User->id = $uid; 
                                    if($this->User->field('premium')){
                                        $end = $this->User->field('end_subscribtion');
                                        $date = new DateTime($end);
                                    }else{
                                        $date = new DateTime();
                                    }

                                    $date->add(new DateInterval('P'.$duration.'M'));
                                    $this->User->saveField('end_subscribtion',$date->format('Y-m-d H:i:s'));

                                }else{
                                    $this->log("Paiement $duration mois = $payment_ht Ne correspond pas ",'paypal'); 
                                }
                            }

                       }
                }
                else {
                        // Statut de paiement: Echec
                }
                exit();
           }
            else if (strcmp ($res, "INVALID") == 0) {
                // Transaction invalide
            }
        }
        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->redirect(array('controller'=>'users','action'=>'edit'));
        //$this->session->setFlash("","notify"); //On peut mettre un message flash personnalisé -Tout s est bien déroulé-
    }
    function cancel(){

    }

}

Merci pour votre aide.

4 réponses


The-Devil
Réponse acceptée

Bonsoir,

J'ai exactement le même problème, j'essai moi aussi de faire un système de paiements avec CakePHP.
Une des choses que j'ai essayé est de préciser la version 119 et non 87 comme présenté dans le tutoriel. Cela n'a pas résolu mon problème, J'ai donc chercher plus loin et je pense avoir cerné mon problème. Le problème étant que mon serveur n'autorise pas Paypal à communiquer avec lui. J'ai donc fait une demande à mon hébergeur de modifier la configuration de mon serveur.

Enfin bref, le problème vient surement de ton serveur. As-tu essayé l'IPN simulator de Paypal ?

En espérant t'avoir aidé un peu haha
Cordialement,

The-Devil

agmedia
Auteur
Réponse acceptée

Merci pour ton soutien. Je suis désespéré !!
J'ai contacté mon hébergeur, il dit que le problème ne vient pas de chez-eux.
Enfin,je vais essayer IPN simulator de Paypal.
Merci merci merci infiniment...
Très cordialement
agmedia

agmedia
Auteur
Réponse acceptée

Voici la réponse de IPN simulator :
Nous ne pouvions pas envoyer un IPN en raison d'une erreur HTTP 404: Introuvable
et voila la réponse de mon hébérgeur (copier/coller):

Bonjour,
Parce que le l'IP de votre serveur pointe sur le vhost par défaut de apache, d'ou le fait que si vous renseignez l'adresse IP de votre serveur, le navigateur vous renvoie it works et non le vhost que vous avez créer via l'interface de ISpconfig.
Il est déconseillé de modifié ce paramètre.
Si vous souhaitez le faire, vous pouvez depuis un terminal de commande.
Cordialement

Bizarre comme réponse, n'est ce pas ! et plein de fautes d'horthographe !!
Merci encore
cordialement
agmedia

The-Devil
Réponse acceptée

Hmm.. Est-ce que la page existe bel et bien ? Sinon, regarde au niveau des fichier .htaccess s'il n'y a pas une redirection qui est faite quelque part.

Sinon je sais vraiment pas.
De mon côté ça n'a pas avancé non plus, j'ai éssayé d'appeler le Service clientèle de Paypal. Le téléphone sonne depuis 2h mnt haha :D
Bonne chance à toi en tout cas.

Cordialement,
The-Devil