Bien le coucou,
J'ai suivi le tuto de Grafikart sur la méthode ExpressCheckout, elle est fort sympathique. Tout fonctionne bien jusqu'au moment où je passe dans la partie "process".
(Je précise que je suis bien sur CakePhp et que je ne fais qu'adapter ce qu'il a fait à Cake ^^)

J'ai donc deux fonctions, la première est celle-ci, c'est la fonction de paiement :

function buyBox($price, $name,$produits,$totalPrice,$totalTtc,$fraisPort){      
        $request = array(
            'METHOD' => 'SetExpressCheckout',
            'VERSION' => '111',
            'USER' => Configure::read('Paypal.USER'),
            'PWD' => Configure::read('Paypal.PWD'),
            'SIGNATURE' => Configure::read('Paypal.SIGNATURE'),
            'RETURNURL' => 'http://127.0.0.1/whatsInMyBox/products/paymentsuccess',
            'CANCELURL' => 'http://127.0.0.1/whatsInMyBox/products/payment-cancel',
            'PAYMENTREQUEST_0_AMT' => $totalTtc,
            'PAYMENTREQUEST_0_CURRENCYCODE' => 'EUR',
            'PAYMENTREQUEST_0_SHIPPINGAMT'  => $fraisPort,
            'PAYMENTREQUEST_0_ITEMAMT' => $totalPrice,
        );
        foreach ($produits as $k => $produit) {
            $request"L_PAYMENTREQUEST_0_NAME$k"] = $produit'Product']'title'];
            $request"L_PAYMENTREQUEST_0_AMT$k"] = $produit'Product']'price'];

        }
        $request = http_build_query($request); 
        $responseArray = array();
        parse_str($request,$responseArray);
        $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);
        //useraction=commit >> Permet de voir le bouton payer sur Paypal
        $paypal = 'https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&useraction=commit&token='.$responseArray'TOKEN'];

        if(curl_errno($curl)){
            debug(curl_error($curl)); die();
            curl_close($curl);
            return false;
        }else{
            if($responseArray'ACK'] == 'Success'){
                return $paypal;
            }else{
                debug($responseArray);
                die();
            }
        }
        curl_close($curl);
    }

Cette petite fonction me retourne un tableau :

array(
    'TOKEN' => 'EC-0JM11122434480721',
    'CHECKOUTSTATUS' => 'PaymentActionNotInitiated',
    'TIMESTAMP' => '2014-03-26T23:03:49Z',
    'CORRELATIONID' => 'f29fe09b36de6',
    'ACK' => 'Success',
    'VERSION' => '111',
    'BUILD' => '10277387',
    'EMAIL' => ' ***********',
    'PAYERID' => 'DFKDQRMDPS82J',
    'PAYERSTATUS' => 'verified',
    'FIRSTNAME' => 'christophe',
    'LASTNAME' => 'lablancherie',
    'COUNTRYCODE' => 'FR',
    'SHIPTONAME' => 'christophe lablancherie',
    'SHIPTOSTREET' => 'Av. de la Pelouse, 87648672 Mayet',
    'SHIPTOCITY' => 'Paris',
    'SHIPTOSTATE' => 'Alsace',
    'SHIPTOZIP' => '75002',
    'SHIPTOCOUNTRYCODE' => 'FR',
    'SHIPTOCOUNTRYNAME' => 'France',
    'ADDRESSSTATUS' => 'Unconfirmed',
    'CURRENCYCODE' => 'EUR',
    'AMT' => '48.00',
    'ITEMAMT' => '38.00',
    'SHIPPINGAMT' => '10.00',
    'HANDLINGAMT' => '0.00',
    'TAXAMT' => '0.00',
    'INSURANCEAMT' => '0.00',
    'SHIPDISCAMT' => '0.00',
    'L_NAME0' => 'Bracelet Liberty',
    'L_NAME1' => 'Bracelet Liberty',
    'L_QTY0' => '1',
    'L_QTY1' => '1',
    'L_TAXAMT0' => '0.00',
    'L_TAXAMT1' => '0.00',
    'L_AMT0' => '19.00',
    'L_AMT1' => '19.00',
    'L_ITEMWEIGHTVALUE0' => ' 0.00000',
    'L_ITEMWEIGHTVALUE1' => ' 0.00000',
    'L_ITEMLENGTHVALUE0' => ' 0.00000',
    'L_ITEMLENGTHVALUE1' => ' 0.00000',
    'L_ITEMWIDTHVALUE0' => ' 0.00000',
    'L_ITEMWIDTHVALUE1' => ' 0.00000',
    'L_ITEMHEIGHTVALUE0' => ' 0.00000',
    'L_ITEMHEIGHTVALUE1' => ' 0.00000',
    'PAYMENTREQUEST_0_CURRENCYCODE' => 'EUR',
    'PAYMENTREQUEST_0_AMT' => '48.00',
    'PAYMENTREQUEST_0_ITEMAMT' => '38.00',
    'PAYMENTREQUEST_0_SHIPPINGAMT' => '10.00',
    'PAYMENTREQUEST_0_HANDLINGAMT' => '0.00',
    'PAYMENTREQUEST_0_TAXAMT' => '0.00',
    'PAYMENTREQUEST_0_INSURANCEAMT' => '0.00',
    'PAYMENTREQUEST_0_SHIPDISCAMT' => '0.00',
    'PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED' => 'false',
    'PAYMENTREQUEST_0_SHIPTONAME' => 'christophe lablancherie',
    'PAYMENTREQUEST_0_SHIPTOSTREET' => 'Av. de la Pelouse, 87648672 Mayet',
    'PAYMENTREQUEST_0_SHIPTOCITY' => 'Paris',
    'PAYMENTREQUEST_0_SHIPTOSTATE' => 'Alsace',
    'PAYMENTREQUEST_0_SHIPTOZIP' => '75002',
    'PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE' => 'FR',
    'PAYMENTREQUEST_0_SHIPTOCOUNTRYNAME' => 'France',
    'PAYMENTREQUEST_0_ADDRESSSTATUS' => 'Unconfirmed',
    'PAYMENTREQUEST_0_ADDRESSNORMALIZATIONSTATUS' => 'None',
    'L_PAYMENTREQUEST_0_NAME0' => 'Bracelet Liberty',
    'L_PAYMENTREQUEST_0_NAME1' => 'Bracelet Liberty',
    'L_PAYMENTREQUEST_0_QTY0' => '1',
    'L_PAYMENTREQUEST_0_QTY1' => '1',
    'L_PAYMENTREQUEST_0_TAXAMT0' => '0.00',
    'L_PAYMENTREQUEST_0_TAXAMT1' => '0.00',
    'L_PAYMENTREQUEST_0_AMT0' => '19.00',
    'L_PAYMENTREQUEST_0_AMT1' => '19.00',
    'L_PAYMENTREQUEST_0_ITEMWEIGHTVALUE0' => ' 0.00000',
    'L_PAYMENTREQUEST_0_ITEMWEIGHTVALUE1' => ' 0.00000',
    'L_PAYMENTREQUEST_0_ITEMLENGTHVALUE0' => ' 0.00000',
    'L_PAYMENTREQUEST_0_ITEMLENGTHVALUE1' => ' 0.00000',
    'L_PAYMENTREQUEST_0_ITEMWIDTHVALUE0' => ' 0.00000',
    'L_PAYMENTREQUEST_0_ITEMWIDTHVALUE1' => ' 0.00000',
    'L_PAYMENTREQUEST_0_ITEMHEIGHTVALUE0' => ' 0.00000',
    'L_PAYMENTREQUEST_0_ITEMHEIGHTVALUE1' => ' 0.00000',
    'PAYMENTREQUESTINFO_0_ERRORCODE' => '0'
)

