实施Payum/Laravel定期付款

2022-08-30 23:45:43

我在尝试使其工作时遇到一些问题,我已经成功实现了结帐快车(或似乎),但我的系统也需要订阅选项,遵循此示例。

现在,我的问题是,在Laravel中,你不能简单地放置一些随机文件,所以我试图以正确的方式做到这一点,可悲的是,没有关于库上的类和方法的文档。

我已经在控制器中创建了一些函数(我不知道这是否是正确的方式),我现在面临的问题是试图创建RecurringPayment()来应用所需的定期付款金额,这是我猜的最后一步。

谢谢你的帮助。

  • 应用程序/控制器/贝宝控制器.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());
    }
    
  • 应用/路线.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'));
    

答案 1

我发现了问题。它是使用我们传递给创建定期付款函数的参数。以下是用于协议和付款创建的函数。它应该工作正常。

<?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 类实现
  • 它支持定期付款 它支持快速结账付款
  • 所有可用的PayPal API 方法都包含在所属方法中
  • 有据可查

推荐