Bonjour à tous,
Je reviens sur paypal et j'ai comme l'impression d'avoir oublier des truc :)

J'essaye d'implémenter Paylpal grâce à ce plugin que j'ai trouvé, qui me semble bien
https://github.com/robmcvey/cakephp-paypal/blob/master/README.md

J'ai copié le plugin dans /App/Plugin/Paypal
et j'ai aussi ajouté dans bootstrap.php

CakePlugin::load('Paypal');

Maintenant, il demande de créer une instance ainsi

App::uses('Paypal', 'Paypal.Lib');
$this->Paypal = new Paypal(array(
    'sandboxMode' => true,
    'nvpUsername' => '{username}',
    'nvpPassword' => '{password}',
    'nvpSignature' => '{signature}'
));

Mais dans quel fihier je dois le faire?

Dans
AppController.php?
AppModel.php?
BasketsController.php? C'est mon controller qui gere le panier
Basket.php?

je devine que le code se trouvant sous SetExpressCheckout, ira dans BasketsController.php, donc la création de l'instence ne devrait pas être dans le modele Basket.php? Ca me semble plus juste.

Merci pour votre avis!!

8 réponses


Bonjour, personne ne peut me mettre sur la piste?
Je pense que je dois le mettre dans mon modèle Basket.php ainsi

public function beforeFilter(){
   App::uses('Paypal', 'Paypal.Lib');
   $this->Paypal = new Paypal(
      array(
      'sandboxMode' => true,
      'nvpUsername' => 'monUserName',
      'nvpPassword' => 'myPassword',
      'nvpSignature' => 'mySignature')
);
}

que les {username} doivent etre remplacer par le nom d'utilisateur.
Mais je suis toujours dans l'incertitude et surtout concernant la suite avec SetExpressCheckout.

Si vous aviez une expérience pour me mettre dans le bon chemin, ca serait grandement apprécié
Milles mercis

Bonsoir.
Dans la fonction du controller dans laquelle tu utilises le plugin.

Create an instance of the class

Créer une instance dans la classe.
Ce n'est pas assez clair pour toi ?
Ce que tu peux faire si tu veux, c'est de mettre dans ton fichier bootstrap.php :

Configure::write('Paypal', [
    'Sandbox' => [
        'sandboxMode' => true, 
        'nvpUsername' => 'tonUsername', 
        'nvpPassword' => 'tonPassword', 
        'nvpSignature' => 'taSignature'
        ]
    ]
);

De cette manière, quand tu veux faire ton test, au lieu de réécrire touts les informations pour les tests, il te suffira de faire :
Dans la fonction du controller

App::uses('Paypal', 'Paypal.Lib');
$this->Paypal = new Paypal(Configure::read('Paypal.Sandbox'));
/* le reste de ton code */

P.S. : Quand vous demandez de l'aide, faites au moins l'effort de donner des liens d'URL corrects.