Et du coup après il y a la fonction "paymentsuccess" pour l'envoi vers le paiement réel :

public function paymentsuccess(){
        $request = array(
            'METHOD' => 'GetExpressCheckoutDetails',
            'VERSION' => '111',
            'TOKEN' => $_GET'token'],
            'USER' => Configure::read('Paypal.USER'),
            'PWD' => Configure::read('Paypal.PWD'),
            'SIGNATURE' => Configure::read('Paypal.SIGNATURE'),
        );
        $request = http_build_query($request); 
        $responseArray = array();
        parse_str($request,$responseArray);
        $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);
        if(curl_errno($curl)){
            debug(curl_error($curl)); die();
            curl_close($curl);
            return false;
        }else{
            if($responseArray'ACK'] == 'Success'){
                debug($responseArray);
            }else{
                debug($responseArray);
                die();
            }
        }

        //Passage au paiement direct sans la confirmation
        $response = array(
            'METHOD' => 'DoExpressCheckoutPayment',
            'VERSION' => '111',
            'TOKEN' => $_GET'token'],
            'PAYERID' => $_GET'PayerID'],
            'PAYMENTACTION' => 'Sale',
            'PAYMENTREQUEST_0_AMT' => '48',
            'PAYMENTREQUEST_0_CURRENCYCODE' => 'EUR',
            'USER' => Configure::read('Paypal.USER'),
            'PWD' => Configure::read('Paypal.PWD'),
            'SIGNATURE' => Configure::read('Paypal.SIGNATURE'),
        );
        if($response){
            debug($response);
        }else{
        }
    }

Alors en fait, déjà là j'ai un problème ^^ J'ai le SetExpressCheckout et le DoExpressCheckout dans la même fonction, et je vois pas comment les dissocier... De plus quand je fais comme ça, j'ai un retour d'information mais là où Grafikart à la totalité des informations moi je n'ai que le début... Certains diront "oui mais c'est normal tu ne déclares que ça" et je dirais "oui mais Grafikart aussi ne déclare que ça...^^^La partie de l'éxécution du paiement c'est celle là :

'METHOD' => 'DoExpressCheckoutPayment',
            'VERSION' => '111',
            'TOKEN' => $_GET'token'],
            'PAYERID' => $_GET'PayerID'],
            'PAYMENTACTION' => 'Sale',
            'PAYMENTREQUEST_0_AMT' => '48',
            'PAYMENTREQUEST_0_CURRENCYCODE' => 'EUR',
            'USER' => Configure::read('Paypal.USER'),
            'PWD' => Configure::read('Paypal.PWD'),
            'SIGNATURE' => Configure::read('Paypal.SIGNATURE'),

Si quelqu'un pouvait m'aider sur la translation de la chose de php pure à CakePhp j'en serais bien ravi aimablement, bisous !

1 réponse


Personne n'a de petite idée ? En gros, je cherche à "zapper" la partie intermédiaire du paiement via l'expresscheckout, comme l'indique Grafikart dans son tuto, mais là je vois pas trop comment faire ça -_- :'(