我有一些问题试图让它工作,我已经成功地实现了 checkout express (或似乎是),但我的系统还需要订阅选项,这example之后.

现在,我的问题是,在Laravel中,您不能简单地放置一些随机文件,所以我试图以正确的方式这样做,遗憾的是,没有包括在库中的类和方法的文档.

I've created some functions within controllers (I don't know if this the right way) the problem I'm facing now is trying to createRecurringPayment() to apply the desired amount of the recurring payment, is the final step I guess.

谢谢你的帮助.

  • APP/Controls/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());
    }
    
  • app/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'));
    

推荐答案

我发现了问题.这是我们传递给create recurtive payment函数的参数.以下是协议和付款创建功能.它应该很好用.

<?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())
        ));
    }

}

The routes:

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

Laravel相关问答推荐

try 编写一个函数,如果产品存在,则无法删除特定类别

拉威尔望远镜没有显示请求细节

如何使用 Laravel 进行继承

Laravel 9:AWS S3 检索要流式传输的视频

如何在 Laravel 中使用内存数据库的完整测试套件之前迁移和 seeder ?

Laravel belongsTo 关系 - 试图获取非对象的属性

如何通过一个 laravel 安装处理子域

Laravel 4:验证前修剪输入的最佳实践

Laravel 5 make:控制器在应用程序文件夹而不是控制器文件夹中创建控制器

Laravel 将 JSON 转换为数组?

Laravel 5.2 中的正则表达式验证

路由模型绑定不起作用

laravel 5中的配置缓存导致找不到视图

在 Laravel 中显示已注册的路由

Laravel 初学者的良好开端

如何将对象(模型类型对象)插入到 Laravel 中特定索引号的集合对象中?

Laravel Eloquent 模型中的字段

Laravel Mix 生成字体到另一个目录

无法打开laravel.log:无法打开流

在 Laravel 中软删除父记录时如何软删除相关记录?