thomas jaunism
thomas jaunism

Reputation: 815

How to send 'description' of products to Paypal express (omnipay)?

I have setup a checkout system with Ominpay and Paypal express and it worked fine in test mode so I just went 'live' with it. Unfortunately I didn't check whether all the information was sent to paypal after checkout. It seems only the amount and currency are getting sent and not the description/name of the products. This means the seller doesn't know what got sold!

N.B: Everything gets sent to the Paypal checkout page fine. But after payment is made the product names don't show up on the seller's paypal page - only the quantity and price do.

How can I get the product names to show up on the seller's paypal account? It will be an array because multiple products will be sold.

If it helps here's the site: http://threemarchhares.sukeates.com/

I'm using Laravel 4. My payments controller:

         public function postPayment() { 



        $cart = Session::get('cart'); 

        $allProducts = [];

        foreach($cart->aContents as $productID=>$quantity){

            $product = Product::find($productID);

            $allProducts[] = array('name' => $product->name, 'quantity' => $quantity, 'price'=> $product->price);
        }

        $params = array( 
            'cancelUrl' => \URL::to('cancel_order'), 
            'returnUrl' => \URL::to('payment_success'), 
            'amount' => Input::get('price'), 
            'currency' => Input::get('currency'), 
            'description' => Input::get('name'),    //I assume this is wrong as it doesn't work.

            ); 


            Session::put('params', $params); 

            Session::save(); 

            $gateway = Omnipay::create('PayPal_Express'); 

            $gateway->setUsername('*****'); 

            $gateway->setPassword('****'); 

            $gateway->setSignature('***'); 

            $gateway->setTestMode(false); 

            $response = $gateway->purchase($params)->setItems($allProducts)->send();

            $data = $response->getData(); 

            if ($response->isSuccessful()) { 
            // payment was successful: update database
                 print_r($response); 

                }  elseif ($response->isRedirect()) { 

                // redirect to offsite payment gateway 
                    $response->redirect(); 

                } else { 

                    // payment failed: display message to customer 
                    echo $response->getMessage();

                 } 

            } 

        public function getSuccessPayment() 
            {   
                $gateway = Omnipay::create('PayPal_Express');
                $gateway->setUsername('****'); 
                $gateway->setPassword('****'); 
                $gateway->setSignature('*****'); 
                $gateway->setTestMode(false); 

                $params = Session::get('params'); 

                $response = $gateway->completePurchase($params)->send(); 
                $paypalResponse = $response->getData(); // this is the raw response object 

                if(isset($paypalResponse['PAYMENTINFO_0_ACK']) && $paypalResponse['PAYMENTINFO_0_ACK'] === 'Success') {

etc

Upvotes: 1

Views: 748

Answers (2)

Ben Jenkinson
Ben Jenkinson

Reputation: 1834

You need to send the item information again, when you send the 'completePurchase' request.

$response = $gateway->completePurchase($params)->setItems($allProducts)->send();

Upvotes: 0

zub0r
zub0r

Reputation: 1379

Your assumption is correct. It is a bad idea in general to fill payment data from input. Instead you should use data from your product:

'amount' => $product->price, 
'currency' => 'USD', 
'description' => $product->description,

Otherwise the user can modify the price in html and enjoy cheap checkout ;)

Upvotes: 2

Related Questions