Bonjour, je reviens à nouveau avec un autre soucis.
Je suis entrain de développer un site de vente en ligne en PHP-SYMFONY, et maintenant je suis calé au niveau de l'API de paypal pour le paiement.
Je vais expliqué ma procédure:
1- J'ai créé un nouveau bundle pour cela, et dans les services j'ai déclaré les paramètres de connexion à l'api.
#PaiementBundle\Ressources\Config\service.yml
parameters:
paypalUsername: XXXXXXXXXXXXXXXXXXXXX
paypalPassword: XXXXXXXXXXXXXXXXXXXXX
paypalSignature: XXXXXXXXXXXXXXXXXXXX
method: SetExpressCheckout
services:
paiement.payPal:
class: PaiementBundle\Services\Paypal
arguments: ["%paypalUsername%", "%paypalPassword%", "%paypalSignature%", "%method%"]
2- Maintenant j'ai créer la fameuse classe dans le répertoires Services
<?php
//PaiementBundle\Services\Paypal.php
namespace PaiementBundle\Services;
class Paypal{
private $username;
private $password;
private $signature;
private $method;
public function __construct($username, $password, $signature, $method){
$this->username=$username;
$this->password=$password;
$this->signature=$signature;
$this->method=$method;
}
public function getParams(){
$parameters=array(
'methode'=> $this->method,
'compte'=>$this->username,
'mdp'=>$this->password,
'sign'=>$this->signature
);
return $parameters; // Renvoie le tableau contenant tous nos paramètres.
}
public function getUsername(){
return $this->username;
}
public function getPassword(){
return $this->password;
}
public function getSignature(){
return $this->signature;
}
public function getMethod(){
return $this->method;
}
}
3- J'ai essayer maintenant dans les controller PayPalContoller j'ai appeler mon service PayPal et j'ai traité les données:
Vous allez constaté que j'ai commenté plusieurs lignes qui me servaient de test pour retourner les paramétres de la classe. Et après je renvois un Response pour pouvoir le forwarder dans mon controller du bundle de base. $commande['prix'] est le prix stocker en session, vous pouvez le remplacer par une valeur entière ou flottante juste pour le test.
<?php
//PaiementBundle\Controller\PayPalController.php
namespace PaiementBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Session\Session;
class PayPalController extends Controller
{
public function payerAction()
{
$session = new Session();
$commande=$session->get('Commande');
//$requete=$this->container->get('paiement.payPal')->getParams();
$paypal=$this->container->get('paiement.payPal'); //service On recupere la methode du getParams du service
$params=array(
'METHOD'=> $paypal->getMethod(),
'VERSION'=> '204.0',
'USER'=>$paypal->getUsername(),
'PWD'=>$paypal->getPassword(),
'SIGNATURE'=>$paypal->getSignature(),
'RETURNURL'=>$this->render('PaiementBundle:Default:return.html.twig'),
'CANCELURL'=>$this->render('PaiementBundle:Default:cancel.html.twig'),
'PAYMENTREQUEST_0_AMT'=> $commande['prix'],
'PAYMENTREQUEST_0_CURRENCYCODE'=>'EUR'
/*'METHOD'=> $requete['methode'],
'VERSION'=> '204.0',
'USER'=>$requete['compte'],
'SIGNATURE'=> $requete['sign'],
'PWD'=>$requete['mdp'],
'RETURNURL'=>$this->render('PaiementBundle:Default:return.html.twig'),
'CANCELURL'=>$this->render('PaiementBundle:Default:cancel.html.twig'),
'PAYMENTREQUEST_0_AMT'=> $commande['prix'],
'PAYMENTREQUEST_0_CURRENCYCODE'=>'EUR'*/
/*
'METHOD'=>$this->container->getParameter('method'),
'VERSION'=> '204.0',
'USER'=>$this->container->getParameter('paypalPassword'),
'SIGNATURE'=>$this->container->getParameter('paypalSignature'),
'PWD'=>$this->container->getParameter('paypalPassword'),
'RETURNURL'=>$this->render('PaiementBundle:Default:return.html.twig'),
'CANCELURL'=>$this->render('PaiementBundle:Default:cancel.html.twig'),
'PAYMENTREQUEST_0_AMT'=> $commande['prix'],
'PAYMENTREQUEST_0_CURRENCYCODE'=>'EUR'*/
);
$paypalUrl = 'https://api-3t.sandbox.paypal.com/nvp?'; // Site de l'API PayPal. On ajoute déjà le ? afin de concaténer directement les paramètres.
$curl= curl_init();
curl_setopt_array($curl,array(
CURLOPT_URL => $paypalUrl, //L'url de traitement
CURLOPT_POST => 1, //Les parametres seront envoyés par la method POST
CURLOPT_POSTFIELDS => http_build_query($params), //On defini les champs de la requete
CURLOPT_RETURNTRANSFER => 1, //On demande à ne pas afficher les informations mais plutot de les returner
CURLOPT_SSL_VERIFYPEER => false, //Empecher l'utilisation du SSL pour le certificat
CURLOPT_SSL_VERIFYHOST => false, //Empecher l'utilisation du SSL pour le host
CURLOPT_VERBOSE => 1 //S'il y a des erreurs qu'il nous le communique clairement
));
$response = curl_exec($curl); // Nous allons maintenant executer notre requete
curl_close($curl); //Maintenant nous allons fermer notre requete
return new Response($response);
}
}
4- Maintenant mon controller du bundle de base je fais appel au précédant controller en le forwardant et recuperer la reponse
Cependant, il faut savoir que j'ai stoquer la commande en session avec la methode setCommandePaiementOnSession() et je forward le controller payer.
public function paiementAction(){
if($this->get('request')->getMethod()=='POST'){
$this->setCommandePaiementOnSession();
}
$payer=$this->forward('PaiementBundle:PayPal:payer');
$responseArray=array();
parse_str($payer->getContent(),$responseArray);
var_dump($responseArray);
return $this->render('SaressoSaressoBundle:Default:panierPaiement.html.twig');
}
Maintenant quand je fait un var_dump de la reponse je rencontre une erreur venant de paypal
C:\wamp64\www\Saresso\src\Saresso\SaressoBundle\Controller\PanierController.php:316:
array (size=9)
'TIMESTAMP' => string '2017-08-04T13:43:22Z' (length=20)
'CORRELATIONID' => string '546621b0cbc5b' (length=13)
'ACK' => string 'Failure' (length=7)
'VERSION' => string '204.0' (length=5)
'BUILD' => string '000000' (length=6)
'L_ERRORCODE0' => string '10002' (length=5)
'L_SHORTMESSAGE0' => string 'Security error' (length=14)
'L_LONGMESSAGE0' => string 'Security header is not valid' (length=28)
'L_SEVERITYCODE0' => string 'Error' (length=5)
Merci d'avance pour vos réponses et j'espère avoir une solution car j'ai galéré deux jours la dessus.
Vous pouvez le tester en mettant vos propres identifiant du paypal SandBox. Merci