Source of file AfterpayEcommercePayment.php
Size: 5,695 Bytes - Last Modified: 2021-12-23T10:38:49+00:00
/var/www/docs.ssmods.com/process/src/src/Model/AfterpayEcommercePayment.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | <?php namespace Sunnysideup\Afterpay\Model; use CultureKings\Afterpay\Model\Merchant\OrderToken; use SilverStripe\CMS\Controllers\ContentController; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Control\Director; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\Form; use SilverStripe\Forms\LiteralField; use SilverStripe\Forms\ReadonlyField; use SilverStripe\View\Requirements; use Sunnysideup\Afterpay\Api\OrderToAfterpayConverter; use Sunnysideup\Afterpay\Factory\SilverstripeMerchantApi; use Sunnysideup\Ecommerce\Config\EcommerceConfig; use Sunnysideup\Ecommerce\Forms\OrderForm; use Sunnysideup\Ecommerce\Model\Money\EcommercePayment; use Sunnysideup\Ecommerce\Model\Order; use Sunnysideup\Ecommerce\Money\Payment\PaymentResults\EcommercePaymentFailure; use Sunnysideup\Ecommerce\Money\Payment\PaymentResults\EcommercePaymentProcessing; /** *@author nicolaas[at]sunnysideup.co.nz *@description: OrderNumber and PaymentID */ class AfterpayEcommercePayment extends EcommercePayment { /** * @var string */ private const LIVE_URL = 'https://portal.afterpay.com/afterpay.js'; /** * @var string */ private const DEV_URL = 'https://portal.sandbox.afterpay.com/afterpay.js'; private static $table_name = 'AfterpayEcommercePayment'; private static $db = [ 'AfterpayResponse' => 'Text', 'AfterpayToken' => 'Text', 'AfterpayConfirmationToken' => 'Text', 'DebugMessage' => 'HTMLText', ]; private static $logo = '/resources/vendor/sunnysideup/afterpay/client/images/afterpay-logo-black.png'; // DPS Information private static $privacy_link = 'https://www.afterpay.com/terms'; public function getCMSFields() { $fields = parent::getCMSFields(); $fields->replaceField('AfterpayResponse', new ReadonlyField('AfterpayResponse')); $fields->replaceField('AfterpayToken', new ReadonlyField('AfterpayToken')); $fields->replaceField('DebugMessage', new ReadonlyField('DebugMessage', 'Debug info')); return $fields; } public function getPaymentFormFields($amount = 0, ?Order $order = null): FieldList { $logo = '<img src="' . $this->Config()->logo . '" alt="Payments powered by Afterpay" />'; $api = $this->myAfterpayApi(); $html = ' <p> Afterpay allows ' . $api->getNumberOfPayments() . ' interest free payments of ' . $api->getAmountPerPaymentForCurrentOrder($order)->Nice() . ' each. ' . $logo . ' <a href="' . $this->config()->get('privacy_link') . '" target="_blank">Learn More</a> </p>'; return new FieldList([ new LiteralField('AfterpayDetails', $html), ]); } public function getPaymentFormRequirements(): array { return []; } /** * @param array $data The form request data - see OrderForm * @param Form $form The form object submitted on * * @return \Sunnysideup\Ecommerce\Money\Payment\EcommercePaymentResult */ public function processPayment($data, Form $form) { $order = $this->getOrderCached(); $token = $this->getTokenFromAfterpay($order); return $this->executeURL($token); } public function executeURL(string $token) { if ($token) { /** * build redirection page. */ $page = new SiteTree(); $page->Title = 'Redirection to Afterpay...'; $page->Logo = '<img src="' . $this->config()->get('logo') . '" alt="Payments powered by Afterpay"/>'; $controller = new ContentController($page); $requirement = Director::isLive() ? self::LIVE_URL : self::DEV_URL; Requirements::clear(); Requirements::insertHeadTags('<script type="text/javascript" src="' . $requirement . '"></script>'); Requirements::customScript('window.onload = function() { AfterPay.initialize({countryCode: "NZ"}); AfterPay.redirect({token: "' . $token . '"}); };'); return EcommercePaymentProcessing::create($controller->renderWith('Sunnysideup\Ecommerce\PaymentProcessingPage')); } $page = new SiteTree(); $page->Title = 'Sorry, Afterpay can not be contacted at the moment ...'; $page->Logo = 'Sorry, an error has occured in contacting the Payment Processing Provider, please try again in a few minutes...'; $controller = new ContentController($page); Requirements::clear(); return EcommercePaymentFailure::create($controller->renderWith('Sunnysideup\Ecommerce\PaymentProcessingPage')); } public function getTokenFromAfterpay($order): string { if (empty($this->AfterpayToken)) { $obj = OrderToAfterpayConverter::create($order); $data = $obj->convert(); $api = $this->myAfterpayApi(); $tokenObject = $api->createOrder($data); $this->AfterpayResponse = serialize($tokenObject); if ($tokenObject instanceof OrderToken) { $tokenString = $tokenObject->getToken(); $this->AfterpayToken = $tokenString; } else { $this->AfterpayToken = ''; } $this->write(); } return $this->AfterpayToken; } protected function myAfterpayApi() { return SilverstripeMerchantApi::inst() ->setMinAndMaxPrice( EcommerceConfig::inst()->AfterpayMinValue, EcommerceConfig::inst()->AfterpayMaxValue ) ->setIsServerAvailable(true) ; } } |