Bonjour à tous,

Je reviens vers vous pour un petit soucis avec le tuto sur Paypal...
Le paiement s'effectue bien, le retour Paypal se fait bien aussi. Mais il se fait d'ailleurs peut être trop bien. Dans le fichier Log je n'ai pas UN retour Paypal, mais 3 voir 5 à 1min d'intervalle... Pourquoi ? Est-ce normal ?

De plus, rien ne s'enregistre dans ma table Transaction, donc concrètement, l'utilisateur ne sait pas jusqu'à quand il est abonné, car la date n'apparaît donc pas dans sa partie "Mon compte"...

Extrait du code PaypalController.php

[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://www.'.Configure::read('Paypal.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');//log les infos dans un fichier qu'on appelle Paypal

    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'));
}
function cancel(){

}[/code]

Donc en fait, il va jusqu'à la fonction success, il redirige bien vers Edit, mais j'ai l'impression que la fonction Notify, bah il s'en fout complètement enfait...

Fonction subscribe dans UserController.php :

[code] function subscribe(){
if(!$this->Auth->user('id')){

            $this->redirect('/users/connect'); 
        }
        if(!empty($this->request->data)){
            $duration = $this->request->data['duration'];
            $uid = $this->Auth->user('id');
            if(Configure::read("Site.Prices.$duration")){
                $price = number_format(Configure::read("Site.Prices.$duration"),2);
                $this->loadModel('Transaction');
                $url = $this->Transaction->requestPaypal($price,"Abonnement box $duration mois","action=subscribe&uid=$uid&duration=$duration");
                if($url){
                    $this->redirect($url);
                }

            }
        }
    }[/code]

Donc normalement elle renvoi après vers Transaction...(A suivre ^^)

[code]<?php
class Transaction extends AppModel{

function requestPaypal($price, $name, $custom){
    $request = array(
        'METHOD'        => 'BMCreateButton',
        'VERSION'       => '87',
        'USER'          => Configure::read('Paypal.USER'),
        'PWD'           => Configure::read('Paypal.PWD'),
        'SIGNATURE'     => Configure::read('Paypal.SIGNATURE'),
        'BUTTONCODE'            => 'HOSTED',
        'BUTTONTYPE'            => 'BUYNOW',
        'BUTTONSUBTYPE'         => 'SERVICES',
        'L_BUTTONVAR0'          => 'business='.Configure::read('Paypal.mail'),
        'L_BUTTONVAR1'          => "item_name=$name",
        'L_BUTTONVAR2'          => "amount=$price",
        'L_BUTTONVAR3'          => "currency_code=EUR",
        'L_BUTTONVAR4'          => "no_note=1",
        'L_BUTTONVAR5'          => "notify_url=".Router::url('/paypal/notify',true),
        'L_BUTTONVAR6'          => "return=".Router::url('/paypal/success',true),
        'L_BUTTONVAR7'          => "cancel=".Router::url('/paypal/cancel',true),
        'L_BUTTONVAR8'          => "custom=$custom",
    );

    $request = http_build_query($request); 

    $curlOptions = array(
        CURLOPT_URL => "https://api-3t.".Configure::read('Paypal.sandbox')."paypal.com/nvp",
        CURLOPT_VERBOSE => 1,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_SSL_VERIFYHOST => 1,
        CURLOPT_CAINFO         => APP.'Vendor'.DS.'cacert.pem',
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_POSTFIELDS     => $request
    );

    $ch = curl_init();
    curl_setopt_array($ch,$curlOptions);
    $response = curl_exec($ch);

    if(curl_errno($ch)){
        debug(curl_error($ch)); die();
        return false;
    }else{
        curl_close($ch);
        parse_str($response,$responseArray);
        return $responseArray['EMAILLINK'];
    }
}

}[/code]

Auriez-vous une idée ? Une solution ?
Parce que là j'avoue que je suis totalement perdu... Merci d'avance !

Aucune réponse