Реализовать регулярную оплату Payum / Laravel

У меня есть некоторые проблемы, пытаясь заставить это работать, я успешно реализовал Checkout Express (или, кажется, что), но также моей системе нужна опция подписки, после этого пример.

Теперь моя проблема в том, что в Laravel вы не можете просто поместить несколько случайных файлов, поэтому я пытаюсь сделать это правильно, к сожалению, нет документации по классам и методам, в том числе и по библиотеке.

Я создал некоторые функции в контроллерах (я не знаю, правильно ли это), проблема, с которой я сейчас сталкиваюсь, заключается в попытке createRecurringPayment () применить желаемую сумму повторяющегося платежа, я думаю, это последний шаг.

Спасибо за помощь.

  • приложение / контроллеры / PaypalController.php

    public function prepareExpressCheckout(){
    $storage = $this->getPayum()->getStorage('Payum\Core\Model\ArrayObject');
    $details = $storage->createModel();
    $details['PAYMENTREQUEST_0_CURRENCYCODE'] = 'USD';
    $details['PAYMENTREQUEST_0_AMT'] = 1.23;
    $storage->updateModel($details);
    $captureToken = $this->getTokenFactory()->createCaptureToken('paypal_es', $details, 'payment_done');
    $details['RETURNURL'] = $captureToken->getTargetUrl();
    $details['CANCELURL'] = $captureToken->getTargetUrl();
    $storage->updateModel($details);
    return \Redirect::to($captureToken->getTargetUrl());
    }
    
    public function prepareSubscribe(){
    $storage = $this->getPayum()->getStorage('Payum\Core\Model\ArrayObject');
    $details = $storage->createModel();
    
    $details['PAYMENTREQUEST_0_AMT'] = 0;
    $details['L_BILLINGTYPE0'] = Api::BILLINGTYPE_RECURRING_PAYMENTS;
    $details['L_BILLINGAGREEMENTDESCRIPTION0'] = "Suscripción por X meses";
    $details['NOSHIPPING'] = 1;
    
    $storage->updateModel($details);
    $captureToken = $this->getTokenFactory()->createCaptureToken('paypal_es', $details, 'payment_done');
    $storage->updateModel($details);
    
    return \Redirect::to($captureToken->getTargetUrl());
    }
    
    public function createRecurringPayment(){
    $payum_token = Input::get('payum_token');
    $request = \App::make('request');
    $request->attributes->set('payum_token', $payum_token);
    $token = ($request);
    //$this->invalidate($token);
    
    $agreementStatus = new GetHumanStatus($token);
    $payment->execute($agreementStatus);
    
    if (!$agreementStatus->isSuccess()) {
    header('HTTP/1.1 400 Bad Request', true, 400);
    exit;
    }
    
    $agreementDetails = $agreementStatus->getModel();
    
    $storage = $this->getPayum()->getStorage('Payum\Core\Model\ArrayObject');
    
    $recurringPaymentDetails = $storage->createModel();
    $recurringPaymentDetails['TOKEN'] = $agreementDetails['TOKEN'];
    $recurringPaymentDetails['DESC'] = 'Subscribe to weather forecast for a week. It is 0.05$ per day.';
    $recurringPaymentDetails['EMAIL'] = $agreementDetails['EMAIL'];
    $recurringPaymentDetails['AMT'] = 0.05;
    $recurringPaymentDetails['CURRENCYCODE'] = 'USD';
    $recurringPaymentDetails['BILLINGFREQUENCY'] = 7;
    $recurringPaymentDetails['PROFILESTARTDATE'] = date(DATE_ATOM);
    $recurringPaymentDetails['BILLINGPERIOD'] = Api::BILLINGPERIOD_DAY;
    
    $payment->execute(new CreateRecurringPaymentProfile($recurringPaymentDetails));
    $payment->execute(new Sync($recurringPaymentDetails));
    
    $doneToken = $this->createToken('paypal_es', $recurringPaymentDetails, 'payment_done');
    
    return \Redirect::to($doneToken->getTargetUrl());
    }
    
  • Приложение / routes.php

        Route::get('/payment', array('as' => 'payment', 'uses' => 'PaymentController@payment'));
    Route::get('/payment/done', array('as' => 'payment_done', 'uses' => 'PaymentController@done'));
    Route::get('/payment/paypal/express-checkout/prepare', array('as' => 'paypal_es_prepare', 'uses' => 'PaypalController@prepareExpressCheckout'));
    Route::get('/payment/paypal/subscribe/prepare', array('as' => 'paypal_re_prepare', 'uses' => 'PaypalController@prepareSubscribe'));
    Route::get('/payment/paypal/subscribe/create', array('as' => 'payment_create', 'uses' => 'PaypalController@createRecurringPayment'));
    

