gpt4 book ai didi

laravel - 如何在 laravel 中编写 paypal ipn 监听器

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:34 25 4
gpt4 key购买 nike

我在我的项目中使用了laravel。在我的项目中使用 paypal 作为支付模块。 Paypal 支付交易成功完成。但是我想在 laravel 中集成 ipn 监听器。我不知道如何在 laravel Controller 中集成 ipn 监听器。

感谢先进,萨兰

最佳答案

按照以下几步操作:
1)安装Laravel应用
2)数据库配置
3)安装所需的包
4)配置paypal.php文件
5)创建路线
6)创建 Controller
7)创建 View 文件

第 1 步:安装 Laravel 应用程序
我们从头开始,所以我们需要使用波纹管命令来获得新的 Laravel 应用程序,所以打开你的终端或命令提示符并运行波纹管命令:

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

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

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

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

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

然后在终端中运行以下命令

php artisan vendor:publish

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

第四步:配置paypal.php文件

<?php

return array(
/** set your paypal credential **/
'client_id' =>'paypal client_id',
'secret' => 'paypal secret ID',
/**
* SDK configuration
*/
'settings' => array(
/**
* Available options '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'
),
);

第 5 步:创建路线
在这一步中,我们需要为 Paypal 支付创建路由。所以打开你的 routes/web.php 文件并添加以下路由。routes/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',));

第六步:创建 Controller
在这一点上,现在我们应该在这个路径 app/Http/Controllers/AddMoneyController.php 中创建新的 Controller 作为 AddMoneyController。这个 Controller 将管理布局和支付后请求,所以运行下面的命令来生成新的 Controller :

php artisan make:controller AddMoneyController

好的,现在把下面的内容放到controller文件中:
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');
}
}

第 7 步:创建 View
在最后一步中,让我们创建 paywithpaypal.blade.php(resources/views/paywithpaypal.blade.php) 用于布局,我们将在此处编写设计代码以及通过 paypal 支付金额的表格,因此输入以下代码:resources/views/paywithpaypal.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
@if ($message = Session::get('success'))
<div class="custom-alerts alert alert-success fade in">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true"></button>
{!! $message !!}
</div>
<?php Session::forget('success');?>
@endif

@if ($message = Session::get('error'))
<div class="custom-alerts alert alert-danger fade in">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true"></button>
{!! $message !!}
</div>
<?php Session::forget('error');?>
@endif
<div class="panel-heading">Paywith Paypal</div>
<div class="panel-body">
<form class="form-horizontal" method="POST" id="payment-form" role="form" action="{!! URL::route('addmoney.paypal') !!}" >
{{ csrf_field() }}

<div class="form-group{{ $errors->has('amount') ? ' has-error' : '' }}">
<label for="amount" class="col-md-4 control-label">Amount</label>

<div class="col-md-6">
<input id="amount" type="text" class="form-control" name="amount" value="{{ old('amount') }}" autofocus>

@if ($errors->has('amount'))
<span class="help-block">
<strong>{{ $errors->first('amount') }}</strong>
</span>
@endif
</div>
</div>

<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Paywith Paypal
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

现在我们已经准备好运行我们的示例,所以运行下面的命令 ro 快速运行:

php artisan serve

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

http://localhost:8000/paywithpaypal

请访问此教程链接...

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

关于laravel - 如何在 laravel 中编写 paypal ipn 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42943427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com