如何在 Laravel 中集成 Paypal 支付网关?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/32900917/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 12:25:55  来源:igfitidea点击:

How to Integrate Paypal Payment gateway in laravel?

laravelpaypal-sandboxlaravel-5.1paypal-rest-sdkpaypal

提问by Gokul Raj R

How to Integrate Paypal Payment gateway in Laravel? I tried this http://www.17educations.com/laravel/paypal-integration-in-laravel/but config have some problem,Please anybody say some ideas

如何在 Laravel 中集成 Paypal 支付网关?我试过这个http://www.17educations.com/laravel/paypal-integration-in-laravel/但配置有一些问题,请任何人说一些想法

回答by Harsukh Makwana

Follow Bellow Few Step:
1)Install Laravel Application
2)Database Configuration
3)Install Required Packages
4)configuration paypal.php file
5)create route
6)create controller
7)create view file

遵循以下几个步骤:
1)安装 Laravel 应用程序
2)数据库配置
3)安装所需的包
4)配置 paypal.php 文件
5)创建路由
6)创建控制器
7)创建视图文件

Step 1 : Install Laravel Application
we are going from scratch, So we require to get fresh Laravel application using bellow command, So open your terminal OR command prompt and run bellow command:

第 1 步:安装 Laravel 应用程序
我们将从头开始,因此我们需要使用 bellow 命令获取新的 Laravel 应用程序,因此打开您的终端或命令提示符并运行 bellow 命令:

composer create-project --prefer-dist laravel/laravel blog

Step 2 : Database Configuration
In this step, we require to make database configuration, you have to add
following details on your .env file.
1.Database Username
1.Database Password
1.Database Name

第 2 步:数据库配置
在这一步中,我们需要进行数据库配置,您必须
在 .env 文件中添加以下详细信息。
1.数据库用户名 1.
数据库密码 1.
数据库名称

In .env file also available host and port details, you can configure all details as in your system, So you can put like as bellow: .env

在 .env 文件中还有可用的主机和端口详细信息,您可以像在系统中一样配置所有详细信息,因此您可以像下面这样: .env

DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

Step 3 : Install Required Packages
We have required following 2 packages for integrate paypal payment in our laravel application. add following two package in your composer.json file.

第 3 步:安装所需的包
我们需要以下 2 个包来在我们的 Laravel 应用程序中集成贝宝支付。在 composer.json 文件中添加以下两个包。

"guzzlehttp/guzzle": "~5.4",
"paypal/rest-api-sdk-php": "*",

then after run following command in your terminal. vendor:publish command is used to copy few configuration file in your application from vendor package file.

然后在终端中运行以下命令后。vendor:publish 命令用于从供应商包文件中复制应用程序中的一些配置文件。

php artisan vendor:publish

after run this command, then after automatic create paypal.php file in your config/paypal.phppath.

运行此命令后,然后在您的config/paypal.php路径中自动创建 paypal.php 文件。

Step 4 : Configuration paypal.php file

第四步:配置paypal.php文件

<?php

return array(
/** set your paypal credential **/
'client_id' =>'paypal client_id',
'secret' => 'paypal secret ID',
/**
* SDK configuration 
*/
'settings' => array(
    /**
    * Available option 'sandbox' or 'live'
    */
    'mode' => 'sandbox',
    /**
    * Specify the max request time in seconds
    */
    'http.ConnectionTimeOut' => 1000,
    /**
    * Whether want to log to a file
    */
    'log.LogEnabled' => true,
    /**
    * Specify the file that want to write on
    */
    'log.FileName' => storage_path() . '/logs/paypal.log',
    /**
    * Available option 'FINE', 'INFO', 'WARN' or 'ERROR'
    *
    * Logging is most verbose in the 'FINE' level and decreases as you
    * proceed towards ERROR
    */
    'log.LogLevel' => 'FINE'
    ),
);

Step 5: Create Route
In this is step we need to create route for paypal payment. so open your routes/web.phpfile and add following route. routes/web.php

第 5 步:创建路由
在这一步中,我们需要为贝宝支付创建路由。所以打开你的routes/web.php文件并添加以下路由。 路线/ web.php

Route::get('paywithpaypal', array('as' => 'addmoney.paywithpaypal','uses' => 'AddMoneyController@payWithPaypal',));
Route::post('paypal', array('as' => 'addmoney.paypal','uses' => 'AddMoneyController@postPaymentWithpaypal',));
Route::get('paypal', array('as' => 'payment.status','uses' => 'AddMoneyController@getPaymentStatus',));

