g (on mobile, ...) and sometimes not returning back. */ 'wcgateway.funding-sources-without-redirect' => static function (ContainerInterface $container): array { return array('paypal', 'paylater', 'venmo', 'card'); }, 'wcgateway.checkout.address-preset' => static function (ContainerInterface $container): CheckoutPayPalAddressPreset { return new CheckoutPayPalAddressPreset($container->get('session.handler')); }, 'wcgateway.asset_getter' => static function (ContainerInterface $container): AssetGetter { $factory = $container->get('assets.asset_getter_factory'); assert($factory instanceof AssetGetterFactory); return $factory->for_module('ppcp-wc-gateway'); }, 'wcgateway.endpoint.return-url' => static function (ContainerInterface $container): ReturnUrlEndpoint { $gateway = $container->get('wcgateway.paypal-gateway'); $endpoint = $container->get('api.endpoint.order'); return new ReturnUrlEndpoint($gateway, $endpoint, $container->get('session.handler'), $container->get('woocommerce.logger.woocommerce'), $container->get('api.helper.return-url-secret')); }, 'wcgateway.payer-action-return-forwarder' => static function (ContainerInterface $container): PayerActionReturnForwarder { return new PayerActionReturnForwarder($container->get('session.handler'), $container->get('http.redirector')); }, 'wcgateway.endpoint.refresh-feature-status' => static function (ContainerInterface $container): RefreshFeatureStatusEndpoint { return new RefreshFeatureStatusEndpoint($container->get('wcgateway.settings'), new Cache('ppcp-timeout'), $container->get('woocommerce.logger.woocommerce')); }, 'wcgateway.transaction-url-sandbox' => static function (ContainerInterface $container): string { return 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_view-a-trans&id=%s'; }, 'wcgateway.transaction-url-live' => static function (ContainerInterface $container): string { return 'https://www.paypal.com/cgi-bin/webscr?cmd=_view-a-trans&id=%s'; }, 'wcgateway.soft-descriptor' => static function (ContainerInterface $container): string { $settings_provider = $container->get('settings.settings-provider'); return $settings_provider->soft_descriptor(); }, 'wcgateway.transaction-url-provider' => static function (ContainerInterface $container): TransactionUrlProvider { $sandbox_url_base = $container->get('wcgateway.transaction-url-sandbox'); $live_url_base = $container->get('wcgateway.transaction-url-live'); return new TransactionUrlProvider($sandbox_url_base, $live_url_base, $container->get('settings.environment')); }, 'wcgateway.configuration.card-configuration' => static function (ContainerInterface $container): CardPaymentsConfiguration { return new CardPaymentsConfiguration($container->get('settings.connection-state'), $container->get('settings.settings-provider'), $container->get('api.helpers.dccapplies'), $container->get('wcgateway.helper.dcc-product-status'), $container->get('api.shop.country')); }, 'wcgateway.helper.dcc-product-status' => static function (ContainerInterface $container): DCCProductStatus { return new DCCProductStatus($container->get('settings.flag.is-connected'), $container->get('api.endpoint.partners'), $container->get('api.helper.failure-registry'), $container->get('api.helper.product-status-result-cache'), $container->get('api.helpers.dccapplies')); }, 'wcgateway.helper.refund-fees-updater' => static function (ContainerInterface $container): RefundFeesUpdater { $order_endpoint = $container->get('api.endpoint.order'); $logger = $container->get('woocommerce.logger.woocommerce'); return new RefundFeesUpdater($order_endpoint, $logger); }, 'wcgateway.helper.fees-updater' => static function (ContainerInterface $container): FeesUpdater { return new FeesUpdater($container->get('api.endpoint.orders'), $container->get('api.factory.capture'), $container->get('woocommerce.logger.woocommerce')); }, 'wcgateway.helper.resumed-order-shipping-restorer' => static function (ContainerInterface $container): ResumedOrderShippingRestorer { return new ResumedOrderShippingRestorer($container->get('woocommerce.logger.woocommerce')); }, 'button.helper.messages-disclaimers' => static function (ContainerInterface $container): MessagesDisclaimers { return new MessagesDisclaimers($container->get('api.shop.country')); }, 'wcgateway.funding-source.renderer' => function (ContainerInterface $container): FundingSourceRenderer { return new FundingSourceRenderer($container->get('settings.settings-provider'), array_merge($container->get('wcgateway.all-funding-sources'), $container->get('wcgateway.extra-funding-sources'))); }, 'wcgateway.payment-method-title-enricher' => static function (ContainerInterface $container): PaymentMethodTitleEnricher { return new PaymentMethodTitleEnricher($container->get('wcgateway.asset_getter')); }, 'wcgateway.checkout-helper' => static function (ContainerInterface $container): CheckoutHelper { return new CheckoutHelper(); }, 'wcgateway.fraudnet-source-website-id' => static function (ContainerInterface $container): FraudNetSourceWebsiteId { return new FraudNetSourceWebsiteId($container->get('api.merchant_id')); }, 'wcgateway.fraudnet' => static function (ContainerInterface $container): FraudNet { $source_website_id = $container->get('wcgateway.fraudnet-source-website-id'); return new FraudNet((string) $source_website_id()); }, 'wcgateway.pay-upon-invoice-helper' => static function (ContainerInterface $container): PayUponInvoiceHelper { return new PayUponInvoiceHelper($container->get('wcgateway.checkout-helper'), $container->get('api.shop.country'), $container->get('settings.data.payment')); }, 'wcgateway.pay-upon-invoice-product-status' => static function (ContainerInterface $container): PayUponInvoiceProductStatus { return new PayUponInvoiceProductStatus($container->get('settings.flag.is-connected'), $container->get('api.endpoint.partners'), $container->get('api.helper.failure-registry'), $container->get('api.helper.product-status-result-cache')); }, 'wcgateway.installments-product-status' => static function (ContainerInterface $container): InstallmentsProductStatus { return new InstallmentsProductStatus($container->get('settings.flag.is-connected'), $container->get('api.endpoint.partners'), $container->get('api.helper.failure-registry'), $container->get('api.helper.product-status-result-cache')); }, 'wcgateway.pwc-product-status' => static function (ContainerInterface $container): PWCProductStatus { return new PWCProductStatus($container->get('settings.flag.is-connected'), $container->get('api.endpoint.partners'), $container->get('api.helper.failure-registry'), $container->get('api.helper.product-status-result-cache')); }, 'wcgateway.logging.is-enabled' => static function (ContainerInterface $container): bool { $settings = $container->get('settings.data.settings'); assert($settings instanceof SettingsModel); $is_enabled = $settings->get_enable_logging(); if (!$is_enabled) { $state = $container->get('settings.connection-state'); assert($state instanceof ConnectionState); $is_enabled = $state->is_onboarding(); } /** * Whether the logging of the plugin errors/events is enabled. * * @param bool $is_enabled Whether the logging is enabled. */ return apply_filters('woocommerce_paypal_payments_is_logging_enabled', $is_enabled); }, 'wcgateway.use-place-order-button' => function (ContainerInterface $container): bool { /** * Whether to use the standard "Place order" button with redirect to PayPal instead of the PayPal smart buttons. */ return apply_filters('woocommerce_paypal_payments_use_place_order_button', \false); }, 'wcgateway.helper.vaulting-scope' => static function (ContainerInterface $container): bool { try { $token = $container->get('api.bearer')->bearer(); return $token->vaulting_available(); } catch (RuntimeException $exception) { return \false; } }, 'button.helper.vaulting-label' => static function (ContainerInterface $container): string { $vaulting_label = ''; if (!$container->get('wcgateway.helper.vaulting-scope')) { $vaulting_label .= sprintf( // translators: %1$s and %2$s are the opening and closing of HTML tag. __(' To use vaulting features, you must %1$senable vaulting on your account%2$s.', 'woocommerce-paypal-payments'), '', '' ); } $vaulting_label .= '

'; $vaulting_label .= sprintf( // translators: %1$s, %2$s, %3$s and %4$s are the opening and closing of HTML tag. __('This will disable all %1$sPay Later%2$s features and %3$sAlternative Payment Methods%4$s on your site.', 'woocommerce-paypal-payments'), '', '', '', '' ); $vaulting_label .= '

'; return $vaulting_label; }, 'wcgateway.settings.dcc-gateway-title.default' => static function (ContainerInterface $container): string { return did_action('init') ? __('Debit & Credit Cards', 'woocommerce-paypal-payments') : 'Debit & Credit Cards'; }, 'wcgateway.settings.card_billing_data_mode.default' => static function (ContainerInterface $container): string { return $container->get('api.shop.is-latin-america') ? \WooCommerce\PayPalCommerce\WcGateway\CardBillingMode::MINIMAL_INPUT : \WooCommerce\PayPalCommerce\WcGateway\CardBillingMode::USE_WC; }, 'wcgateway.settings.card_billing_data_mode' => static function (ContainerInterface $container): string { $settings = $container->get('wcgateway.settings'); assert($settings instanceof ContainerInterface); return $settings->has('card_billing_data_mode') ? (string) $settings->get('card_billing_data_mode') : $container->get('wcgateway.settings.card_billing_data_mode.default'); }, 'wcgateway.settings.allow_card_button_gateway.default' => static function (ContainerInterface $container): bool { return $container->get('api.shop.is-latin-america'); }, 'wcgateway.settings.allow_card_button_gateway' => static function (ContainerInterface $container): bool { $settings = $container->get('wcgateway.settings'); assert($settings instanceof ContainerInterface); return apply_filters('woocommerce_paypal_payments_enable_standard_card_button_gateway_settings', $settings->has('allow_card_button_gateway') ? (bool) $settings->get('allow_card_button_gateway') : $container->get('wcgateway.settings.allow_card_button_gateway.default')); }, 'wcgateway.settings.has_enabled_separate_button_gateways' => static function (ContainerInterface $container): bool { return (bool) $container->get('wcgateway.settings.allow_card_button_gateway'); }, 'wcgateway.settings.should-disable-fraudnet-checkbox' => static function (ContainerInterface $container): bool { $pui_helper = $container->get('wcgateway.pay-upon-invoice-helper'); assert($pui_helper instanceof PayUponInvoiceHelper); if ($pui_helper->is_pui_gateway_enabled()) { return \true; } return \false; }, 'wcgateway.settings.fraudnet-label' => static function (ContainerInterface $container): string { $label = sprintf( // translators: %1$s and %2$s are the opening and closing of HTML tag. __('Manage online risk with %1$sFraudNet%2$s.', 'woocommerce-paypal-payments'), '', '' ); if ('DE' === $container->get('api.shop.country')) { $label .= '
' . sprintf( // translators: %1$s and %2$s are the opening and closing of HTML tag. __('Required when %1$sPay upon Invoice%2$s is used.', 'woocommerce-paypal-payments'), '', '' ); } return $label; }, 'wcgateway.enable-dcc-url-sandbox' => static function (ContainerInterface $container): string { return 'https://www.sandbox.paypal.com/bizsignup/entry?product=ppcp'; }, 'wcgateway.enable-dcc-url-live' => static function (ContainerInterface $container): string { return 'https://www.paypal.com/bizsignup/entry?product=ppcp'; }, 'wcgateway.enable-pui-url-sandbox' => static function (ContainerInterface $container): string { return 'https://www.sandbox.paypal.com/bizsignup/entry?country.x=DE&product=payment_methods&capabilities=PAY_UPON_INVOICE'; }, 'wcgateway.enable-pui-url-live' => static function (ContainerInterface $container): string { return 'https://www.paypal.com/bizsignup/entry?country.x=DE&product=payment_methods&capabilities=PAY_UPON_INVOICE'; }, 'wcgateway.enable-reference-transactions-url-sandbox' => static function (ContainerInterface $container): string { return 'https://www.sandbox.paypal.com/bizsignup/entry?product=ADVANCED_VAULTING'; }, 'wcgateway.enable-reference-transactions-url-live' => static function (ContainerInterface $container): string { return 'https://www.paypal.com/bizsignup/entry?product=ADVANCED_VAULTING'; }, 'wcgateway.settings.connection.dcc-status-text' => static function (ContainerInterface $container): string { $is_connected = $container->get('settings.flag.is-connected'); if (!$is_connected) { return ''; } $dcc_product_status = $container->get('wcgateway.helper.dcc-product-status'); assert($dcc_product_status instanceof DCCProductStatus); $environment = $container->get('settings.environment'); assert($environment instanceof Environment); $dcc_enabled = $dcc_product_status->is_active(); $enabled_status_text = esc_html__('Status: Available', 'woocommerce-paypal-payments'); $disabled_status_text = esc_html__('Status: Not yet enabled', 'woocommerce-paypal-payments'); $dcc_button_text = $dcc_enabled ? esc_html__('Settings', 'woocommerce-paypal-payments') : esc_html__('Enable Advanced Card Payments', 'woocommerce-paypal-payments'); $enable_dcc_url = $environment->is_production() ? $container->get('wcgateway.enable-dcc-url-live') : $container->get('wcgateway.enable-dcc-url-sandbox'); $dcc_button_url = $dcc_enabled ? admin_url('admin.php?page=wc-settings&tab=checkout§ion=ppcp-gateway') : $enable_dcc_url; return sprintf('

%1$s %2$s

%5$s

', $dcc_enabled ? $enabled_status_text : $disabled_status_text, $dcc_enabled ? '' : '', $dcc_enabled ? '_self' : '_blank', esc_url($dcc_button_url), esc_html($dcc_button_text)); }, 'wcgateway.settings.connection.reference-transactions-status-text' => static function (ContainerInterface $container): string { $environment = $container->get('settings.environment'); assert($environment instanceof Environment); $reference_transaction_status = $container->get('api.reference-transaction-status'); assert($reference_transaction_status instanceof ReferenceTransactionStatus); $enabled = $reference_transaction_status->reference_transaction_enabled(); $enabled_status_text = esc_html__('Status: Available', 'woocommerce-paypal-payments'); $disabled_status_text = esc_html__('Status: Not yet enabled', 'woocommerce-paypal-payments'); $button_text = $enabled ? esc_html__('Settings', 'woocommerce-paypal-payments') : esc_html__('Enable saving PayPal & Venmo', 'woocommerce-paypal-payments'); $enable_url = $environment->is_production() ? $container->get('wcgateway.enable-reference-transactions-url-live') : $container->get('wcgateway.enable-reference-transactions-url-sandbox'); $button_url = $enabled ? admin_url('admin.php?page=wc-settings&tab=checkout§ion=ppcp-gateway#field-paypal_saved_payments') : $enable_url; return sprintf('

%1$s %2$s

%5$s

', $enabled ? $enabled_status_text : $disabled_status_text, $enabled ? '' : '', $enabled ? '_self' : '_blank', esc_url($button_url), esc_html($button_text)); }, 'wcgateway.settings.connection.pui-status-text' => static function (ContainerInterface $container): string { $is_connected = $container->get('settings.flag.is-connected'); if (!$is_connected) { return ''; } $pui_product_status = $container->get('wcgateway.pay-upon-invoice-product-status'); assert($pui_product_status instanceof PayUponInvoiceProductStatus); $environment = $container->get('settings.environment'); assert($environment instanceof Environment); $pui_enabled = $pui_product_status->is_active(); $enabled_status_text = esc_html__('Status: Available', 'woocommerce-paypal-payments'); $disabled_status_text = esc_html__('Status: Not yet enabled', 'woocommerce-paypal-payments'); $enable_pui_url = $environment->is_production() ? $container->get('wcgateway.enable-pui-url-live') : $container->get('wcgateway.enable-pui-url-sandbox'); $pui_button_url = $pui_enabled ? admin_url('admin.php?page=wc-settings&tab=checkout§ion=ppcp-pay-upon-invoice-gateway') : $enable_pui_url; $pui_button_text = $pui_enabled ? esc_html__('Settings', 'woocommerce-paypal-payments') : esc_html__('Enable Pay upon Invoice', 'woocommerce-paypal-payments'); return sprintf('

%1$s %2$s

%5$s

', $pui_enabled ? $enabled_status_text : $disabled_status_text, $pui_enabled ? '' : '', $pui_enabled ? '_self' : '_blank', esc_url($pui_button_url), esc_html($pui_button_text)); }, 'installments.status-cache' => static function (ContainerInterface $container): Cache { return new Cache('ppcp-paypal-installments-status-cache'); }, 'wcgateway.button.locations' => static function (ContainerInterface $container): array { return array('product' => 'Single Product', 'cart' => 'Classic Cart', 'checkout' => 'Classic Checkout', 'mini-cart' => 'Mini Cart'); }, 'wcgateway.button.default-locations' => static function (ContainerInterface $container): array { $button_locations = $container->get('wcgateway.button.locations'); unset($button_locations['mini-cart']); return array_keys($button_locations); }, 'wcgateway.button.recommended-styling-notice' => static function (ContainerInterface $container): string { if (CartCheckoutDetector::has_block_checkout()) { $block_checkout_page_string_html = '' . __('Checkout block', 'woocommerce-paypal-payments') . ''; } else { $block_checkout_page_string_html = __('Checkout block', 'woocommerce-paypal-payments'); } $notice_content = sprintf( /* translators: %1$s: URL to the Checkout edit page. */ __('Important: The Cart & Express Checkout Smart Button Stylings may be controlled by the %1$s configuration.', 'woocommerce-paypal-payments'), $block_checkout_page_string_html ); return '

' . $notice_content . '

'; }, 'wcgateway.settings.pay-later.messaging-locations' => static function (ContainerInterface $container): array { $button_locations = $container->get('wcgateway.button.locations'); unset($button_locations['mini-cart']); return array_merge($button_locations, array('shop' => did_action('init') ? __('Shop', 'woocommerce-paypal-payments') : 'Shop', 'home' => did_action('init') ? __('Home', 'woocommerce-paypal-payments') : 'Home')); }, 'wcgateway.settings.pay-later.default-messaging-locations' => static function (ContainerInterface $container): array { $locations = $container->get('wcgateway.settings.pay-later.messaging-locations'); unset($locations['home']); return array_keys($locations); }, 'wcgateway.settings.pay-later.button-locations' => static function (ContainerInterface $container): array { $settings_provider = $container->get('settings.settings-provider'); assert($settings_provider instanceof SettingsProvider); $button_locations = $container->get('wcgateway.button.locations'); $smart_button_selected_locations = $settings_provider->smart_button_locations(); return array_intersect_key($button_locations, array_flip($smart_button_selected_locations)); }, 'wcgateway.settings.pay-later.default-button-locations' => static function (ContainerInterface $container): array { return $container->get('wcgateway.button.default-locations'); }, 'wcgateway.ppcp-gateways' => static function (ContainerInterface $container): array { return array(PayPalGateway::ID, CreditCardGateway::ID, PayUponInvoiceGateway::ID, CardButtonGateway::ID, OXXOGateway::ID, AxoGateway::ID, GooglePayGateway::ID, ApplePayGateway::ID); }, 'wcgateway.gateway-repository' => static function (ContainerInterface $container): GatewayRepository { return new GatewayRepository($container->get('wcgateway.ppcp-gateways')); }, 'wcgateway.is-fraudnet-enabled' => static function (ContainerInterface $container): bool { return \true; }, 'wcgateway.fraudnet-assets' => function (ContainerInterface $container): FraudNetAssets { return new FraudNetAssets($container->get('wcgateway.asset_getter'), $container->get('ppcp.asset-version'), $container->get('wcgateway.fraudnet'), $container->get('settings.environment'), $container->get('settings.settings-provider'), $container->get('wcgateway.gateway-repository'), $container->get('session.handler'), $container->get('wcgateway.is-fraudnet-enabled'), $container->get('button.helper.context')); }, 'wcgateway.wp-paypal-locales-map' => static function (ContainerInterface $container): array { return apply_filters('woocommerce_paypal_payments_button_locales', array('' => __('Browser language', 'woocommerce-paypal-payments'), 'ar_DZ' => __('Arabic (Algeria)', 'woocommerce-paypal-payments'), 'ar_BH' => __('Arabic (Bahrain)', 'woocommerce-paypal-payments'), 'ar_EG' => __('Arabic (Egypt)', 'woocommerce-paypal-payments'), 'ar_JO' => __('Arabic (Jordan)', 'woocommerce-paypal-payments'), 'ar_KW' => __('Arabic (Kuwait)', 'woocommerce-paypal-payments'), 'ar_MA' => __('Arabic (Morocco)', 'woocommerce-paypal-payments'), 'ar_SA' => __('Arabic (Saudi Arabia)', 'woocommerce-paypal-payments'), 'cs_CZ' => __('Czech', 'woocommerce-paypal-payments'), 'zh_CN' => __('Chinese (Simplified)', 'woocommerce-paypal-payments'), 'zh_HK' => __('Chinese (Hong Kong)', 'woocommerce-paypal-payments'), 'zh_TW' => __('Chinese (Traditional)', 'woocommerce-paypal-payments'), 'da_DK' => __('Danish', 'woocommerce-paypal-payments'), 'nl_NL' => __('Dutch', 'woocommerce-paypal-payments'), 'en_AU' => __('English (Australia)', 'woocommerce-paypal-payments'), 'en_GB' => __('English (United Kingdom)', 'woocommerce-paypal-payments'), 'en_US' => __('English (United States)', 'woocommerce-paypal-payments'), 'fi_FI' => __('Finnish', 'woocommerce-paypal-payments'), 'fr_CA' => __('French (Canada)', 'woocommerce-paypal-payments'), 'fr_FR' => __('French (France)', 'woocommerce-paypal-payments'), 'de_DE' => __('German (Germany)', 'woocommerce-paypal-payments'), 'de_CH' => __('German (Switzerland)', 'woocommerce-paypal-payments'), 'de_AT' => __('German (Austria)', 'woocommerce-paypal-payments'), 'de_LU' => __('German (Luxembourg)', 'woocommerce-paypal-payments'), 'el_GR' => __('Greek', 'woocommerce-paypal-payments'), 'he_IL' => __('Hebrew', 'woocommerce-paypal-payments'), 'hu_HU' => __('Hungarian', 'woocommerce-paypal-payments'), 'id_ID' => __('Indonesian', 'woocommerce-paypal-payments'), 'it_IT' => __('Italian', 'woocommerce-paypal-payments'), 'ja_JP' => __('Japanese', 'woocommerce-paypal-payments'), 'ko_KR' => __('Korean', 'woocommerce-paypal-payments'), 'no_NO' => __('Norwegian', 'woocommerce-paypal-payments'), 'es_ES' => __('Spanish (Spain)', 'woocommerce-paypal-payments'), 'es_MX' => __('Spanish (Mexico)', 'woocommerce-paypal-payments'), 'pl_PL' => __('Polish', 'woocommerce-paypal-payments'), 'pt_BR' => __('Portuguese (Brazil)', 'woocommerce-paypal-payments'), 'pt_PT' => __('Portuguese (Portugal)', 'woocommerce-paypal-payments'), 'ru_RU' => __('Russian', 'woocommerce-paypal-payments'), 'sk_SK' => __('Slovak', 'woocommerce-paypal-payments'), 'sv_SE' => __('Swedish', 'woocommerce-paypal-payments'), 'th_TH' => __('Thai', 'woocommerce-paypal-payments'))); }, 'wcgateway.endpoint.capture-card-payment' => static function (ContainerInterface $container): CaptureCardPayment { return new CaptureCardPayment($container->get('api.host'), $container->get('api.bearer'), $container->get('api.factory.order'), $container->get('api.factory.purchase-unit'), $container->get('settings.settings-provider'), $container->get('wcgateway.builder.experience-context'), $container->get('woocommerce.logger.woocommerce')); }, 'wcgateway.endpoint.capture-paypal-payment' => static function (ContainerInterface $container): CapturePayPalPayment { return new CapturePayPalPayment($container->get('api.host'), $container->get('api.bearer'), $container->get('api.factory.order'), $container->get('api.factory.purchase-unit'), $container->get('settings.settings-provider'), $container->get('woocommerce.logger.woocommerce')); }, 'wcgateway.settings.wc-tasks.simple-redirect-task-factory' => static function (): SimpleRedirectTaskFactoryInterface { return new SimpleRedirectTaskFactory(); }, 'wcgateway.settings.wc-tasks.task-registrar' => static function (): TaskRegistrarInterface { return new TaskRegistrar(); }, 'wcgateway.settings.wc-tasks.pay-later-task-config' => static function (ContainerInterface $container): array { $section_id = PayPalGateway::ID; if ($container->has('paylater-configurator.is-available') && $container->get('paylater-configurator.is-available')) { return array(array('id' => 'pay-later-messaging-task', 'title' => __('Configure PayPal Pay Later messaging', 'woocommerce-paypal-payments'), 'description' => __('Decide where you want dynamic Pay Later messaging to show up and how you want it to look on your site.', 'woocommerce-paypal-payments'), 'redirect_url' => admin_url("admin.php?page=wc-settings&tab=checkout§ion={$section_id}"))); } return array(); }, 'wcgateway.settings.wc-tasks.connect-task-config' => static function (ContainerInterface $container): array { $is_connected = $container->get('settings.flag.is-connected'); $is_current_country_send_only = $container->get('wcgateway.is-send-only-country'); if (!$is_connected && !$is_current_country_send_only) { return array(array('id' => 'connect-to-paypal-task', 'title' => __('Connect PayPal to complete setup', 'woocommerce-paypal-payments'), 'description' => __('PayPal Payments is almost ready. To get started, connect your account with the Activate PayPal Payments button.', 'woocommerce-paypal-payments'), 'redirect_url' => admin_url('admin.php?page=wc-settings&tab=checkout§ion=ppcp-gateway'))); } return array(); }, 'wcgateway.settings.wc-tasks.working-capital-config' => static function (ContainerInterface $container): array { $settings_provider = $container->get('settings.settings-provider'); assert($settings_provider instanceof SettingsProvider); $settings_provider = $container->get('settings.settings-provider'); assert($settings_provider instanceof SettingsProvider); $is_working_capital_feature_flag_enabled = apply_filters( // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores -- feature flags use this convention 'woocommerce.feature-flags.woocommerce_paypal_payments.working_capital_enabled', \true ); $is_working_capital_eligible = $container->get('api.shop.country') === 'US' && $settings_provider->stay_updated(); if (!$settings_provider->merchant_connected() || !$is_working_capital_feature_flag_enabled || !$is_working_capital_eligible) { return array(); } return array(array('id' => 'ppcp-working-capital-task', 'title' => __('Fuel your business growth with a PayPal Working Capital loan. Check eligibility', 'woocommerce-paypal-payments'), 'description' => '', 'redirect_url' => 'https://www.paypal.com/us/business/financial-services/working-capital?partner_camp_id=woocommerce_ppwc')); }, 'wcgateway.settings.wc-tasks.task-config-services' => static function (): array { return array('wcgateway.settings.wc-tasks.pay-later-task-config', 'wcgateway.settings.wc-tasks.connect-task-config', 'wcgateway.settings.wc-tasks.working-capital-config'); }, /** * A configuration for simple redirect wc tasks. * * @returns array */ 'wcgateway.settings.wc-tasks.simple-redirect-tasks-config' => static function (ContainerInterface $container): array { $list_of_config = array(); $task_config_services = $container->get('wcgateway.settings.wc-tasks.task-config-services'); foreach ($task_config_services as $service_id) { if ($container->has($service_id)) { $task_config = $container->get($service_id); $list_of_config = array_merge($list_of_config, $task_config); } } return $list_of_config; }, /** * Retrieves the list of simple redirect task instances. * * @returns SimpleRedirectTask[] */ 'wcgateway.settings.wc-tasks.simple-redirect-tasks' => static function (ContainerInterface $container): array { $simple_redirect_tasks_config = $container->get('wcgateway.settings.wc-tasks.simple-redirect-tasks-config'); $simple_redirect_task_factory = $container->get('wcgateway.settings.wc-tasks.simple-redirect-task-factory'); assert($simple_redirect_task_factory instanceof SimpleRedirectTaskFactoryInterface); $simple_redirect_tasks = array(); foreach ($simple_redirect_tasks_config as $config) { $id = $config['id'] ?? ''; $title = $config['title'] ?? ''; $description = $config['description'] ?? ''; $redirect_url = $config['redirect_url'] ?? ''; $simple_redirect_tasks[] = $simple_redirect_task_factory->create_task($id, $title, $description, $redirect_url); } return $simple_redirect_tasks; }, 'wcgateway.settings.inbox-note-factory' => static function (): InboxNoteFactory { return new InboxNoteFactory(); }, 'wcgateway.settings.inbox-note-registrar' => static function (ContainerInterface $container): InboxNoteRegistrar { return new InboxNoteRegistrar($container->get('wcgateway.settings.inbox-notes'), $container->get('ppcp.base-name')); }, /** * Retrieves the list of inbox note instances. * * @returns InboxNoteInterface[] */ 'wcgateway.settings.inbox-notes' => static function (ContainerInterface $container): array { $inbox_note_factory = $container->get('wcgateway.settings.inbox-note-factory'); assert($inbox_note_factory instanceof InboxNoteFactory); $settings = $container->get('wcgateway.settings'); assert($settings instanceof Settings); $settings_model = $container->get('settings.data.settings'); assert($settings_model instanceof SettingsModel); $messages_apply = $container->get('button.helper.messages-apply'); assert($messages_apply instanceof MessagesApply); $settings_provider = $container->get('settings.settings-provider'); assert($settings_provider instanceof SettingsProvider); $is_working_capital_feature_flag_enabled = apply_filters( // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores -- feature flags use this convention 'woocommerce.feature-flags.woocommerce_paypal_payments.working_capital_enabled', \true ); return array($inbox_note_factory->create_note(__('PayPal Working Capital', 'woocommerce-paypal-payments'), __('Business loans from $1k to $230k for first-time borrowers. Looking to fuel your business growth? With a PayPal Working Capital loan, approved loans are funded in minutes and repaid as a share of your sales. Minimum payment required every 90 days. The lender for PayPal Working Capital is WebBank.', 'woocommerce-paypal-payments'), Note::E_WC_ADMIN_NOTE_INFORMATIONAL, 'ppcp-working-capital-inbox-note', Note::E_WC_ADMIN_NOTE_UNACTIONED, $is_working_capital_feature_flag_enabled && $container->get('api.shop.country') === 'US' && $settings_model->get_stay_updated(), new InboxNoteAction('learn_more', __('Learn More', 'woocommerce-paypal-payments'), 'https://www.paypal.com/us/business/financial-services/working-capital?partner_camp_id=woocommerce_ppwc', Note::E_WC_ADMIN_NOTE_UNACTIONED, \true))); }, 'wcgateway.void-button.assets' => function (ContainerInterface $container): VoidButtonAssets { return new VoidButtonAssets($container->get('wcgateway.asset_getter'), $container->get('ppcp.asset-version'), $container->get('api.endpoint.order.cached'), $container->get('wcgateway.processor.refunds')); }, 'wcgateway.void-button.endpoint' => function (ContainerInterface $container): VoidOrderEndpoint { return new VoidOrderEndpoint($container->get('button.request-data'), $container->get('api.endpoint.order'), $container->get('wcgateway.processor.refunds'), $container->get('woocommerce.logger.woocommerce')); }, 'wcgateway.settings.admin-settings-enabled' => static function (ContainerInterface $container): bool { return $container->has('settings.asset_getter'); }, 'wcgateway.contact-module.eligibility.check' => static function (ContainerInterface $container): callable { $feature_enabled = (bool) apply_filters( // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores -- feature flags use this convention 'woocommerce.feature-flags.woocommerce_paypal_payments.contact_module_enabled', getenv('PCP_CONTACT_MODULE_ENABLED') !== '0' ); /** * Decides, whether the current merchant is eligible to use the * "Contact Module" feature on this site. */ return static function () use ($feature_enabled, $container) { if (!$feature_enabled) { return \false; } $details = $container->get('settings.merchant-details'); assert($details instanceof MerchantDetails); $enable_contact_module = 'US' === $details->get_merchant_country(); /** * The contact module is enabled for US-based merchants by default. * This filter provides the official way to opt-out of using it on this store. */ return (bool) apply_filters('woocommerce_paypal_payments_contact_module_enabled', $enable_contact_module); }; }, /** * Returns a centralized list of feature eligibility checks. * * This is a helper service which is used by the `MerchantDetails` class and * should not be directly accessed. */ 'wcgateway.feature-eligibility.list' => static function (ContainerInterface $container): array { return array(FeaturesDefinition::FEATURE_SAVE_PAYPAL_AND_VENMO => $container->get('save-payment-methods.eligibility.check'), FeaturesDefinition::FEATURE_ADVANCED_CREDIT_AND_DEBIT_CARDS => $container->get('card-fields.eligibility.check'), FeaturesDefinition::FEATURE_GOOGLE_PAY => $container->get('googlepay.eligibility.check'), FeaturesDefinition::FEATURE_APPLE_PAY => $container->get('applepay.eligibility.check'), FeaturesDefinition::FEATURE_CONTACT_MODULE => $container->get('wcgateway.contact-module.eligibility.check')); }, /** * Returns a prefix for the site, ensuring the same site always gets the same prefix (unless the URL changes). */ 'wcgateway.settings.invoice-prefix' => static function (ContainerInterface $container): string { $site_url = get_site_url(get_current_blog_id()); $hash = md5($site_url); $letters = preg_replace('~\d~', '', $hash) ?? ''; $prefix = substr($letters, 0, 6); return $prefix ? $prefix . '-' : ''; }, /** * Returns random 6 characters length alphabetic prefix, followed by a hyphen. */ 'wcgateway.settings.invoice-prefix-random' => static function (ContainerInterface $container): string { $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $prefix = ''; for ($i = 0; $i < 6; $i++) { $prefix .= $characters[wp_rand(0, strlen($characters) - 1)]; } return $prefix . '-'; }, 'wcgateway.store-api.endpoint.cart' => static function (ContainerInterface $container): CartEndpoint { return new CartEndpoint($container->get('wcgateway.store-api.factory.cart'), $container->get('woocommerce.logger.woocommerce')); }, 'wcgateway.store-api.factory.cart' => static function (ContainerInterface $container): CartFactory { return new CartFactory($container->get('wcgateway.store-api.factory.cart-totals'), $container->get('wcgateway.store-api.factory.shipping-rates')); }, 'wcgateway.store-api.factory.cart-totals' => static function (ContainerInterface $container): CartTotalsFactory { return new CartTotalsFactory($container->get('wcgateway.store-api.factory.money')); }, 'wcgateway.store-api.factory.shipping-rates' => static function (ContainerInterface $container): ShippingRatesFactory { return new ShippingRatesFactory($container->get('wcgateway.store-api.factory.money')); }, 'wcgateway.store-api.factory.money' => static function (ContainerInterface $container): MoneyFactory { return new MoneyFactory(); }, 'wcgateway.shipping.callback.endpoint' => static function (ContainerInterface $container): ShippingCallbackEndpoint { return new ShippingCallbackEndpoint($container->get('wcgateway.store-api.endpoint.cart'), $container->get('api.factory.amount'), $container->get('woocommerce.logger.woocommerce'), $container->get('button.session.storage.card-data.transient')); }, 'wcgateway.shipping.callback.factory.url' => static function (ContainerInterface $container): ShippingCallbackUrlFactory { return new ShippingCallbackUrlFactory($container->get('wcgateway.store-api.endpoint.cart'), $container->get('wcgateway.shipping.callback.endpoint')); }, 'wcgateway.server-side-shipping-callback-enabled' => static function (ContainerInterface $container): bool { // SSSC depends on Woo's Store API, which currently doesn't work with plain permalinks because of the rest_get_url_prefix bug. $has_plain_permalinks = empty(get_option('permalink_structure')); $last_webhook_storage = $container->get('webhook.last-webhook-storage'); assert($last_webhook_storage instanceof WebhookEventStorage); // Not directly related, but if webhooks are not arriving then SSSC probably is not accessible too. $webhooks_working = !$last_webhook_storage->is_empty(); $enabled = getenv('PCP_SERVER_SIDE_SHIPPING_CALLBACK_ENABLED') !== '0' && !$has_plain_permalinks && $webhooks_working; return apply_filters( // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores 'woocommerce.feature-flags.woocommerce_paypal_payments.server_side_shipping_callback_enabled', $enabled ); }, 'wcgateway.appswitch-enabled' => static function (ContainerInterface $container): bool { return apply_filters( // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores 'woocommerce.feature-flags.woocommerce_paypal_payments.appswitch_enabled', getenv('PCP_APPSWITCH_ENABLED') !== '0' ); }, );