Bien le coucou,
Bon j'avance un peu dans l'adaptation du tuto sur ExpressCheckout en passant de Php à CakePhp. J'ai cependant une petite erreur qui n'en est pas vraiment une.
Je m'explique. Lorsque je me rend sur le site de Paypal via la SandBox, je procède au paiement. Je suis réorienté vers mon site internet en local, ce qui en soi est logique. Je suis orienté vers la page "Process" de mon site, car comme l'explique le tuto de GA, on peut "zapper" la page de confirmation.
Seulement, lorsque j'arrive sur cette page, j'ai en retour Paypal (A successful transaction has already been completed for this token" - "duplicate request" etc. (Message complet ci-dessous).
Par conséquent je comprends que la transaction est normalement passée. MAIS, lorsque je regarde le compte paypal de test, je vois que le paiement n'a pas eu de retour (il a en statut "Non récupéré"), comme si en gros la fonction "DoExpressCheckout" n'avait pas fonctionné à 100%...
Si quelqu'un pouvait allumer les ampoules que j'ai dans la tête, ça m'arrangerait bien ^^ (Si Grafikart passe dans le coin, j'accepte aussi :D )
Si dessous, le code du process + le retour Paypal sur la page Process.
EDIT : Quand un paiement a été effectué, j'ai en retour "Pending" et non "Completed" comme dans le tuto de grafikart...J'adapte son tuto mais là je crois qu'il me manque un truc :'(
URL de retour suite à la transaction :
http://localhost:8888/whatsInMyBox/products/process?token=EC-6NR58234KW3786343&PayerID=DFKDQRMDPS82J
Données de retour sur le debug de la page process (Il y a aussi une multicurrency alors que je n'envoie que des EUR...) :
/app/Controller/ProductsController.php (line 222)
array(
'TOKEN' => 'EC-6NR58234KW3786343',
'SUCCESSPAGEREDIRECTREQUESTED' => 'false',
'TIMESTAMP' => '2014-04-22T11:58:49Z',
'CORRELATIONID' => '97c1322e7069e',
'ACK' => 'SuccessWithWarning',
'VERSION' => '111',
'BUILD' => '10683261',
'L_ERRORCODE0' => '11607',
'L_SHORTMESSAGE0' => 'Duplicate Request',
'L_LONGMESSAGE0' => 'A successful transaction has already been completed for this token.',
'L_SEVERITYCODE0' => 'Warning',
'INSURANCEOPTIONSELECTED' => 'false',
'SHIPPINGOPTIONISDEFAULT' => 'false',
'PAYMENTINFO_0_TRANSACTIONID' => '40C00281CN908744G',
'PAYMENTINFO_0_TRANSACTIONTYPE' => 'expresscheckout',
'PAYMENTINFO_0_PAYMENTTYPE' => 'instant',
'PAYMENTINFO_0_ORDERTIME' => '2014-04-22T11:58:15Z',
'PAYMENTINFO_0_AMT' => '43.35',
'PAYMENTINFO_0_TAXAMT' => '0.00',
'PAYMENTINFO_0_CURRENCYCODE' => 'EUR',
'PAYMENTINFO_0_PAYMENTSTATUS' => 'Pending',
'PAYMENTINFO_0_PENDINGREASON' => 'multicurrency',
'PAYMENTINFO_0_REASONCODE' => 'None',
'PAYMENTINFO_0_PROTECTIONELIGIBILITY' => 'Eligible',
'PAYMENTINFO_0_PROTECTIONELIGIBILITYTYPE' => 'ItemNotReceivedEligible,UnauthorizedPaymentEligible',
'PAYMENTINFO_0_SECUREMERCHANTACCOUNTID' => 'Y93FWWGCE8J7E',
'PAYMENTINFO_0_ERRORCODE' => '0',
'PAYMENTINFO_0_ACK' => 'Success'
)
Code de la fonction process (donc celle qui doit effectuer le paiement si je ne me trompe pas !) :
<?php
public function process(){
$request = array(
'METHOD' => 'GetExpressCheckoutDetails',
'VERSION' => '111',
'TOKEN' => $_GET'token'],
'PayerID' => $_GET'PayerID'],
'USER' => Configure::read('Paypal.USER'),
'PWD' => Configure::read('Paypal.PWD'),
'SIGNATURE' => Configure::read('Paypal.SIGNATURE'),
);
$request = http_build_query($request);
$curl = curl_init();
$curlOptions = array(
CURLOPT_URL => "https://api-3t.".Configure::read('Paypal.sandbox')."paypal.com/nvp",
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $request,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_CAINFO => APP.'Vendor'.DS.'cacert.pem',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_VERBOSE => 1
);
curl_setopt_array($curl,$curlOptions);
$response = curl_exec($curl);
$responseArray = array();
parse_str($response,$responseArray);
/* ----------- PROCESS DIRECT -----------*/
$requestPayment = array(
'METHOD' => 'DoExpressCheckoutPayment',
'VERSION' => '111',
'TOKEN' => $_GET'token'],
'PayerID' => $_GET'PayerID'],
'PAYMENTACTION' => 'Sale',
'PAYMENTREQUEST_0_AMT' => $responseArray'AMT'],
'PAYMENTREQUEST_0_CURRENCYCODE' => 'EUR',
'USER' => Configure::read('Paypal.USER'),
'PWD' => Configure::read('Paypal.PWD'),
'SIGNATURE' => Configure::read('Paypal.SIGNATURE'),
);
$requestPayment = http_build_query($requestPayment);
$curl = curl_init();
$curlOptions = array(
CURLOPT_URL => "https://api-3t.".Configure::read('Paypal.sandbox')."paypal.com/nvp",
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $requestPayment,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_CAINFO => APP.'Vendor'.DS.'cacert.pem',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_VERBOSE => 1
);
curl_setopt_array($curl,$curlOptions);
$response = curl_exec($curl);
$responseArray = array();
parse_str($response,$responseArray);
if(curl_errno($curl)){
debug(curl_error($curl)); die("Erreur");
curl_close($curl);
return false;
}else{
if($responseArray'ACK'] == 'Success'){
return($responseArray);
die();
}else{
debug($responseArray);
die();
}
}
curl_close($curl);
}
Merci à vous !
Bon bah je vais m'auto-flagellé.
Si j'avais un statut Pending (Avec multicurrencies), et non Completed c'est parce-que mon buyer était en monnaie US et non FR comme l'acheteur. Voilà, et je n'avais pas vu cette petite chose là.
Merci moi-même XD