16

Решение

Я нашел проблему. Именно с параметрами мы передаем функцию создания повторяющихся платежей. Вот функции для создания соглашения и оплаты. Это должно работать нормально.

<?php

namespace App\Http\Controllers;

use Payum\Core\Request\GetHumanStatus;
use Payum\LaravelPackage\Controller\PayumController;
use Payum\Paypal\ExpressCheckout\Nvp\Api;
use Payum\Core\Request\Sync;
use Payum\Paypal\ExpressCheckout\Nvp\Request\Api\CreateRecurringPaymentProfile;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class PayPalController extends PayumController {

public function prepareSubscribeAgreement() {

$storage = $this->getPayum()->getStorage('Payum\Core\Model\ArrayObject');

$details = $storage->create();
$details['PAYMENTREQUEST_0_AMT'] = 0;
$details['L_BILLINGTYPE0'] = Api::BILLINGTYPE_RECURRING_PAYMENTS;
$details['L_BILLINGAGREEMENTDESCRIPTION0'] = "Weather subscription";
//$details['NOSHIPPING'] = 1;
$storage->update($details);

$captureToken = $this->getPayum()->getTokenFactory()->createCaptureToken('paypal_ec', $details, 'paypal_subscribe');

return \Redirect::to($captureToken->getTargetUrl());
}

public function createSubscribePayment(Request $request) {
$request->attributes->set('payum_token', $request->input('payum_token'));

$token = $this->getPayum()->getHttpRequestVerifier()->verify($request);
$gateway = $this->getPayum()->getGateway($token->getGatewayName());

$agreementStatus = new GetHumanStatus($token);
$gateway->execute($agreementStatus);

if (!$agreementStatus->isCaptured()) {
header('HTTP/1.1 400 Bad Request', true, 400);
exit;
}

$agreement = $agreementStatus->getModel();

$storage = $this->getPayum()->getStorage('Payum\Core\Model\ArrayObject');

$recurringPayment = $storage->create();
$recurringPayment['TOKEN'] = $agreement['TOKEN'];
$recurringPayment['PAYERID'] = $agreement['PAYERID'];
$recurringPayment['PROFILESTARTDATE'] = date(DATE_ATOM);
$recurringPayment['DESC'] = $agreement['L_BILLINGAGREEMENTDESCRIPTION0'];
$recurringPayment['BILLINGPERIOD'] = Api::BILLINGPERIOD_DAY;
$recurringPayment['BILLINGFREQUENCY'] = 7;
$recurringPayment['AMT'] = 0.05;
$recurringPayment['CURRENCYCODE'] = 'USD';
$recurringPayment['COUNTRYCODE'] = 'US';
$recurringPayment['MAXFAILEDPAYMENTS'] = 3;

$gateway->execute(new CreateRecurringPaymentProfile($recurringPayment));
$gateway->execute(new Sync($recurringPayment));

$captureToken = $this->getPayum()->getTokenFactory()->createCaptureToken('paypal_ec', $recurringPayment, 'payment_done');

return \Redirect::to($captureToken->getTargetUrl());
}

public function done(Request $request) {
/** @var Request $request */
//$request = \App::make('request');
$request->attributes->set('payum_token', $request->input('payum_token'));

$token = $this->getPayum()->getHttpRequestVerifier()->verify($request);
$gateway = $this->getPayum()->getGateway($token->getGatewayName());

$gateway->execute($status = new GetHumanStatus($token));

return \Response::json(array(
'status' => $status->getValue(),
'details' => iterator_to_array($status->getFirstModel())
));
}

}

Маршруты:

Route::get('paypal/agreement', 'PayPalController@prepareSubscribeAgreement');
Route::get('paypal/subscribe', [
'as' => 'paypal_subscribe',
'uses' => 'PayPalController@createSubscribePayment'
]);
Route::get('paydone', [
'as' => 'payment_done',
'uses' => 'PayPalController@done'
]);

Просто откройте www.example.com/paypal/agreement, и вы должны перейти в PayPal.

2

Другие решения

В моем проекте я использовал следующую библиотеку, и она мне очень помогла:

https://github.com/amirduran/duranius-paypal-rest-api-php-library

Вот некоторые особенности:

  • Простота установки — всего один файл
  • Библиотека реализована в виде PHP класса
  • Поддерживает регулярные платежи Поддерживает платежи ExpressCheckout
  • Все доступные методы PayPal API заключены в соответствующие методы.
  • Хорошо задокументированы
1

По вопросам рекламы [email protected]