2

This question is maybe similar to THIS and THIS but I'm not entirely sure.

I've made a shopping cart that sends the product details and quantity/total amount to Paypal on checking out. I'm using Laravel 4 and the Omnipay Paypal plugin (Paypal_Express). I can send product details fine using the 'setItems' function and am now looking to pre-populate the credit card field on the Paypal summary page with my User's details.

I have seen in other SO threads such as THIS that other people use the creditCard function to pass details to the Paypal summary credit card info page.

My question: 1) Do you need to be using Paypal_Pro for the creditCard function to worK? I get this error when I try (call_user_func_array() expects parameter 1 to be a valid callback, class 'Omnipay\Common\GatewayFactory' does not have a method 'creditCard').

I don't want to enter all the credit card details - Just speed the process up by entering the User's Name, Adress etc...

Also I tried changing to Paypal_Pro and it didn't work. (same error as above) I changed config plus gateways in my payment controller.

2)How do you change PayPal_Express to PayPay_Pro?

My code:

 public function postPayment() { 


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

        $allProducts = [];

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

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

            // get the product id
            // load the product from the id
            // store data in the allProduct array
            $allProducts[] = array('name' => $product->name, 'quantity' => $quantity, 'price'=> $product->price);
        }

        $cardInput = array(

            'first_name' => Input::get('first_name'),
            'last_name' => Input::get('last_name'),
            'address1' => Input::get('address1'),
            'city' => Input::get('city'),
            'zip' => Input::get('zip'),
            'email' => Input::get('email')

            );

        $card = Omnipay::creditCard($cardInput);

        $params = array( 
            'cancelUrl' => \URL::to('cancel_order'), 
            'returnUrl' => \URL::to('payment_success'), 
            'amount' => Input::get('price'), 
            'currency' => Input::get('currency'), 
            'card' => $card,    

            ); 

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

            Session::save(); 

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

            $gateway->setUsername('tjmusicmanagement-facilitator_api1.gmail.com'); 

            $gateway->setPassword('K2LWQVP2L8472BPY'); 

            $gateway->setSignature('AwTOuAJWzCkdc5PldYeiz.l3iy5UAwOucYW6EFLLA9zUQqXaWyEGbebq'); 

            $gateway->setTestMode(true); 

            $gateway->setLogoImageUrl(URL::to('images/logoSmall.png'));


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

            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();

                 } 

            } 

And also the ignited\laravel-omnipay\config.php is unchanged (though I did try changing the driver)

return array(

// The default gateway to use
'default' => 'paypal',

// Add in each gateway here
'gateways' => array(
    'paypal' => array(
        'driver' => 'PayPal_Express',
        'options' => array(
            'solutionType' => '',
            'landingPage' => '',
            'headerImageUrl' => ''
        )
    )
)

);

Thanks for your tinme!!

EDIT: Here is my getSuccessPayment function where I can hopefully get the users paypal details (just name and address etc) from paypal. But how and where do I specify this?

    public function getSuccessPayment() 
            {   
                $gateway = Omnipay::create('PayPal_Express');
                $gateway->setUsername('lillyloverofwar-facilitator_api1.gmail.com'); 
                $gateway->setPassword('U6LM3SG2MNCA3QE2'); 
                $gateway->setSignature('AJVP9tUtdotIeVt82RpcG7n9ld-tAdCG1Ramb1u8yZECHhSpiXc0BO04'); 
                $gateway->setTestMode(true); 

                $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') {

                    // return View::make('successfulPayment')->with($params); 
                 //     Session::flush();
                 // Response 
                 // print_r($paypalResponse); 
                 } else { 
                 //Failed transaction 
                 } 
                 // FLUSHING SESSION HERE GETS AN ERROR
                 // Session::flush();
                 return View::make('successfulPayment'); 


                } 
Community
  • 1
  • 1
thomas jaunism
  • 805
  • 2
  • 10
  • 31

1 Answers1

1

1) I get this error when I try (call_user_func_array() expects parameter 1 to be a valid callback, class 'Omnipay\Common\GatewayFactory' does not have a method 'creditCard').

You can't use credit cards on the PayPal Express gateway, only on Pro or REST. I recommend that you use the REST gateway not the Pro gateway (REST supersedes Pro and has more features).

I don't want to enter all the credit card details - Just speed the process up by entering the User's Name, Adress etc...

There is no need to do that if you are using PayPal Express anyway, because PayPal will provide you the necessary details after the user has gone through the PayPal login process and authorized the transaction.

Also I tried changing to Paypal_Pro and it didn't work. (same error as above) I changed config plus gateways in my payment controller.

2)How do you change PayPal_Express to PayPay_Pro?

I suggest you have a look at my fork of the omnipay-paypal gateway, https://github.com/delatbabel/omnipay-paypal -- on the accept-paypal-payments branch there are additional commits (sent as a PR to the main repository but not merged yet) with additional features such as using the REST gateway for either Credit Card or PayPal purchases, and additional API documentation including code examples on how to use the REST gateway.

Here is the code example for using the Rest gateway for a purchase transaction with a credit card:

// Create a gateway for the PayPal RestGateway
// (routes to GatewayFactory::create)
$gateway = Omnipay::create('RestGateway');

// Initialise the gateway
$gateway->initialize(array(
    'clientId' => 'MyPayPalClientId',
    'secret'   => 'MyPayPalSecret',
    'testMode' => true, // Or false when you are ready for live transactions
));

// Create a credit card object
// DO NOT USE THESE CARD VALUES -- substitute your own
// see the documentation in the class header.
$card = new CreditCard(array(
            'firstName' => 'Example',
            'lastName' => 'User',
            'number' => '4111111111111111',
            'expiryMonth'           => '01',
            'expiryYear'            => '2020',
            'cvv'                   => '123',
            'billingAddress1'       => '1 Scrubby Creek Road',
            'billingCountry'        => 'AU',
            'billingCity'           => 'Scrubby Creek',
            'billingPostcode'       => '4999',
            'billingState'          => 'QLD',
));

// Do a purchase transaction on the gateway
$transaction = $gateway->purchase(array(
    'amount'        => '10.00',
    'currency'      => 'AUD',
    'description'   => 'This is a test purchase transaction.',
    'card'          => $card,
));
$response = $transaction->send();
if ($response->isSuccessful()) {
    echo "Purchase transaction was successful!\n";
    $sale_id = $response->getTransactionReference();
    echo "Transaction reference = " . $sale_id . "\n";
}
delatbabel
  • 3,601
  • 24
  • 29
  • Thanks for this! In the second part of your answer you say paypal will provide me with this data after payment? how do I access/store/view this data? I have a 'getSuccessPayment()' function but it only returned a bunch of stuff I couldn't understand. Can you point me somewhere that explains how to get meaningful data from paypal after successful payment? I'll share my successful payment function above. – thomas jaunism Feb 12 '15 at 01:58
  • I should also point out that sending credit cards to Paypal directly (what they refer to as "Direct credit card payments" only works in the USA or the UK. In other countries it will work in sandbox mode but not in production mode. – delatbabel Feb 12 '15 at 02:03
  • (a) for Credit Card payments you already have the shipping address. (b) for Paypal payments it is supposed to be the case that PayPal returns the shipping address info as a part of the response to the execute request (see RestExecuteRequest) when you execute the transaction in your callback URL. That might not be what you want, however, because you may want to capture the shipping address separately before you make the charge. In any case I would be inclined to get the shipping address from the customer separately from taking payment. – delatbabel Feb 12 '15 at 02:18
  • I believe that the main omnipay-paypal repo now has all of my changes merged in. – delatbabel May 25 '15 at 04:24