Nasazení paypal MetisFW/PayPal a nenalezení potřebné služby
- Danny
- Člen | 146
Zdravím,
snažím se zprovoznit paypal a postupoval jsem přesně podle toho návodu
až jsem došel k tomuto problému
https://forum.nette.org/…tisfw-paypal
kde Davide správně radí ať si tu factory injectneme normálně. Nicméně
pokud to udělám dostávám tento error
https://gyazo.com/…dc8b80cbe935
Podle návodu jsem config upravil a předpokládám že není nutné tam registrovat další factory/service toho addonu
extensions:
payPal: MetisFW\PayPal\DI\PayPalExtension
payPal:
clientId: AUqne4ywvozUaSQ1THTZYKFr88bhtA0SS_fXBoJTfeSTIasDBWuXLiLcFlfmSXRfL-kZ3Z5shvNrT6rP
secret: EDGPDc3a65JBBY7-IKkNak7aGTVTvY-NhJgfhptegSML58fWjfp89U7UKNgGk9UI-UEZ-btfaE2sGST1
currency: EUR
# optional Payment Experience Profile ID
# https://developer.paypal.com/docs/api/payment-experience/
# experienceProfileId: XP-AAAA-BBBB-CCCC-DDDD
sdkConfig:
mode: sandbox
log.Enabled: true
log.FileName: '%tempDir%/PayPal.log'
log.LogLevel: DEBUG
validation.level: log
cache.enabled: true
# 'http.CURLOPT_CONNECTTIMEOUT' => 30
# 'http.headers.PayPal-Partner-Attribution-Id' => '123123123'/
Paypal jsem stáhl přes composer a je uložen v vendor/metisfw/… a moje struktura je App/AdminModule/Presenter/ServicePresenter.php v kterém to momentálně zkouším.
ServicePresenter.php
<?php
namespace AdminModule;
use Nette;
use \MetisFW\Paypal\Payment\SimplePaymentOperation;
use \MetisFW\PayPal\UI\PaymentControl;
use \PayPal\Api\Payment;
class ServicePresenter extends BasePresenter
{
/** @var \MetisFW\PayPal\Payment\SimplePaymentOperation @inject */
public $factory;
public function __construct(SimplePaymentOperation $factory)
{
$this->factory = $factory;
}
public function createComponentPayPalPaymentButton()
{
$operation = $this->factory->create('Coffee', 5);
$control = new PaymentControl($operation);
//set different template if u want to use own
$control->setTemplateFilePath(__DIR__ . './myPayPalButton.latte');
//called before redirect to paypal after first api call, which create payment
$control->onCheckout[] = function(PaymentControl $control, Payment $created) {
//something
};
//called after successfully completed payment proccess
$control->onSuccess[] = function(PaymentControl $control, Payment $paid) {
//something
};
//called when user cancelled payment process
$control->onCancel[] = function(PaymentControl $control) {
//something
};
return $control;
}
}
Injectnuju ho špatně nebo pouze cesta k Addonu je špatná? Zkouším všechny možnosti a pořád nic. Budu rád za jakoukoliv radu, děkuji moc.
Editoval Danny (20. 5. 2017 10:42)
- GEpic
- Člen | 566
Tvůj problém je že injectuješ SimplePaymentOperation
, ale
musíš si injectnout SimplePaymentOperationFactory
, pomocí které
už si potom objekt třídy SimplePaymentOperation
vyrobíš.
A ještě jeden tip, buďto použij @inject
anotaci a v tom
případě nepotřebuješ konstruktor, nebo použij konstruktor a nepoužívej
@inject
anotaci. Pokud použiješ konstruktor, tak proměnná
$factory
nemusí být samozřejmě public
.
Editoval GEpic (21. 5. 2017 19:36)
- Danny
- Člen | 146
Díky moc to byl ten problém, to mi nedošlo :) V pohodě se mi to teď injectnulo díky za připomínky jak k tomu přistupovat.
Ještě je tu jedna věc která mi trochu vrtvá hlavou, nechápu jak includovat tu componentu kterou tím vytvářím, protože pomocí
$operation = $this->factory->create('Coffee', 5);
vytvořím komponentu z továrničky ale jako návratovou hodnotu té komponentu už vracím tento control
$control = new PaymentControl($operation);
Takže pokud si budu v šabloně myPayPalButton.latte includovat
{control payPalPaymentButton}
Tak mi to nebude fungovat (a nefunguje). Hlasí že komponentu to nemůže naleznout.
Nette\InvalidArgumentException
Component with name 'payPalPaymentButton' does not exist
- GEpic
- Člen | 566
Toto by mělo být již v šabloně akce presenteru –
{control payPalPaymentButton}
A toto bys měl použít pouze tehdy, pokud chceš vykreslit tu komponentu
vlastním způsobem –
$control->setTemplateFilePath(__DIR__ . './myPayPalButton.latte');
. Dle GitHubu je výchozí šablona toto:
<a href="{$checkoutLink}" n:attr="(expand)$attrs">
<div>{$text}</div>
</a>
Tedy v šabloně akce presenteru použiješ
{control payPalPaymentButton}
a vypíše ti to to latte které jsem
ti zde poslal, nebo tvé vlastní, které si nadefinuješ ve vlastním latte
souboru a přípojíš k té komponentě.
Editoval GEpic (21. 5. 2017 23:51)
- leaff
- Člen | 10
Ahoj, riešim rovnaký problém:
use Nette;
use \MetisFW\Paypal\Payment\SimplePaymentOperation;
use \MetisFW\PayPal\UI\PaymentControl;
use \PayPal\Api\Payment;
class PayPresenter extends BasePresenter {
/** @var \MetisFW\PayPal\Payment\SimplePaymentOperationFactory @inject */
public $factory;
public function createComponentPayPalPaymentButton() {
$operation = $this->factory->create('Credit', $this->amount);
$control = new PaymentControl($operation);
//set different template if u want to use own
$control->setTemplateFilePath(__DIR__ . '/../templates/myPayPalButton.latte');
//called before redirect to paypal after first api call, which create payment
$control->onCheckout[] = function(PaymentControl $control, Payment $created) {
//something
};
//called after successfully completed payment proccess
$control->onSuccess[] = function(PaymentControl $control, Payment $paid) {
};
//called when user cancelled payment process
$control->onCancel[] = function(PaymentControl $control) {
//something
};
return $control;
}
v prípade že mam zapnutý DebugMode je to funkčne, ak ho vypnem hodí to error500 a v exception logu je
Nette\InvalidStateException: Property App\AdminModule\Presenters\PayPresenter::$factory has no @var annotation. in /vendor/nette/di/src/DI/Extensions/InjectExtension.php:122
v configu mám
extensions:
payPal: MetisFW\PayPal\DI\PayPalExtension
čo robím zle?
Ďakujem.
Edit
hmm… tak stačilo premezať cache
Editoval leaff (2. 10. 2017 2:29)