Payum - Laravel 4 的包。如何使用 Eloquent 而不是 FilesystemStorage 创建模型数据?

Posted

技术标签:

【中文标题】Payum - Laravel 4 的包。如何使用 Eloquent 而不是 FilesystemStorage 创建模型数据?【英文标题】:Payum - package for Laravel 4. How do I create Model data using Eloquent instead of FilesystemStorage? 【发布时间】:2014-10-01 17:46:51 【问题描述】:

我正在尝试使用 Eloquent 在 Laravel 4.1 中保存 de Payment 详细信息。我试图创建我的模型,如文档 payum 所说,但它对我不起作用。我的代码:

payum/payum-laravel-package/config.php:

<?php

use Payum\Core\Storage\FilesystemStorage;
use Payum\Paypal\ExpressCheckout\Nvp\Api;
use Payum\Paypal\ExpressCheckout\Nvp\PaymentFactory as PaypalPaymentFactory;

$detailsClass = 'Payum\Core\Model\ArrayObject';
$tokenClass = 'Payum\Core\Model\Token';

$paypalPayment = PaypalPaymentFactory::create(new Api(array(
    'username' => 'MY_USER_NAME',
    'password' => 'MY_PASS',
    'signature' => 'MY_SIGN',
    'sandbox' => true
)));

return array(
    'token_storage' => new FilesystemStorage(__DIR__.'/../../../../storage/payments', $tokenClass, 'hash'),
    'payments' => array(
        'paypal_es' => $paypalPayment,
    ),
    'storages' => array(
        $detailsClass => new FilesystemStorage(__DIR__.'/../../../../storage/payments', $detailsClass),
    )
);

控制器/PaypalController.php

<?php

use Payum\Paypal\ExpressCheckout\Nvp\Api;

class PaypalController extends BaseController

    public function prepareExpressCheckout()
    

       $paymentName = 'paypal_es';

       $storage = \App::make('payum')->getStorage('Payum\Core\Model\ArrayObject');

         /** @var $paymentDetails PaymentDetails */
           $paymentDetails = $storage->createModel();
           $paymentDetails['PAYMENTREQUEST_0_CURRENCYCODE'] = 'EUR';
           $paymentDetails['PAYMENTREQUEST_0_AMT'] = '1.21';
           $paymentDetails['NOSHIPPING'] = Api::NOSHIPPING_NOT_DISPLAY_ADDRESS;
           $paymentDetails['REQCONFIRMSHIPPING'] = Api::REQCONFIRMSHIPPING_NOT_REQUIRED;
           $paymentDetails['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = Api::PAYMENTREQUEST_ITERMCATEGORY_DIGITAL;
           $paymentDetails['L_PAYMENTREQUEST_0_AMT0'] = '1.21';
           $paymentDetails['L_PAYMENTREQUEST_0_QTY0'] = '1';
           $paymentDetails['L_PAYMENTREQUEST_0_NAME0'] = 'Modulo 1';
           $paymentDetails['L_PAYMENTREQUEST_0_DESC0'] = 'Descripción Módulo 1';
           $storage->updateModel($paymentDetails);

            $captureToken = \App::make('payum.security.token_factory')->createCaptureToken($paymentName, $paymentDetails, 'payment_done');

           $paymentDetails['RETURNURL'] = $captureToken->getTargetUrl();
           $paymentDetails['CANCELURL'] = $captureToken->getTargetUrl();
         //  $paymentDetails['INVNUM'] = $paymentDetails->getId();
           $storage->updateModel($paymentDetails);

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

    /**
     * @return \Payum\Core\Security\GenericTokenFactoryInterface
     */
    protected function getTokenFactory()
    
        return \App::make('payum.security.token_factory');
    

这段代码运行良好,但我想使用 Eloquent 而不是 FilesystemStorage 创建我自己的模型。我已尝试遵循 Payum 文档,但对我不起作用:

<?php
namespace App\Model;

use Payum\Core\Model\ArrayObject;

class PaymentDetails extends ArrayObject

    protected $id;

    /**
     * @return int
     */
    public function getId()
    
        return $this->id;
    

use Payum\Core\Model\Token;

class PaymentSecurityToken extends Token


我该怎么做?任何帮助将不胜感激,因为我没有想法。

【问题讨论】:

您可能有兴趣看看我的PayPal Glass solution,我不久前才开始整理。我基本上是在复制 PayPal.com 界面为您提供的所有内容,但我是在 Laravel -> Bootstrap 中使用我自己的 PHP Class Library for PayPal 进行的。无论如何,我已经在一个模型中完成了我所有的 PayPal API 工作,所以你可以看到它们是如何组合在一起的,也许它会对你的设置有所帮助。 您的示例表明您使用文件系统存储,但您需要 Eloquent 存储。此类存储并非开箱即用,但我们计划在不久的将来添加它。 感谢@AndrewAngell 的回答。我已经看到您的 PayPal Glass 解决方案,我希望您能尽快完成您的项目,因为这是一个好主意。我会关注你的进展。 感谢@MaksimKotlyar 您的意见。我希望在 Laravel-Payum 中有一个使用 Eloquent 的解决方案。我希望 Payum 团队在不久的将来添加它,因为我认为这是必要的。 【参考方案1】:

[来自comment]

您的示例表明您使用文件系统存储,但您需要 雄辩的一个。此类存储并非开箱即用,但我们 有计划在不久的将来添加它。

[答案]

现在存储在这里。以下是您必须修改配置以使用它的方法:

<?php

use Payum\LaravelPackage\Storage\EloquentStorage;
use Payum\Paypal\ExpressCheckout\Nvp\PaymentFactory;

// it is not same model as you used but you get the idea.
$detailsClass = 'Payum\LaravelPackage\Model\Order';
$tokenClass = 'Payum\LaravelPackage\Model\Token';

$paymentFactory = new PaymentFactory();

return array(
    'token_storage' => new EloquentStorage($tokenClass),
    'payments' => array(
        'paypal' => $paymentFactory->create(array(
            'username' => 'MY_USER_NAME',
            'password' => 'MY_PASS',
            'signature' => 'MY_SIGN',
            'sandbox' => true
        ));,
    ),
    'storages' => array(
        $detailsClass => new EloquentStorage($detailsClass),
    )
);

这是documentation。

【讨论】:

以上是关于Payum - Laravel 4 的包。如何使用 Eloquent 而不是 FilesystemStorage 创建模型数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何注册新的 payum 支付方式并添加操作?

Payum Bundle:如何在 symfony2 中更改捕获操作的视图

使用 Sylius 0.16 和 Payum 实施异地支付网关时如何完成订单

如何在本地使用 wamp 时摆脱 payum“SSL 证书问题:无法获取本地颁发者证书”错误

Payum Bundle 的配置如何工作?

如何在 Laravel 外部的包中使用 Laravel 外观(缓存、日志、存储)