Step 6: Create Controller
In this point, now we should create new controller as AddMoneyController in this path app/Http/Controllers/AddMoneyController.php. this controller will manage layout and payment post request, So run bellow command for generate new controller:

第 6 步:创建控制器
在这一点上,现在我们应该在这个路径app/Http/Controllers/AddMoneyController.php 中创建新的控制器作为AddMoneyController。此控制器将管理布局和付款后请求,因此运行以下命令以生成新控制器:

php artisan make:controller AddMoneyController

Ok, now put bellow content in controller file:
app/Http/Controllers/AddMoneyController.php

好的,现在把下面的内容放在控制器文件中:
app/Http/Controllers/AddMoneyController.php

<?php

namespace App\Http\Controllers;

use App\Http\Requests;
use Illuminate\Http\Request;
use Validator;
use URL;
use Session;
use Redirect;
use Input;

/** All Paypal Details class **/
use PayPal\Rest\ApiContext;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\ExecutePayment;
use PayPal\Api\PaymentExecution;
use PayPal\Api\Transaction;

class AddMoneyController extends HomeController
{

    private $_api_context;
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();

        /** setup PayPal api context **/
        $paypal_conf = \Config::get('paypal');
        $this->_api_context = new ApiContext(new OAuthTokenCredential($paypal_conf['client_id'], $paypal_conf['secret']));
        $this->_api_context->setConfig($paypal_conf['settings']);
    }



    /**
     * Show the application paywith paypalpage.
     *
     * @return \Illuminate\Http\Response
     */
    public function payWithPaypal()
    {
        return view('paywithpaypal');
    }

    /**
     * Store a details of payment with paypal.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function postPaymentWithpaypal(Request $request)
    {
        $payer = new Payer();
        $payer->setPaymentMethod('paypal');

        $item_1 = new Item();

        $item_1->setName('Item 1') /** item name **/
            ->setCurrency('USD')
            ->setQuantity(1)
            ->setPrice($request->get('amount')); /** unit price **/

        $item_list = new ItemList();
        $item_list->setItems(array($item_1));

        $amount = new Amount();
        $amount->setCurrency('USD')
            ->setTotal($request->get('amount'));

        $transaction = new Transaction();
        $transaction->setAmount($amount)
            ->setItemList($item_list)
            ->setDescription('Your transaction description');

        $redirect_urls = new RedirectUrls();
        $redirect_urls->setReturnUrl(URL::route('payment.status')) /** Specify return URL **/
            ->setCancelUrl(URL::route('payment.status'));

        $payment = new Payment();
        $payment->setIntent('Sale')
            ->setPayer($payer)
            ->setRedirectUrls($redirect_urls)
            ->setTransactions(array($transaction));
            /** dd($payment->create($this->_api_context));exit; **/
        try {
            $payment->create($this->_api_context);
        } catch (\PayPal\Exception\PPConnectionException $ex) {
            if (\Config::get('app.debug')) {
                \Session::put('error','Connection timeout');
                return Redirect::route('addmoney.paywithpaypal');
                /** echo "Exception: " . $ex->getMessage() . PHP_EOL; **/
                /** $err_data = json_decode($ex->getData(), true); **/
                /** exit; **/
            } else {
                \Session::put('error','Some error occur, sorry for inconvenient');
                return Redirect::route('addmoney.paywithpaypal');
                /** die('Some error occur, sorry for inconvenient'); **/
            }
        }

        foreach($payment->getLinks() as $link) {
            if($link->getRel() == 'approval_url') {
                $redirect_url = $link->getHref();
                break;
            }
        }

        /** add payment ID to session **/
        Session::put('paypal_payment_id', $payment->getId());

        if(isset($redirect_url)) {
            /** redirect to paypal **/
            return Redirect::away($redirect_url);
        }

        \Session::put('error','Unknown error occurred');
        return Redirect::route('addmoney.paywithpaypal');
    }

    public function getPaymentStatus()
    {
        /** Get the payment ID before session clear **/
        $payment_id = Session::get('paypal_payment_id');
        /** clear the session payment ID **/
        Session::forget('paypal_payment_id');
        if (empty(Input::get('PayerID')) || empty(Input::get('token'))) {
            \Session::put('error','Payment failed');
            return Redirect::route('addmoney.paywithpaypal');
        }
        $payment = Payment::get($payment_id, $this->_api_context);
        /** PaymentExecution object includes information necessary **/
        /** to execute a PayPal account payment. **/
        /** The payer_id is added to the request query parameters **/
        /** when the user is redirected from paypal back to your site **/
        $execution = new PaymentExecution();
        $execution->setPayerId(Input::get('PayerID'));
        /**Execute the payment **/
        $result = $payment->execute($execution, $this->_api_context);
        /** dd($result);exit; /** DEBUG RESULT, remove it later **/
        if ($result->getState() == 'approved') { 

            /** it's all right **/
            /** Here Write your database logic like that insert record or value in database if you want **/

            \Session::put('success','Payment success');
            return Redirect::route('addmoney.paywithpaypal');
        }
        \Session::put('error','Payment failed');

        return Redirect::route('addmoney.paywithpaypal');
    }
  }