Salut Lartak,
Merci pour ta réponse.
(J'ai corrigé le lien :o( . )

D'ccord, je vois et j'aime bien ta solution. Je vais essayé ceci.
Milles merci

Hello,
il y a un petit truc que je ne comprends pas dans le code que tu propose

Configure::write('Paypal', [
    'Sandbox' => [
        'sandboxMode' => true, 
        'nvpUsername' => 'tonUsername', 
        'nvpPassword' => 'tonPassword', 
        'nvpSignature' => 'taSignature'
        ]
    ]
);

Si je le compare avec

App::uses('Paypal', 'Paypal.Lib');
   $this->Paypal = new Paypal(
      array(
      'sandboxMode' => true,
      'nvpUsername' => 'monUserName',
      'nvpPassword' => 'myPassword',
      'nvpSignature' => 'mySignature')
);

Pourquoi 'Sandbox'=>, sil y a deja 'sendboxmode' =>true.
Y-a-t-il une raison pour cet ajour? ou j'ai pas compris
https://github.com/robmcvey/cakephp-paypal/blob/master/README.md
Merci

J'ai mis Sandbox en Clé supplémentaire, de manière à pouvoir avoir 2 configurations selon si tu fais un test ou non.
Par exemple :

Configure::write('Paypal', [
    'Sandbox' => [
        'sandboxMode' => true, 
        'nvpUsername' => 'tonUsernameEnModeSandbox', 
        'nvpPassword' => 'tonPasswordEnModeSandbox', 
        'nvpSignature' => 'taSignatureEnModeSandbox'
    ], 
    'Online' => [
        'sandboxMode' => false, 
        'nvpUsername' => 'tonUsernameEnModeOnline', 
        'nvpPassword' => 'tonPasswordEnModeOnline', 
        'nvpSignature' => 'taSignatureEnModeOnline'
    ]
]);

De cette manière, pendant des tests, tu utilises :

$this->Paypal = new Paypal(Configure::read('Paypal.Sandbox'));

Et lorsque tu passes ton site en ligne et donc fonctionnel pour les utilisateurs :

$this->Paypal = new Paypal(Configure::read('Paypal.Online'));

Comme ça tu bascules rapidement entre les deux identifications : Version test et version finale.
Sinon, si tu préfères, tu n'utilises pas de clé supplémentaire, tu fais deux Configure::write('Paypal') dans ton bootstrap.php et tu fais une condition sur l'environnement.
Par exemple :

if ($_SERVER['SERVER_ADDR'] == '127.0.0.1') {
    Configure::write('Paypal', [
        'sandboxMode' => true, 
        'nvpUsername' => 'tonUsernameEnModeSandbox', 
        'nvpPassword' => 'tonPasswordEnModeSandbox', 
        'nvpSignature' => 'taSignatureEnModeSandbox'
    ]);
} else {
    Configure::write('Paypal', [
        'sandboxMode' => false, 
        'nvpUsername' => 'tonUsernameEnModeOnline', 
        'nvpPassword' => 'tonPasswordEnModeOnline', 
        'nvpSignature' => 'taSignatureEnModeOnline'
    ]);
}

Et lorsque tu utilises l'API, tu définis :

$this->Paypal = new Paypal(Configure::read('Paypal'));

À toi de voir comment tu veux le faire, dans les deux cas, le compte Paypal de test et le final ne sont pas les mêmes, donc les identifiants pour l'API non plus.

Salut Lartak,
Milles mercis pour ces précisions!!!!!
J'ai un autre petit problème que je ne peux résoudre avant demain, mais tes précisions vont m'aider demain.

De rien.
Après, je ne fais que te donner des exemples, par la suite tu t'organises comme tu préfères.

Salut Lartak,
Ecoute ca ne marche pas :o(....

$order = array(
    'description' => 'Your purchase with Acme clothes store',
    'currency' => 'GBP',
    'return' => 'https://www.my-amazing-clothes-store.com/review-paypal.php',
    'cancel' => 'https://www.my-amazing-clothes-store.com/checkout.php',
    'custom' => 'bingbong',
    'shipping' => '4.50',
    'items' => array(
        0 => array(
            'name' => 'Blue shoes',
            'description' => 'A pair of really great blue shoes',
            'tax' => 2.00,
            'subtotal' => 8.00,
            'qty' => 1,
        ),
        1 => array(
            'name' => 'Red trousers',
            'description' => 'Tight pair of red pants, look good with a hat.',
            'tax' => 1.50,
            'subtotal' => 6.00,
            'qty' => 3,
        ),
    )
);
 try {
    $this->Paypal->setExpressCheckout($order);
} catch (Exception $e) {
        debug($e->getMessage());
} 

Le debug ne m'affiche rien, donc le try est executé. Je ne sais pas trop ou sa bloque.
Es-ce que tu (ou quelqu'un d'autre) connaitrait un bon tuto clair pour mettre en place paypal?

En résumé, j'ai fait comme ceci.

Dans boostrap.php, j'ai mis ceci:

$sandbox = true;
//if ($_SERVER['SERVER_ADDR'] == '127.0.0.1') {
 if($sandbox){
    Configure::write('Paypal', array(
        'sandboxMode' => true, 
        'nvpUsername' => 'user_api1.monsite.net', 
        'nvpPassword' => 'B3Q7ZHRT5464F', // Il est faut!! 
        'nvpSignature' => 'AfgiAyCG-0ZrxTzb47.d8/&53gdudf.-,a847urhdjszueirU/&tzE1' // La signature est fausse aussi
    ));
}else {
    Configure::write('Paypal', array(
        'sandboxMode' => false, 
        'nvpUsername' => 'user_api1.monsite.net', 
        'nvpPassword' => 'B3Q7ZHRT5464F', // Il est faut!! 
        'nvpSignature' => 'AfgiAyCG-0ZrxTzb47.d8/&53gdudf.-,a847urhdjszueirU/&tzE1' // La signature est fausse aussi
    ));
}

Puis dans mon controller BasketController.php, j'ai mis ceci


    function orderconfirm(){
    [... code ...]
    if($basket['Basket']['method']=="paypal"){
                        App::uses('Paypal', 'Paypal.Lib');

                        $this->Paypal = new Paypal(Configure::read('Paypal'));

                        //debug($this->Paypal);

                        $order = array(
                            'description' => 'Your purchase with Acme clothes store',
                            'currency' => 'GBP',
                            'return' => 'https://www.les-sites.com/baskets/reviewpaypal/',
                            'cancel' => 'https://www.les-sites.com/baskets/checkout/',
                            'custom' => 'bingbong',
                            'shipping' => '4.50',
                            'items' => array(
                                0 => array(
                                    'name' => 'Blue shoes',
                                    'description' => 'A pair of really great blue shoes',
                                    'tax' => 2.00,
                                    'subtotal' => 8.00,
                                    'qty' => 1,
                                ),
                                1 => array(
                                    'name' => 'Red trousers',
                                    'description' => 'Tight pair of red pants, look good with a hat.',
                                    'tax' => 1.50,
                                    'subtotal' => 6.00,
                                    'qty' => 3,
                                ),
                            )
                        );

                        try {
                            $this->Paypal->setExpressCheckout($order);

                        } catch (Exception $e) {
                             //debug($e->getMessage());
                             $this->Session->setFlash($e->getMessage(),"notif");
                        }   

                        //debug($order);

                        /*
                        END PAYPAL
                        */

                    }else{
                    [...code...]

Théoriquement, à cette étape on devrait avoir une page de paypal??
De mon coté, il y a absolument rien qui se passe!!!