otices[ self::NOTICE_ID ] = [ 'time' => time(), 'dismissed' => true, ]; update_user_meta( $user_id, 'wpforms_admin_notices', $notices ); wp_send_json_success(); } /** * Check if the domain is registered. * * @since 1.10.0 * * @param mixed $api Api class. * @param string $mode Connection mode. * @param string $domain Domain. * * @return bool */ public function is_domain_registered( $api, string $mode = '', string $domain = '' ): bool { if ( ! $api instanceof Api || Helpers::is_legacy() ) { return $this->is_dismissed_notice(); } if ( ! $mode ) { $mode = Helpers::get_mode(); } if ( Transient::get( self::DOMAIN_REGISTERED_TRANSIENT_NAME . $mode ) ) { return true; } if ( ! $domain ) { $domain = $this->get_domain_name(); } $registered_domains = []; $page_size = 50; $page = 1; do { $domains_response = $api->list_domains( $page_size, $page ); if ( empty( $domains_response['wallet_domains'] ) ) { return false; } foreach ( $domains_response['wallet_domains'] as $domain_item ) { $registered_domains[] = $domain_item['domain']['name']; } $total_pages = $domains_response['total_pages'] ?? 1; ++$page; } while ( $page <= $total_pages ); $is_registered = in_array( $domain, $registered_domains, true ); Transient::set( self::DOMAIN_REGISTERED_TRANSIENT_NAME . $mode, $is_registered, DAY_IN_SECONDS ); return $is_registered; } /** * Check if the notice is marked as available. * * @since 1.10.0 * * @return bool */ private function is_dismissed_notice(): bool { $user_id = get_current_user_id(); $notices = get_user_meta( $user_id, 'wpforms_admin_notices', true ); return ! empty( $notices[ self::NOTICE_ID ]['dismissed'] ); } /** * Maybe register a domain. * * @since 1.10.0 * * @param Connection|null $connection Connection instance. * @param string $mode Connection mode. */ private function maybe_register_domain( $connection, string $mode ): void { if ( ! $connection ) { return; } $api = PayPalCommerce::get_api( $connection ); $domain = $this->get_domain_name(); if ( ! $api instanceof Api || $this->is_domain_registered( $api, $mode, $domain ) ) { return; } $api->register_domain( $domain ); } /** * Maybe de-register a domain. * * @since 1.10.0 * * @param Connection|null $connection Connection instance. * @param string $mode Connection mode. */ private function maybe_deregister_domain( $connection, string $mode ): void { if ( ! $connection ) { return; } $api = PayPalCommerce::get_api( $connection ); $domain = $this->get_domain_name(); if ( ! $api instanceof Api || ! $this->is_domain_registered( $api, $mode, $domain ) ) { return; } $api->deregister_domain( $domain, 'Account Disconnected' ); } /** * Maybe create a domain association file. * * @since 1.10.0 */ private function maybe_create_domain_association_file(): void { $wp_filesystem = File::get_filesystem(); if ( is_null( $wp_filesystem ) ) { return; } $association_dir = $wp_filesystem->abspath() . '.well-known'; // Ensure the directory exists. Only try to create it if it doesn't. if ( ! $wp_filesystem->is_dir( $association_dir ) && ! $wp_filesystem->mkdir( $association_dir, 0755 ) ) { $this->log_errors( 'Unable to create domain association folder in site root.' ); return; } $base_file_name = 'apple-developer-merchantid-domain-association'; $source_file_name = Helpers::get_mode() . '-' . $base_file_name; $association_file = trailingslashit( $association_dir ) . $base_file_name; $source = WPFORMS_PLUGIN_DIR . 'src/Integrations/PayPalCommerce/PaymentMethods/ApplePay/' . $source_file_name; // Copy/overwrite the association file into the directory. if ( ! $wp_filesystem->copy( $source, $association_file, true ) ) { $this->log_errors( 'Unable to copy domain association file to domain .well-known directory.' ); } } /** * Get the domain name. * * @since 1.10.0 * * @return string */ private function get_domain_name(): string { $hostname = wp_parse_url( home_url(), PHP_URL_HOST ); if ( ! $hostname ) { return ''; } return (string) $hostname; } /** * Log errors for the PayPal Commerce Domain Manager. * * @since 1.10.0 * * @param string $message The error message to be logged. */ private function log_errors( string $message ): void { Helpers::log_errors( 'PayPal Commerce: Domain Manager',0, $message ); } }