Внедрение Payum/Laravel

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

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

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

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

  • приложение/контроллеры/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' => '[email protected]'));
        Route::get('/payment/done', array('as' => 'payment_done', 'uses' => '[email protected]'));
        Route::get('/payment/paypal/express-checkout/prepare', array('as' => 'paypal_es_prepare', 'uses' => '[email protected]'));
        Route::get('/payment/paypal/subscribe/prepare', array('as' => 'paypal_re_prepare', 'uses' => '[email protected]'));
        Route::get('/payment/paypal/subscribe/create', array('as' => 'payment_create', 'uses' => '[email protected]'));
    

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

<?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', '[email protected]');
    Route::get('paypal/subscribe', [
        'as' => 'paypal_subscribe',
        'uses' => '[email protected]'
    ]);
    Route::get('paydone', [
        'as' => 'payment_done',
        'uses' => '[email protected]'
    ]);

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