add paypal credit card gateway

This commit is contained in:
David Remer 2020-08-18 09:04:58 +03:00
parent 03d2ed9897
commit 087a532023
6 changed files with 141 additions and 45 deletions

View file

@ -11,6 +11,7 @@ use Inpsyde\PayPalCommerce\WcGateway\Admin\OrderTablePaymentStatusColumn;
use Inpsyde\PayPalCommerce\WcGateway\Admin\PaymentStatusOrderDetail;
use Inpsyde\PayPalCommerce\WcGateway\Checkout\CheckoutPayPalAddressPreset;
use Inpsyde\PayPalCommerce\WcGateway\Checkout\DisableGateways;
use Inpsyde\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
use Inpsyde\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
use Inpsyde\PayPalCommerce\WcGateway\Notice\AuthorizeOrderActionNotice;
use Inpsyde\PayPalCommerce\WcGateway\Notice\ConnectAdminNotice;
@ -37,6 +38,21 @@ return [
$settings
);
},
'wcgateway.credit-card-gateway' => static function (ContainerInterface $container): CreditCardGateway {
$orderProcessor = $container->get('wcgateway.order-processor');
$settingsRenderer = $container->get('wcgateway.settings.render');
$authorizedPayments = $container->get('wcgateway.processor.authorized-payments');
$notice = $container->get('wcgateway.notice.authorize-order-action');
$settings = $container->get('wcgateway.settings');
return new CreditCardGateway(
$settingsRenderer,
$orderProcessor,
$authorizedPayments,
$notice,
$settings
);
},
'wcgateway.disabler' => static function (ContainerInterface $container): DisableGateways {
$sessionHandler = $container->get('session.handler');
$settings = $container->get('wcgateway.settings');
@ -136,6 +152,7 @@ return [
State::STATE_PROGRESSIVE,
],
'requirements' => [],
'gateway' => 'all',
],
'sandbox_on' => [
'title' => __('Sandbox', 'woocommerce-paypal-commerce-gateway'),
@ -146,6 +163,7 @@ return [
State::STATE_START,
],
'requirements' => [],
'gateway' => 'all',
],
'sandbox_on_info' => [
'title' => __('Sandbox', 'woocommerce-paypal-commerce-gateway'),
@ -157,6 +175,7 @@ return [
],
'hidden' => 'sandbox_on',
'requirements' => [],
'gateway' => 'all',
],
'merchant_email' => [
'title' => __('Email address', 'woocommerce-paypal-commerce-gateway'),
@ -169,6 +188,7 @@ return [
State::STATE_START,
],
'requirements' => [],
'gateway' => 'all',
],
'merchant_email_info' => [
'title' => __('Email address', 'woocommerce-paypal-commerce-gateway'),
@ -180,6 +200,7 @@ return [
],
'hidden' => 'merchant_email',
'requirements' => [],
'gateway' => 'all',
],
'toggle_manual_input' => [
'type' => 'ppcp-text',
@ -191,6 +212,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'all',
],
'client_id' => [
'title' => __('Client Id', 'woocommerce-paypal-commerce-gateway'),
@ -204,6 +226,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'all',
],
'client_secret' => [
'title' => __('Secret Key', 'woocommerce-paypal-commerce-gateway'),
@ -217,6 +240,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'all',
],
'title' => [
'title' => __('Title', 'woocommerce-paypal-commerce-gateway'),
@ -232,6 +256,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'description' => [
'title' => __('Description', 'woocommerce-paypal-commerce-gateway'),
@ -250,6 +275,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'intent' => [
'title' => __('Intent', 'woocommerce-paypal-commerce-gateway'),
@ -269,6 +295,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'button_single_product_enabled' => [
'title' => __('Buttons on Single Product', 'woocommerce-paypal-commerce-gateway'),
@ -280,6 +307,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'button_mini_cart_enabled' => [
'title' => __('Buttons on Mini Cart', 'woocommerce-paypal-commerce-gateway'),
@ -291,6 +319,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'button_cart_enabled' => [
'title' => __('Buttons on Cart', 'woocommerce-paypal-commerce-gateway'),
@ -302,6 +331,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'button_label' => [
'title' => __('Button Label', 'woocommerce-paypal-commerce-gateway'),
@ -324,6 +354,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'brand_name' => [
'title' => __('Brand Name', 'woocommerce-paypal-commerce-gateway'),
@ -339,6 +370,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'landing_page' => [
'title' => __('Landing Page', 'woocommerce-paypal-commerce-gateway'),
@ -359,6 +391,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'button_color' => [
'title' => __('Color', 'woocommerce-paypal-commerce-gateway'),
@ -381,6 +414,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'button_shape' => [
'title' => __('Shape', 'woocommerce-paypal-commerce-gateway'),
@ -401,6 +435,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'disable_funding' => [
'title' => __('Disable funding sources', 'woocommerce-paypal-commerce-gateway'),
@ -429,6 +464,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'paypal',
],
'vault_enabled' => [
'title' => __('Vaulting', 'woocommerce-paypal-commerce-gateway'),
@ -441,30 +477,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
],
'dcc_cart_enabled' => [
'title' => __('Enable credit card on cart', 'woocommerce-paypal-commerce-gateway'),
'type' => 'checkbox',
'label' => __('Allow your customers to pay with credit card directly in your cart.', 'woocommerce-paypal-commerce-gateway'),
'default' => true,
'screens' => [
State::STATE_ONBOARDED,
],
'requirements' => [
'dcc',
],
],
'dcc_mini_cart_enabled' => [
'title' => __('Enable credit card on mini cart', 'woocommerce-paypal-commerce-gateway'),
'type' => 'checkbox',
'label' => __('Allow your customers to pay with credit card directly in your mini cart.', 'woocommerce-paypal-commerce-gateway'),
'default' => true,
'screens' => [
State::STATE_ONBOARDED,
],
'requirements' => [
'dcc',
],
'gateway' => 'paypal',
],
'dcc_checkout_enabled' => [
'title' => __('Enable credit card on checkout', 'woocommerce-paypal-commerce-gateway'),
@ -477,18 +490,7 @@ return [
'requirements' => [
'dcc',
],
],
'dcc_single_product_enabled' => [
'title' => __('Enable credit card on products', 'woocommerce-paypal-commerce-gateway'),
'type' => 'checkbox',
'label' => __('Allow your customers to pay with credit card instantly on the product page.', 'woocommerce-paypal-commerce-gateway'),
'default' => true,
'screens' => [
State::STATE_ONBOARDED,
],
'requirements' => [
'dcc',
],
'gateway' => 'dcc',
],
'disable_cards' => [
'title' => __('Disable specific credit cards', 'woocommerce-paypal-commerce-gateway'),
@ -515,6 +517,7 @@ return [
'requirements' => [
'dcc',
],
'gateway' => 'dcc',
],
'logging_enabled' => [
'title' => __('Logging', 'woocommerce-paypal-commerce-gateway'),
@ -529,6 +532,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'all',
],
'prefix' => [
'title' => __('Installation prefix', 'woocommerce-paypal-commerce-gateway'),
@ -542,6 +546,7 @@ return [
State::STATE_ONBOARDED,
],
'requirements' => [],
'gateway' => 'all',
],
];
},

View file

@ -0,0 +1,79 @@
<?php
declare(strict_types=1);
namespace Inpsyde\PayPalCommerce\WcGateway\Gateway;
use Inpsyde\PayPalCommerce\WcGateway\Notice\AuthorizeOrderActionNotice;
use Inpsyde\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
use Inpsyde\PayPalCommerce\WcGateway\Processor\OrderProcessor;
use Inpsyde\PayPalCommerce\WcGateway\Settings\SettingsRenderer;
use Psr\Container\ContainerInterface;
class CreditCardGateway extends PayPalGateway
{
public const ID = 'ppcp-credit-card-gateway';
public function __construct(
SettingsRenderer $settingsRenderer,
OrderProcessor $orderProcessor,
AuthorizedPaymentsProcessor $authorizedPayments,
AuthorizeOrderActionNotice $notice,
ContainerInterface $config
) {
$this->id = self::ID;
$this->orderProcessor = $orderProcessor;
$this->authorizedPayments = $authorizedPayments;
$this->notice = $notice;
$this->settingsRenderer = $settingsRenderer;
$this->config = $config;
if ($this->config->has('vault_enabled') && $this->config->get('vault_enabled')) {
$this->supports = [
'products',
'subscriptions',
'subscription_cancellation',
'subscription_suspension',
'subscription_reactivation',
'subscription_amount_changes',
'subscription_date_changes',
'subscription_payment_method_change',
'subscription_payment_method_change_customer',
'subscription_payment_method_change_admin',
'multiple_subscriptions',
];
}
$this->method_title = __('Credit Card Payments', 'woocommerce-paypal-commerce-gateway');
$this->method_description = __(
'Provide your customers with the option to pay with credit card.',
'woocommerce-paypal-commerce-gateway'
);
$this->title = $this->config->has('title') ?
$this->config->get('title') : $this->method_title;
$this->description = $this->config->has('description') ?
$this->config->get('description') : $this->method_description;
$this->init_form_fields();
$this->init_settings();
add_action(
'woocommerce_update_options_payment_gateways_' . $this->id,
[
$this,
'process_admin_options',
]
);
}
public function generate_ppcp_html(): string
{
ob_start();
$this->settingsRenderer->render(true);
$content = ob_get_contents();
ob_end_clean();
return $content;
}
}

View file

@ -30,11 +30,11 @@ class PayPalGateway extends \WC_Payment_Gateway
public const INTENT_META_KEY = '_ppcp_paypal_intent';
public const ORDER_ID_META_KEY = '_ppcp_paypal_order_id';
private $settingsRenderer;
private $authorizedPayments;
private $notice;
private $orderProcessor;
private $config;
protected $settingsRenderer;
protected $authorizedPayments;
protected $notice;
protected $orderProcessor;
protected $config;
public function __construct(
SettingsRenderer $settingsRenderer,
@ -178,7 +178,7 @@ class PayPalGateway extends \WC_Payment_Gateway
{
ob_start();
$this->settingsRenderer->render();
$this->settingsRenderer->render(false);
$content = ob_get_contents();
ob_end_clean();
return $content;

View file

@ -60,8 +60,13 @@ class SettingsListener
*/
$rawData = (isset($_POST['ppcp'])) ? (array) wp_unslash($_POST['ppcp']) : [];
$settings = $this->retrieveSettingsFromRawData($rawData);
$settings['enabled'] = isset($_POST['woocommerce_ppcp-gateway_enabled'])
&& absint($_POST['woocommerce_ppcp-gateway_enabled']) === 1;
$settings['enabled'] = (
isset($_POST['woocommerce_ppcp-gateway_enabled'])
&& absint($_POST['woocommerce_ppcp-gateway_enabled']) === 1
) || (
isset($_POST['woocommerce_ppcp-credit-card-gateway_enabled'])
&& absint($_POST['woocommerce_ppcp-credit-card-gateway_enabled']) === 1
);
foreach ($settings as $id => $value) {
$this->settings->set($id, $value);
}

View file

@ -106,7 +106,7 @@ class SettingsRenderer
}
//phpcs:enable Inpsyde.CodeQuality.ArgumentTypeDeclaration.NoArgumentType
public function render()
public function render(bool $isDcc)
{
$nonce = wp_create_nonce(SettingsListener::NONCE);
@ -117,6 +117,12 @@ class SettingsRenderer
if (! in_array($this->state->currentState(), $config['screens'], true)) {
continue;
}
if ($isDcc && ! in_array($config['gateway'], ['all', 'dcc'],true)) {
continue;
}
if (! $isDcc && ! in_array($config['gateway'], ['all', 'paypal'],true)) {
continue;
}
if (in_array('dcc', $config['requirements'], true) && ! $this->dccApplies->forCountryCurrency()) {
continue;
}

View file

@ -99,6 +99,7 @@ class WcGatewayModule implements ModuleInterface
'woocommerce_payment_gateways',
static function ($methods) use ($container): array {
$methods[] = $container->get('wcgateway.paypal-gateway');
$methods[] = $container->get('wcgateway.credit-card-gateway');
return (array)$methods;
}
);