Omnipay PayPal Express 中是不是存在信用卡功能?还是仅在 PayPal Pro 中?

Posted

技术标签:

【中文标题】Omnipay PayPal Express 中是不是存在信用卡功能?还是仅在 PayPal Pro 中?【英文标题】:Does the creditCard function exist in Omnipay PayPal Express? Or only in PayPal Pro?Omnipay PayPal Express 中是否存在信用卡功能?还是仅在 PayPal Pro 中? 【发布时间】:2015-04-01 09:00:16 【问题描述】:

这个问题可能类似于THIS 和THIS,但我不完全确定。

我制作了一个购物车,在结账时将产品详细信息和数量/总金额发送到 Paypal。我正在使用 Laravel 4 和 Omnipay Paypal 插件(Paypal_Express)。我可以使用“setItems”功能很好地发送产品详细信息,现在我希望使用我的用户详细信息预先填充 Paypal 摘要页面上的信用卡字段。

我在其他 SO 线程(例如 THIS)中看到其他人使用 creditCard 功能将详细信息传递到 Paypal 摘要信用卡信息页面。

我的问题:1) 您是否需要使用 Paypal_Pro 才能使用信用卡功能? 我在尝试时收到此错误 (call_user_func_array() expects parameter 1 to be a valid callback, class 'Omnipay\Common\GatewayFactory' does not have a method 'creditCard')。

我不想输入所有信用卡详细信息 - 只需输入用户名、地址等加快流程...

我还尝试更改为 Paypal_Pro,但没有成功。 (与上述相同的错误)我更改了支付控制器中的配置和网关。

2)如何将 PayPal_Express 更改为 PayPay_Pro?

我的代码:

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

                  

             

而且 ignited\laravel-omnipay\config.php 也没有改变(尽管我确实尝试过更改驱动程序)

返回数组(

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

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

);

谢谢你的时间!!

编辑:这是我的 getSuccessPayment 函数,我希望可以从贝宝获取用户贝宝的详细信息(只是姓名和地址等)。但是我该如何以及在哪里指定呢?

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


                 

【问题讨论】:

【参考方案1】:

1) 我在尝试时收到此错误(call_user_func_array() 期望参数 1 是有效的回调,类 'Omnipay\Common\GatewayFactory' 没有方法 'creditCard')。

您不能在 PayPal Express 网关上使用信用卡,只能在 Pro 或 REST 上使用。我建议您使用 REST 网关而不是 Pro 网关(REST 取代 Pro 并具有更多功能)。

我不想输入所有信用卡详细信息 - 只需通过输入用户名、地址等来加快流程...

如果您仍然使用 PayPal Express,则无需这样做,因为在用户完成 PayPal 登录过程并授权交易后,PayPal 会为您提供必要的详细信息。

我还尝试更改为 Paypal_Pro,但没有成功。 (与上述相同的错误)我更改了支付控制器中的配置和网关。

2)如何将 PayPal_Express 更改为 PayPay_Pro?

我建议你看看我的omnipay-paypal 网关分支https://github.com/delatbabel/omnipay-paypal——在accept-paypal-payments 分支上还有其他提交(作为PR 发送到主存储库但尚未合并)具有其他功能,例如使用 REST 网关进行信用卡或 PayPal 购买,以及其他 API 文档,包括有关如何使用 REST 网关的代码示例。

以下是使用 Rest 网关进行信用卡购买交易的代码示例:

// 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";

【讨论】:

谢谢!在您回答的第二部分中,您说贝宝会在付款后向我提供这些数据吗?我如何访问/存储/查看这些数据?我有一个“getSuccessPayment()”函数,但它只返回了一堆我无法理解的东西。你能指出我在成功付款后如何从贝宝获取有意义的数据的地方吗?我会在上面分享我成功的支付功能。 我还应该指出,直接向 Paypal 发送信用卡(他们所说的“直接信用卡付款”仅适用于美国或英国。在其他国家/地区,它将在沙盒模式下工作但不在生产模式下。 (a) 对于信用卡付款,您已经有了送货地址。 (b) 对于 Paypal 付款,当您在回调 URL 中执行交易时,应该是 PayPal 返回送货地址信息作为对执行请求的响应的一部分(请参阅 RestExecuteRequest)。但是,这可能不是您想要的,因为您可能希望在收费之前单独获取送货地址。在任何情况下,我都倾向于从客户那里获得送货地址,而不是付款。 我相信现在主要的 omnipay-paypal 存储库已经合并了我的所有更改。

以上是关于Omnipay PayPal Express 中是不是存在信用卡功能?还是仅在 PayPal Pro 中?的主要内容,如果未能解决你的问题,请参考以下文章

Omnipay - 使用 Paypal Express 结帐 Laravel

使用 Omnipay 在 Paypal Express 中显示账单和运输信息

Omnipay Paypal Express 结帐错误:安全标头无效

Laravel 5.3 - Omnipay Paypal Express 不返回成功消息

如何使用 PHP Omnipay 和 Paypal Express Checkout 验证付款?

PayPal Pro/Express Omnipay Gateway - 信用卡标题无效