Now we are ready to run our example so run bellow command ro quick run:

现在我们已准备好运行我们的示例,因此运行以下命令 ro quick run:

php artisan serve

Now you can open bellow URL on your browser:

现在您可以在浏览器上打开以下网址:

http://localhost:8000/paywithpaypal

please visit this toturials link..

请访问此toturials链接..

https://www.youtube.com/watch?v=ly2xm_NM46g

https://www.youtube.com/watch?v=ly2xm_NM46g

http://laravelcode.com/post/how-to-integrate-paypal-payment-gateway-in-laravel-54

http://laravelcode.com/post/how-to-integrate-paypal-payment-gateway-in-laravel-54

回答by delatbabel

What are you trying to achieve with PayPal and what problems are you having?

您想通过 PayPal 实现什么目标?您遇到了哪些问题?

I would advise avoiding the paypal SDK and instead use Omnipay from the PHP league. See http://omnipay.thephpleague.com/and https://github.com/thephpleague/omnipay-paypal

我建议避免使用贝宝 SDK,而是使用 PHP 联盟中的 Omnipay。请参阅http://omnipay.thephpleague.com/https://github.com/thephpleague/omnipay-paypal

If you download the omnipay library you will see some examples in the various class headers. You will need to implement calls to purchase() and then have a returnUrl and a cancelUrl, and in your returnUrl you will need to implement a call to completePurchase().

如果您下载 omnipay 库,您将在各种类标题中看到一些示例。您需要实现对purchase() 的调用,然后有一个returnUrl 和一个cancelUrl,并且在您的returnUrl 中,您需要实现对completePurchase() 的调用。

If you tell me what you're trying to achieve I can give you some code examples.

如果你告诉我你想要实现什么,我可以给你一些代码示例。

回答by omer Farooq

Well as of right now here are some simpler options for laravel:

到目前为止,这里有一些更简单的 laravel 选项:

  1. Omnipay - Multiple Gateways but no subscriptions (great docs)
  2. Payum - Multiple Gatways with subscriptions (docs suck)
  3. Srmklive/Paypal- Only paypal with subscriptions (great docs and very active)
  1. Omnipay - 多个网关但没有订阅(很棒的文档)
  2. Payum - 多个订阅网关(文档很烂)
  3. Srmklive/Paypal- 只有订阅的宝(伟大的文档和非常活跃)

The first 2 are framework agnostic, which means you can directly use them but you will have to configure it for laravel, but if you want the easy way around for laravel you should use a wrapper for laravel. Which means that you just have to work with the wrapper and not the library itself. There are tons of wrappers for both of them.

前两个是框架不可知的,这意味着你可以直接使用它们,但你必须为 laravel 配置它,但是如果你想要 laravel 的简单方法,你应该使用 laravel 的包装器。这意味着您只需要使用包装器而不是库本身。他们俩都有大量的包装纸。

For those who just want to work with paypal then look no further, Srmklive's paypal package is just awesome.

对于那些只想使用 paypal 的人来说,别无所求,Srmklive 的 paypal 包非常棒。

回答by Raghu Aryan

Well as of right now here are some simpler options for Paypal payment Gateway integration on Laravel: Tutorial link

到目前为止,这里有一些更简单的选项,用于在 Laravel 上集成 Paypal 支付网关: 教程链接

Github Clone Paypal Gateway

Github 克隆 Paypal 网关

$response = $provider->doExpressCheckoutPayment($data, $token, $payer_id)
$payment_status = $response['ACK']
$transaction_id = $response['PAYMENTINFO_0_TRANSACTIONID']