@@ -37,138 +37,138 @@ |
||
37 | 37 | * @since 4.0 |
38 | 38 | */ |
39 | 39 | if (function_exists('espresso_version')) { |
40 | - if (! function_exists('espresso_duplicate_plugin_error')) { |
|
41 | - /** |
|
42 | - * espresso_duplicate_plugin_error |
|
43 | - * displays if more than one version of EE is activated at the same time. |
|
44 | - */ |
|
45 | - function espresso_duplicate_plugin_error() |
|
46 | - { |
|
47 | - ?> |
|
40 | + if (! function_exists('espresso_duplicate_plugin_error')) { |
|
41 | + /** |
|
42 | + * espresso_duplicate_plugin_error |
|
43 | + * displays if more than one version of EE is activated at the same time. |
|
44 | + */ |
|
45 | + function espresso_duplicate_plugin_error() |
|
46 | + { |
|
47 | + ?> |
|
48 | 48 | <div class="error"> |
49 | 49 | <p> |
50 | 50 | <?php |
51 | - echo esc_html__( |
|
52 | - 'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.', |
|
53 | - 'event_espresso' |
|
54 | - ); ?> |
|
51 | + echo esc_html__( |
|
52 | + 'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.', |
|
53 | + 'event_espresso' |
|
54 | + ); ?> |
|
55 | 55 | </p> |
56 | 56 | </div> |
57 | 57 | <?php |
58 | - espresso_deactivate_plugin(plugin_basename(__FILE__)); |
|
59 | - } |
|
60 | - } |
|
61 | - add_action('admin_notices', 'espresso_duplicate_plugin_error', 1); |
|
58 | + espresso_deactivate_plugin(plugin_basename(__FILE__)); |
|
59 | + } |
|
60 | + } |
|
61 | + add_action('admin_notices', 'espresso_duplicate_plugin_error', 1); |
|
62 | 62 | } else { |
63 | - define('EE_MIN_PHP_VER_REQUIRED', '7.4.0'); |
|
64 | - if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) { |
|
65 | - /** |
|
66 | - * espresso_minimum_php_version_error |
|
67 | - * |
|
68 | - * @return void |
|
69 | - */ |
|
70 | - function espresso_minimum_php_version_error() |
|
71 | - { |
|
72 | - ?> |
|
63 | + define('EE_MIN_PHP_VER_REQUIRED', '7.4.0'); |
|
64 | + if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) { |
|
65 | + /** |
|
66 | + * espresso_minimum_php_version_error |
|
67 | + * |
|
68 | + * @return void |
|
69 | + */ |
|
70 | + function espresso_minimum_php_version_error() |
|
71 | + { |
|
72 | + ?> |
|
73 | 73 | <div class="error"> |
74 | 74 | <p> |
75 | 75 | <?php |
76 | - printf( |
|
77 | - esc_html__( |
|
78 | - 'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.', |
|
79 | - 'event_espresso' |
|
80 | - ), |
|
81 | - EE_MIN_PHP_VER_REQUIRED, |
|
82 | - PHP_VERSION, |
|
83 | - '<br/>', |
|
84 | - '<a href="https://www.php.net/downloads.php">https://php.net/downloads.php</a>' |
|
85 | - ); |
|
86 | - ?> |
|
76 | + printf( |
|
77 | + esc_html__( |
|
78 | + 'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.', |
|
79 | + 'event_espresso' |
|
80 | + ), |
|
81 | + EE_MIN_PHP_VER_REQUIRED, |
|
82 | + PHP_VERSION, |
|
83 | + '<br/>', |
|
84 | + '<a href="https://www.php.net/downloads.php">https://php.net/downloads.php</a>' |
|
85 | + ); |
|
86 | + ?> |
|
87 | 87 | </p> |
88 | 88 | </div> |
89 | 89 | <?php |
90 | - espresso_deactivate_plugin(plugin_basename(__FILE__)); |
|
91 | - } |
|
90 | + espresso_deactivate_plugin(plugin_basename(__FILE__)); |
|
91 | + } |
|
92 | 92 | |
93 | - add_action('admin_notices', 'espresso_minimum_php_version_error', 1); |
|
94 | - } else { |
|
95 | - define('EVENT_ESPRESSO_MAIN_FILE', __FILE__); |
|
93 | + add_action('admin_notices', 'espresso_minimum_php_version_error', 1); |
|
94 | + } else { |
|
95 | + define('EVENT_ESPRESSO_MAIN_FILE', __FILE__); |
|
96 | 96 | |
97 | - require_once __DIR__ . '/vendor/autoload.php'; |
|
97 | + require_once __DIR__ . '/vendor/autoload.php'; |
|
98 | 98 | |
99 | - /** |
|
100 | - * espresso_version |
|
101 | - * Returns the plugin version |
|
102 | - * |
|
103 | - * @return string |
|
104 | - */ |
|
105 | - function espresso_version(): string |
|
106 | - { |
|
107 | - return apply_filters('FHEE__espresso__espresso_version', '5.0.17.rc.000'); |
|
108 | - } |
|
99 | + /** |
|
100 | + * espresso_version |
|
101 | + * Returns the plugin version |
|
102 | + * |
|
103 | + * @return string |
|
104 | + */ |
|
105 | + function espresso_version(): string |
|
106 | + { |
|
107 | + return apply_filters('FHEE__espresso__espresso_version', '5.0.17.rc.000'); |
|
108 | + } |
|
109 | 109 | |
110 | - /** |
|
111 | - * espresso_plugin_activation |
|
112 | - * adds a wp-option to indicate that EE has been activated via the WP admin plugins page |
|
113 | - */ |
|
114 | - function espresso_plugin_activation() |
|
115 | - { |
|
116 | - update_option('ee_espresso_activation', true); |
|
117 | - update_option('event-espresso-core_allow_tracking', 'no'); |
|
118 | - update_option('event-espresso-core_tracking_notice', 'hide'); |
|
119 | - // Run WP GraphQL activation callback |
|
120 | - espressoLoadWpGraphQL(); |
|
121 | - graphql_activation_callback(); |
|
122 | - } |
|
110 | + /** |
|
111 | + * espresso_plugin_activation |
|
112 | + * adds a wp-option to indicate that EE has been activated via the WP admin plugins page |
|
113 | + */ |
|
114 | + function espresso_plugin_activation() |
|
115 | + { |
|
116 | + update_option('ee_espresso_activation', true); |
|
117 | + update_option('event-espresso-core_allow_tracking', 'no'); |
|
118 | + update_option('event-espresso-core_tracking_notice', 'hide'); |
|
119 | + // Run WP GraphQL activation callback |
|
120 | + espressoLoadWpGraphQL(); |
|
121 | + graphql_activation_callback(); |
|
122 | + } |
|
123 | 123 | |
124 | - register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation'); |
|
124 | + register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation'); |
|
125 | 125 | |
126 | - /** |
|
127 | - * espresso_plugin_deactivation |
|
128 | - */ |
|
129 | - function espresso_plugin_deactivation() |
|
130 | - { |
|
131 | - // Run WP GraphQL deactivation callback |
|
132 | - espressoLoadWpGraphQL(); |
|
133 | - graphql_deactivation_callback(); |
|
134 | - delete_option('event-espresso-core_allow_tracking'); |
|
135 | - delete_option('event-espresso-core_tracking_notice'); |
|
136 | - } |
|
137 | - register_deactivation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_deactivation'); |
|
126 | + /** |
|
127 | + * espresso_plugin_deactivation |
|
128 | + */ |
|
129 | + function espresso_plugin_deactivation() |
|
130 | + { |
|
131 | + // Run WP GraphQL deactivation callback |
|
132 | + espressoLoadWpGraphQL(); |
|
133 | + graphql_deactivation_callback(); |
|
134 | + delete_option('event-espresso-core_allow_tracking'); |
|
135 | + delete_option('event-espresso-core_tracking_notice'); |
|
136 | + } |
|
137 | + register_deactivation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_deactivation'); |
|
138 | 138 | |
139 | - require_once __DIR__ . '/core/bootstrap_espresso.php'; |
|
140 | - bootstrap_espresso(); |
|
141 | - } |
|
139 | + require_once __DIR__ . '/core/bootstrap_espresso.php'; |
|
140 | + bootstrap_espresso(); |
|
141 | + } |
|
142 | 142 | } |
143 | 143 | |
144 | 144 | if (! function_exists('espresso_deactivate_plugin')) { |
145 | - /** |
|
146 | - * deactivate_plugin |
|
147 | - * usage: espresso_deactivate_plugin( plugin_basename( __FILE__ )); |
|
148 | - * |
|
149 | - * @access public |
|
150 | - * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file |
|
151 | - * @return void |
|
152 | - */ |
|
153 | - function espresso_deactivate_plugin(string $plugin_basename = '') |
|
154 | - { |
|
155 | - if (! function_exists('deactivate_plugins')) { |
|
156 | - require_once ABSPATH . 'wp-admin/includes/plugin.php'; |
|
157 | - } |
|
158 | - unset($_GET['activate'], $_REQUEST['activate']); |
|
159 | - deactivate_plugins($plugin_basename); |
|
160 | - } |
|
145 | + /** |
|
146 | + * deactivate_plugin |
|
147 | + * usage: espresso_deactivate_plugin( plugin_basename( __FILE__ )); |
|
148 | + * |
|
149 | + * @access public |
|
150 | + * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file |
|
151 | + * @return void |
|
152 | + */ |
|
153 | + function espresso_deactivate_plugin(string $plugin_basename = '') |
|
154 | + { |
|
155 | + if (! function_exists('deactivate_plugins')) { |
|
156 | + require_once ABSPATH . 'wp-admin/includes/plugin.php'; |
|
157 | + } |
|
158 | + unset($_GET['activate'], $_REQUEST['activate']); |
|
159 | + deactivate_plugins($plugin_basename); |
|
160 | + } |
|
161 | 161 | } |
162 | 162 | |
163 | 163 | |
164 | 164 | if (! function_exists('espressoLoadWpGraphQL')) { |
165 | - function espressoLoadWpGraphQL() |
|
166 | - { |
|
167 | - if ( |
|
168 | - ! class_exists('WPGraphQL') |
|
169 | - && is_readable(__DIR__ . '/vendor/wp-graphql/wp-graphql/wp-graphql.php') |
|
170 | - ) { |
|
171 | - require_once __DIR__ . '/vendor/wp-graphql/wp-graphql/wp-graphql.php'; |
|
172 | - } |
|
173 | - } |
|
165 | + function espressoLoadWpGraphQL() |
|
166 | + { |
|
167 | + if ( |
|
168 | + ! class_exists('WPGraphQL') |
|
169 | + && is_readable(__DIR__ . '/vendor/wp-graphql/wp-graphql/wp-graphql.php') |
|
170 | + ) { |
|
171 | + require_once __DIR__ . '/vendor/wp-graphql/wp-graphql/wp-graphql.php'; |
|
172 | + } |
|
173 | + } |
|
174 | 174 | } |
@@ -15,169 +15,169 @@ |
||
15 | 15 | */ |
16 | 16 | class Domain |
17 | 17 | { |
18 | - /** |
|
19 | - * Name of the extra meta key that stores this PM options as one meta. |
|
20 | - */ |
|
21 | - public const META_KEY_PAYPAL_DATA = 'paypal_data'; |
|
22 | - /** |
|
23 | - * Name of the extra meta key that stores this PM options as one meta. |
|
24 | - */ |
|
25 | - public const META_KEY_PAYPAL_DATA_SANDBOX = 'paypal_data_sandbox'; |
|
26 | - |
|
27 | - /** |
|
28 | - * Name of the extra meta that stores whether the credentials were for the sandbox or live mode. |
|
29 | - */ |
|
30 | - public const META_KEY_SANDBOX_MODE = 'sandbox_mode'; |
|
31 | - |
|
32 | - /** |
|
33 | - * Name of the extra meta that stores the PayPal Access Token that is used get onboarding URL. |
|
34 | - */ |
|
35 | - public const META_KEY_ACCESS_TOKEN = 'access_token'; |
|
36 | - |
|
37 | - /** |
|
38 | - * Name of the extra meta that stores the last request tracking ID. |
|
39 | - */ |
|
40 | - public const META_KEY_TRACKING_ID = 'tracking_id'; |
|
41 | - |
|
42 | - /** |
|
43 | - * Name of the extra meta that stores the Event Espresso PayPal Account's merchant id. |
|
44 | - */ |
|
45 | - public const META_KEY_APP_ID = 'app_id'; |
|
46 | - |
|
47 | - /** |
|
48 | - * Name of the extra meta that holds the seller client ID. |
|
49 | - */ |
|
50 | - public const META_KEY_CLIENT_ID = 'client_id'; |
|
51 | - |
|
52 | - /** |
|
53 | - * Name of the extra meta that holds the seller secret. |
|
54 | - */ |
|
55 | - public const META_KEY_CLIENT_SECRET = 'client_secret'; |
|
56 | - |
|
57 | - /** |
|
58 | - * Name of the extra meta that stores the expiration date of the client ID. |
|
59 | - */ |
|
60 | - public const META_KEY_EXPIRES_IN = 'expires_in'; |
|
61 | - |
|
62 | - /** |
|
63 | - * Name of the extra meta that holds the partner client ID. |
|
64 | - */ |
|
65 | - public const META_KEY_PARTNER_CLIENT_ID = 'partner_client_id'; |
|
66 | - |
|
67 | - /** |
|
68 | - * Name of the extra meta that holds the partner merchant ID. |
|
69 | - */ |
|
70 | - public const META_KEY_PARTNER_MERCHANT_ID = 'partner_merchant_id'; |
|
71 | - |
|
72 | - /** |
|
73 | - * Name of the extra meta that holds the seller merchant ID. |
|
74 | - */ |
|
75 | - public const META_KEY_SELLER_MERCHANT_ID = 'merchantIdInPayPal'; |
|
76 | - |
|
77 | - /** |
|
78 | - * Name of the extra meta that holds the onboarding URL. |
|
79 | - */ |
|
80 | - public const META_KEY_ONBOARDING_URL = 'onboarding_url'; |
|
81 | - |
|
82 | - /** |
|
83 | - * Name of the extra meta that holds the BN / request tracking code. |
|
84 | - */ |
|
85 | - public const META_KEY_BN_CODE = 'bn_code'; |
|
86 | - |
|
87 | - /** |
|
88 | - * Name of the extra meta that holds the last order details. |
|
89 | - */ |
|
90 | - public const META_KEY_LAST_ORDER = 'last_order_details'; |
|
91 | - |
|
92 | - /** |
|
93 | - * Name of the extra meta that stores the allowed PP checkout type selected by merchant while onboarding. |
|
94 | - */ |
|
95 | - public const META_KEY_ALLOWED_CHECKOUT_TYPE = 'allowed_checkout_type'; |
|
96 | - |
|
97 | - /** |
|
98 | - * Name of the extra meta that stores the PP checkout type selected by merchant after onboarding. |
|
99 | - */ |
|
100 | - public const META_KEY_CHECKOUT_TYPE = 'checkout_type'; |
|
101 | - |
|
102 | - /** |
|
103 | - * Name of the PayPal API parameter that holds the auth code. |
|
104 | - */ |
|
105 | - public const API_KEY_AUTH_CODE = 'authCode'; |
|
106 | - |
|
107 | - /** |
|
108 | - * Name of the PayPal API parameter that holds the client token. |
|
109 | - */ |
|
110 | - public const API_KEY_CLIENT_TOKEN = 'client_token'; |
|
111 | - |
|
112 | - /** |
|
113 | - * Name of the extra meta that holds the seller payer ID. |
|
114 | - */ |
|
115 | - public const META_KEY_PAYER_ID = 'payer_id'; |
|
116 | - |
|
117 | - /** |
|
118 | - * Name of the PayPal API parameter that holds the client token expiration time. |
|
119 | - */ |
|
120 | - public const API_KEY_EXPIRES_IN = 'expires_in'; |
|
121 | - |
|
122 | - /** |
|
123 | - * Name of the PayPal API parameter that holds the list of oAuth integrations related to the merchant. |
|
124 | - */ |
|
125 | - public const API_PARAM_OAUTH_INTEGRATIONS = 'oauth_integrations'; |
|
126 | - |
|
127 | - /** |
|
128 | - * Name of the PayPal API parameter that holds the list of third party permissions that were granted. |
|
129 | - */ |
|
130 | - public const API_PARAM_PERMISSIONS_GRANTED = 'oauth_third_party'; |
|
131 | - |
|
132 | - /** |
|
133 | - * Name of the PayPal API parameter that holds the bool of if the primary email was confirmed. |
|
134 | - */ |
|
135 | - public const API_PARAM_PRIM_EMAIL_CONFIRMED = 'primary_email_confirmed'; |
|
136 | - |
|
137 | - /** |
|
138 | - * Name of the PayPal API parameter that holds the bool of if email was confirmed. |
|
139 | - */ |
|
140 | - public const API_PARAM_EMAIL_CONFIRMED = 'isEmailConfirmed'; |
|
141 | - |
|
142 | - /** |
|
143 | - * Name of the PayPal API parameter that holds the partner ID. |
|
144 | - */ |
|
145 | - public const API_PARAM_PARTNER_ID = 'merchantId'; |
|
146 | - |
|
147 | - /** |
|
148 | - * Name of the PayPal API parameter that holds the merchant ID in the Track seller onboarding status request. |
|
149 | - */ |
|
150 | - public const API_PARAM_TRACK_MERCHANT_ID = 'merchant_id'; |
|
151 | - |
|
152 | - /** |
|
153 | - * Name of the PayPal API parameter that holds the payments_receivable status. |
|
154 | - */ |
|
155 | - public const API_PARAM_PAYMENTS_RECEIVABLE = 'payments_receivable'; |
|
156 | - |
|
157 | - /** |
|
158 | - * Name of the nonce used in the capture order request. |
|
159 | - */ |
|
160 | - public const CAPTURE_ORDER_NONCE_NAME = 'eea_pp_commerce_capture_order_payment'; |
|
161 | - |
|
162 | - /** |
|
163 | - * Name of the nonce used in the onboarding process. |
|
164 | - */ |
|
165 | - public const NONCE_NAME_ONBOARDING_RETURN = 'eea_pp_commerce_onboarding_return'; |
|
166 | - |
|
167 | - /** |
|
168 | - * Holds this payment method slug. |
|
169 | - */ |
|
170 | - public const PM_SLUG = 'paypalcheckout'; |
|
171 | - |
|
172 | - |
|
173 | - /** |
|
174 | - * Returns the base PayPal API URL. |
|
175 | - * |
|
176 | - * @param EE_Payment_Method $payment_method |
|
177 | - * @return string |
|
178 | - */ |
|
179 | - public static function getPayPalApiUrl(EE_Payment_Method $payment_method): string |
|
180 | - { |
|
181 | - return $payment_method->debug_mode() ? 'https://api-m.sandbox.paypal.com' : 'https://api-m.paypal.com'; |
|
182 | - } |
|
18 | + /** |
|
19 | + * Name of the extra meta key that stores this PM options as one meta. |
|
20 | + */ |
|
21 | + public const META_KEY_PAYPAL_DATA = 'paypal_data'; |
|
22 | + /** |
|
23 | + * Name of the extra meta key that stores this PM options as one meta. |
|
24 | + */ |
|
25 | + public const META_KEY_PAYPAL_DATA_SANDBOX = 'paypal_data_sandbox'; |
|
26 | + |
|
27 | + /** |
|
28 | + * Name of the extra meta that stores whether the credentials were for the sandbox or live mode. |
|
29 | + */ |
|
30 | + public const META_KEY_SANDBOX_MODE = 'sandbox_mode'; |
|
31 | + |
|
32 | + /** |
|
33 | + * Name of the extra meta that stores the PayPal Access Token that is used get onboarding URL. |
|
34 | + */ |
|
35 | + public const META_KEY_ACCESS_TOKEN = 'access_token'; |
|
36 | + |
|
37 | + /** |
|
38 | + * Name of the extra meta that stores the last request tracking ID. |
|
39 | + */ |
|
40 | + public const META_KEY_TRACKING_ID = 'tracking_id'; |
|
41 | + |
|
42 | + /** |
|
43 | + * Name of the extra meta that stores the Event Espresso PayPal Account's merchant id. |
|
44 | + */ |
|
45 | + public const META_KEY_APP_ID = 'app_id'; |
|
46 | + |
|
47 | + /** |
|
48 | + * Name of the extra meta that holds the seller client ID. |
|
49 | + */ |
|
50 | + public const META_KEY_CLIENT_ID = 'client_id'; |
|
51 | + |
|
52 | + /** |
|
53 | + * Name of the extra meta that holds the seller secret. |
|
54 | + */ |
|
55 | + public const META_KEY_CLIENT_SECRET = 'client_secret'; |
|
56 | + |
|
57 | + /** |
|
58 | + * Name of the extra meta that stores the expiration date of the client ID. |
|
59 | + */ |
|
60 | + public const META_KEY_EXPIRES_IN = 'expires_in'; |
|
61 | + |
|
62 | + /** |
|
63 | + * Name of the extra meta that holds the partner client ID. |
|
64 | + */ |
|
65 | + public const META_KEY_PARTNER_CLIENT_ID = 'partner_client_id'; |
|
66 | + |
|
67 | + /** |
|
68 | + * Name of the extra meta that holds the partner merchant ID. |
|
69 | + */ |
|
70 | + public const META_KEY_PARTNER_MERCHANT_ID = 'partner_merchant_id'; |
|
71 | + |
|
72 | + /** |
|
73 | + * Name of the extra meta that holds the seller merchant ID. |
|
74 | + */ |
|
75 | + public const META_KEY_SELLER_MERCHANT_ID = 'merchantIdInPayPal'; |
|
76 | + |
|
77 | + /** |
|
78 | + * Name of the extra meta that holds the onboarding URL. |
|
79 | + */ |
|
80 | + public const META_KEY_ONBOARDING_URL = 'onboarding_url'; |
|
81 | + |
|
82 | + /** |
|
83 | + * Name of the extra meta that holds the BN / request tracking code. |
|
84 | + */ |
|
85 | + public const META_KEY_BN_CODE = 'bn_code'; |
|
86 | + |
|
87 | + /** |
|
88 | + * Name of the extra meta that holds the last order details. |
|
89 | + */ |
|
90 | + public const META_KEY_LAST_ORDER = 'last_order_details'; |
|
91 | + |
|
92 | + /** |
|
93 | + * Name of the extra meta that stores the allowed PP checkout type selected by merchant while onboarding. |
|
94 | + */ |
|
95 | + public const META_KEY_ALLOWED_CHECKOUT_TYPE = 'allowed_checkout_type'; |
|
96 | + |
|
97 | + /** |
|
98 | + * Name of the extra meta that stores the PP checkout type selected by merchant after onboarding. |
|
99 | + */ |
|
100 | + public const META_KEY_CHECKOUT_TYPE = 'checkout_type'; |
|
101 | + |
|
102 | + /** |
|
103 | + * Name of the PayPal API parameter that holds the auth code. |
|
104 | + */ |
|
105 | + public const API_KEY_AUTH_CODE = 'authCode'; |
|
106 | + |
|
107 | + /** |
|
108 | + * Name of the PayPal API parameter that holds the client token. |
|
109 | + */ |
|
110 | + public const API_KEY_CLIENT_TOKEN = 'client_token'; |
|
111 | + |
|
112 | + /** |
|
113 | + * Name of the extra meta that holds the seller payer ID. |
|
114 | + */ |
|
115 | + public const META_KEY_PAYER_ID = 'payer_id'; |
|
116 | + |
|
117 | + /** |
|
118 | + * Name of the PayPal API parameter that holds the client token expiration time. |
|
119 | + */ |
|
120 | + public const API_KEY_EXPIRES_IN = 'expires_in'; |
|
121 | + |
|
122 | + /** |
|
123 | + * Name of the PayPal API parameter that holds the list of oAuth integrations related to the merchant. |
|
124 | + */ |
|
125 | + public const API_PARAM_OAUTH_INTEGRATIONS = 'oauth_integrations'; |
|
126 | + |
|
127 | + /** |
|
128 | + * Name of the PayPal API parameter that holds the list of third party permissions that were granted. |
|
129 | + */ |
|
130 | + public const API_PARAM_PERMISSIONS_GRANTED = 'oauth_third_party'; |
|
131 | + |
|
132 | + /** |
|
133 | + * Name of the PayPal API parameter that holds the bool of if the primary email was confirmed. |
|
134 | + */ |
|
135 | + public const API_PARAM_PRIM_EMAIL_CONFIRMED = 'primary_email_confirmed'; |
|
136 | + |
|
137 | + /** |
|
138 | + * Name of the PayPal API parameter that holds the bool of if email was confirmed. |
|
139 | + */ |
|
140 | + public const API_PARAM_EMAIL_CONFIRMED = 'isEmailConfirmed'; |
|
141 | + |
|
142 | + /** |
|
143 | + * Name of the PayPal API parameter that holds the partner ID. |
|
144 | + */ |
|
145 | + public const API_PARAM_PARTNER_ID = 'merchantId'; |
|
146 | + |
|
147 | + /** |
|
148 | + * Name of the PayPal API parameter that holds the merchant ID in the Track seller onboarding status request. |
|
149 | + */ |
|
150 | + public const API_PARAM_TRACK_MERCHANT_ID = 'merchant_id'; |
|
151 | + |
|
152 | + /** |
|
153 | + * Name of the PayPal API parameter that holds the payments_receivable status. |
|
154 | + */ |
|
155 | + public const API_PARAM_PAYMENTS_RECEIVABLE = 'payments_receivable'; |
|
156 | + |
|
157 | + /** |
|
158 | + * Name of the nonce used in the capture order request. |
|
159 | + */ |
|
160 | + public const CAPTURE_ORDER_NONCE_NAME = 'eea_pp_commerce_capture_order_payment'; |
|
161 | + |
|
162 | + /** |
|
163 | + * Name of the nonce used in the onboarding process. |
|
164 | + */ |
|
165 | + public const NONCE_NAME_ONBOARDING_RETURN = 'eea_pp_commerce_onboarding_return'; |
|
166 | + |
|
167 | + /** |
|
168 | + * Holds this payment method slug. |
|
169 | + */ |
|
170 | + public const PM_SLUG = 'paypalcheckout'; |
|
171 | + |
|
172 | + |
|
173 | + /** |
|
174 | + * Returns the base PayPal API URL. |
|
175 | + * |
|
176 | + * @param EE_Payment_Method $payment_method |
|
177 | + * @return string |
|
178 | + */ |
|
179 | + public static function getPayPalApiUrl(EE_Payment_Method $payment_method): string |
|
180 | + { |
|
181 | + return $payment_method->debug_mode() ? 'https://api-m.sandbox.paypal.com' : 'https://api-m.paypal.com'; |
|
182 | + } |
|
183 | 183 | } |
@@ -17,115 +17,115 @@ |
||
17 | 17 | */ |
18 | 18 | class TrackSellerOnboarding extends PartnersApi |
19 | 19 | { |
20 | - /** |
|
21 | - * Partner ID. |
|
22 | - * |
|
23 | - * @var string |
|
24 | - */ |
|
25 | - protected string $partner_id; |
|
20 | + /** |
|
21 | + * Partner ID. |
|
22 | + * |
|
23 | + * @var string |
|
24 | + */ |
|
25 | + protected string $partner_id; |
|
26 | 26 | |
27 | - /** |
|
28 | - * Seller ID. |
|
29 | - * |
|
30 | - * @var string |
|
31 | - */ |
|
32 | - protected string $seller_id; |
|
27 | + /** |
|
28 | + * Seller ID. |
|
29 | + * |
|
30 | + * @var string |
|
31 | + */ |
|
32 | + protected string $seller_id; |
|
33 | 33 | |
34 | 34 | |
35 | - /** |
|
36 | - * TrackSellerOnboarding constructor. |
|
37 | - * |
|
38 | - * @param PayPalApi $api |
|
39 | - * @param string $partner_id |
|
40 | - * @param string $seller_id |
|
41 | - * @param bool $sandbox_mode |
|
42 | - */ |
|
43 | - public function __construct( |
|
44 | - PayPalApi $api, |
|
45 | - string $partner_id, |
|
46 | - string $seller_id, |
|
47 | - bool $sandbox_mode |
|
48 | - ) { |
|
49 | - parent::__construct($api, $sandbox_mode); |
|
50 | - $this->partner_id = $partner_id; |
|
51 | - $this->seller_id = $seller_id; |
|
52 | - $this->request_url = $this->request_url . "/{$partner_id}/merchant-integrations/{$seller_id}"; |
|
53 | - } |
|
35 | + /** |
|
36 | + * TrackSellerOnboarding constructor. |
|
37 | + * |
|
38 | + * @param PayPalApi $api |
|
39 | + * @param string $partner_id |
|
40 | + * @param string $seller_id |
|
41 | + * @param bool $sandbox_mode |
|
42 | + */ |
|
43 | + public function __construct( |
|
44 | + PayPalApi $api, |
|
45 | + string $partner_id, |
|
46 | + string $seller_id, |
|
47 | + bool $sandbox_mode |
|
48 | + ) { |
|
49 | + parent::__construct($api, $sandbox_mode); |
|
50 | + $this->partner_id = $partner_id; |
|
51 | + $this->seller_id = $seller_id; |
|
52 | + $this->request_url = $this->request_url . "/{$partner_id}/merchant-integrations/{$seller_id}"; |
|
53 | + } |
|
54 | 54 | |
55 | 55 | |
56 | - /** |
|
57 | - * Get the onboarding status and validate it. |
|
58 | - * |
|
59 | - * @return array |
|
60 | - */ |
|
61 | - public function isValid(): array |
|
62 | - { |
|
63 | - // Send GET request. |
|
64 | - $response = $this->api->sendRequest([], $this->request_url, 'GET'); |
|
65 | - return $this->validateStatus($response); |
|
66 | - } |
|
56 | + /** |
|
57 | + * Get the onboarding status and validate it. |
|
58 | + * |
|
59 | + * @return array |
|
60 | + */ |
|
61 | + public function isValid(): array |
|
62 | + { |
|
63 | + // Send GET request. |
|
64 | + $response = $this->api->sendRequest([], $this->request_url, 'GET'); |
|
65 | + return $this->validateStatus($response); |
|
66 | + } |
|
67 | 67 | |
68 | 68 | |
69 | - /** |
|
70 | - * Makes sure that we have received proper parameters and the status is valid. |
|
71 | - * |
|
72 | - * @param array $response |
|
73 | - * @return array |
|
74 | - */ |
|
75 | - public function validateStatus(array $response): array |
|
76 | - { |
|
77 | - if (! empty($response['error'])) { |
|
78 | - return $response; |
|
79 | - } |
|
80 | - if (! empty($response['name']) && ! empty($response['message'])) { |
|
81 | - return ['error' => $response['name'], 'message' => $response['message']]; |
|
82 | - } |
|
83 | - // Check the data we received. |
|
84 | - if ( |
|
85 | - empty($response[ Domain::API_PARAM_TRACK_MERCHANT_ID ]) |
|
86 | - || ! isset($response[ Domain::API_PARAM_PAYMENTS_RECEIVABLE ]) |
|
87 | - || ! isset($response[ Domain::API_PARAM_PRIM_EMAIL_CONFIRMED ]) |
|
88 | - || ! isset($response[ Domain::API_PARAM_OAUTH_INTEGRATIONS ]) |
|
89 | - ) { |
|
90 | - $err_msg = esc_html__('Missing required data for validating the onboarding status.', 'event_espresso'); |
|
91 | - PayPalLogger::errorLog($err_msg, $response); |
|
92 | - return ['error' => 'ONBOARDING_MISSING_REQUIRED_DATA', 'message' => $err_msg]; |
|
93 | - } |
|
94 | - // Now validate the onboarding status. |
|
95 | - if (! $response[ Domain::API_PARAM_PAYMENTS_RECEIVABLE ]) { |
|
96 | - $err_msg = esc_html__( |
|
97 | - 'Your Account has been limited by PayPal. Please check your PayPal account inbox for an email from PayPal to determine the next steps for this.', |
|
98 | - 'event_espresso' |
|
99 | - ); |
|
100 | - PayPalLogger::errorLog($err_msg, $response); |
|
101 | - return ['error' => 'ONBOARDING_LIMITED_BY_PAYPAL', 'message' => $err_msg]; |
|
102 | - } |
|
103 | - if (! $response[ Domain::API_PARAM_PRIM_EMAIL_CONFIRMED ]) { |
|
104 | - $err_msg = esc_html__('Email address not confirmed. Please confirm your email address.', 'event_espresso'); |
|
105 | - PayPalLogger::errorLog($err_msg, $response); |
|
106 | - return ['error' => 'ONBOARDING_CONFIRM_EMAIL', 'message' => $err_msg]; |
|
107 | - } |
|
108 | - if (empty($response[ Domain::API_PARAM_OAUTH_INTEGRATIONS ])) { |
|
109 | - $permissions_valid = false; |
|
110 | - // Look for the granted permissions. |
|
111 | - foreach ($response[ Domain::API_PARAM_OAUTH_INTEGRATIONS ] as $integration_type) { |
|
112 | - if (! empty($integration_type[ Domain::API_PARAM_PERMISSIONS_GRANTED ])) { |
|
113 | - $permissions_valid = true; |
|
114 | - } |
|
115 | - } |
|
116 | - // Did we find any ? If no - oauth not valid. |
|
117 | - if (! $permissions_valid) { |
|
118 | - $err_msg = esc_html__( |
|
119 | - 'Not all required permissions were granted. Please allow all permissions while onboarding.', |
|
120 | - 'event_espresso' |
|
121 | - ); |
|
122 | - PayPalLogger::errorLog($err_msg, $response); |
|
123 | - return ['error' => 'ONBOARDING_PERMISSIONS_NOT_GRANTED', 'message' => $err_msg]; |
|
124 | - } |
|
125 | - } |
|
126 | - return [ |
|
127 | - 'valid' => true, |
|
128 | - 'response' => $response, |
|
129 | - ]; |
|
130 | - } |
|
69 | + /** |
|
70 | + * Makes sure that we have received proper parameters and the status is valid. |
|
71 | + * |
|
72 | + * @param array $response |
|
73 | + * @return array |
|
74 | + */ |
|
75 | + public function validateStatus(array $response): array |
|
76 | + { |
|
77 | + if (! empty($response['error'])) { |
|
78 | + return $response; |
|
79 | + } |
|
80 | + if (! empty($response['name']) && ! empty($response['message'])) { |
|
81 | + return ['error' => $response['name'], 'message' => $response['message']]; |
|
82 | + } |
|
83 | + // Check the data we received. |
|
84 | + if ( |
|
85 | + empty($response[ Domain::API_PARAM_TRACK_MERCHANT_ID ]) |
|
86 | + || ! isset($response[ Domain::API_PARAM_PAYMENTS_RECEIVABLE ]) |
|
87 | + || ! isset($response[ Domain::API_PARAM_PRIM_EMAIL_CONFIRMED ]) |
|
88 | + || ! isset($response[ Domain::API_PARAM_OAUTH_INTEGRATIONS ]) |
|
89 | + ) { |
|
90 | + $err_msg = esc_html__('Missing required data for validating the onboarding status.', 'event_espresso'); |
|
91 | + PayPalLogger::errorLog($err_msg, $response); |
|
92 | + return ['error' => 'ONBOARDING_MISSING_REQUIRED_DATA', 'message' => $err_msg]; |
|
93 | + } |
|
94 | + // Now validate the onboarding status. |
|
95 | + if (! $response[ Domain::API_PARAM_PAYMENTS_RECEIVABLE ]) { |
|
96 | + $err_msg = esc_html__( |
|
97 | + 'Your Account has been limited by PayPal. Please check your PayPal account inbox for an email from PayPal to determine the next steps for this.', |
|
98 | + 'event_espresso' |
|
99 | + ); |
|
100 | + PayPalLogger::errorLog($err_msg, $response); |
|
101 | + return ['error' => 'ONBOARDING_LIMITED_BY_PAYPAL', 'message' => $err_msg]; |
|
102 | + } |
|
103 | + if (! $response[ Domain::API_PARAM_PRIM_EMAIL_CONFIRMED ]) { |
|
104 | + $err_msg = esc_html__('Email address not confirmed. Please confirm your email address.', 'event_espresso'); |
|
105 | + PayPalLogger::errorLog($err_msg, $response); |
|
106 | + return ['error' => 'ONBOARDING_CONFIRM_EMAIL', 'message' => $err_msg]; |
|
107 | + } |
|
108 | + if (empty($response[ Domain::API_PARAM_OAUTH_INTEGRATIONS ])) { |
|
109 | + $permissions_valid = false; |
|
110 | + // Look for the granted permissions. |
|
111 | + foreach ($response[ Domain::API_PARAM_OAUTH_INTEGRATIONS ] as $integration_type) { |
|
112 | + if (! empty($integration_type[ Domain::API_PARAM_PERMISSIONS_GRANTED ])) { |
|
113 | + $permissions_valid = true; |
|
114 | + } |
|
115 | + } |
|
116 | + // Did we find any ? If no - oauth not valid. |
|
117 | + if (! $permissions_valid) { |
|
118 | + $err_msg = esc_html__( |
|
119 | + 'Not all required permissions were granted. Please allow all permissions while onboarding.', |
|
120 | + 'event_espresso' |
|
121 | + ); |
|
122 | + PayPalLogger::errorLog($err_msg, $response); |
|
123 | + return ['error' => 'ONBOARDING_PERMISSIONS_NOT_GRANTED', 'message' => $err_msg]; |
|
124 | + } |
|
125 | + } |
|
126 | + return [ |
|
127 | + 'valid' => true, |
|
128 | + 'response' => $response, |
|
129 | + ]; |
|
130 | + } |
|
131 | 131 | } |
@@ -49,7 +49,7 @@ discard block |
||
49 | 49 | parent::__construct($api, $sandbox_mode); |
50 | 50 | $this->partner_id = $partner_id; |
51 | 51 | $this->seller_id = $seller_id; |
52 | - $this->request_url = $this->request_url . "/{$partner_id}/merchant-integrations/{$seller_id}"; |
|
52 | + $this->request_url = $this->request_url."/{$partner_id}/merchant-integrations/{$seller_id}"; |
|
53 | 53 | } |
54 | 54 | |
55 | 55 | |
@@ -74,25 +74,25 @@ discard block |
||
74 | 74 | */ |
75 | 75 | public function validateStatus(array $response): array |
76 | 76 | { |
77 | - if (! empty($response['error'])) { |
|
77 | + if ( ! empty($response['error'])) { |
|
78 | 78 | return $response; |
79 | 79 | } |
80 | - if (! empty($response['name']) && ! empty($response['message'])) { |
|
80 | + if ( ! empty($response['name']) && ! empty($response['message'])) { |
|
81 | 81 | return ['error' => $response['name'], 'message' => $response['message']]; |
82 | 82 | } |
83 | 83 | // Check the data we received. |
84 | 84 | if ( |
85 | - empty($response[ Domain::API_PARAM_TRACK_MERCHANT_ID ]) |
|
86 | - || ! isset($response[ Domain::API_PARAM_PAYMENTS_RECEIVABLE ]) |
|
87 | - || ! isset($response[ Domain::API_PARAM_PRIM_EMAIL_CONFIRMED ]) |
|
88 | - || ! isset($response[ Domain::API_PARAM_OAUTH_INTEGRATIONS ]) |
|
85 | + empty($response[Domain::API_PARAM_TRACK_MERCHANT_ID]) |
|
86 | + || ! isset($response[Domain::API_PARAM_PAYMENTS_RECEIVABLE]) |
|
87 | + || ! isset($response[Domain::API_PARAM_PRIM_EMAIL_CONFIRMED]) |
|
88 | + || ! isset($response[Domain::API_PARAM_OAUTH_INTEGRATIONS]) |
|
89 | 89 | ) { |
90 | 90 | $err_msg = esc_html__('Missing required data for validating the onboarding status.', 'event_espresso'); |
91 | 91 | PayPalLogger::errorLog($err_msg, $response); |
92 | 92 | return ['error' => 'ONBOARDING_MISSING_REQUIRED_DATA', 'message' => $err_msg]; |
93 | 93 | } |
94 | 94 | // Now validate the onboarding status. |
95 | - if (! $response[ Domain::API_PARAM_PAYMENTS_RECEIVABLE ]) { |
|
95 | + if ( ! $response[Domain::API_PARAM_PAYMENTS_RECEIVABLE]) { |
|
96 | 96 | $err_msg = esc_html__( |
97 | 97 | 'Your Account has been limited by PayPal. Please check your PayPal account inbox for an email from PayPal to determine the next steps for this.', |
98 | 98 | 'event_espresso' |
@@ -100,21 +100,21 @@ discard block |
||
100 | 100 | PayPalLogger::errorLog($err_msg, $response); |
101 | 101 | return ['error' => 'ONBOARDING_LIMITED_BY_PAYPAL', 'message' => $err_msg]; |
102 | 102 | } |
103 | - if (! $response[ Domain::API_PARAM_PRIM_EMAIL_CONFIRMED ]) { |
|
103 | + if ( ! $response[Domain::API_PARAM_PRIM_EMAIL_CONFIRMED]) { |
|
104 | 104 | $err_msg = esc_html__('Email address not confirmed. Please confirm your email address.', 'event_espresso'); |
105 | 105 | PayPalLogger::errorLog($err_msg, $response); |
106 | 106 | return ['error' => 'ONBOARDING_CONFIRM_EMAIL', 'message' => $err_msg]; |
107 | 107 | } |
108 | - if (empty($response[ Domain::API_PARAM_OAUTH_INTEGRATIONS ])) { |
|
108 | + if (empty($response[Domain::API_PARAM_OAUTH_INTEGRATIONS])) { |
|
109 | 109 | $permissions_valid = false; |
110 | 110 | // Look for the granted permissions. |
111 | - foreach ($response[ Domain::API_PARAM_OAUTH_INTEGRATIONS ] as $integration_type) { |
|
112 | - if (! empty($integration_type[ Domain::API_PARAM_PERMISSIONS_GRANTED ])) { |
|
111 | + foreach ($response[Domain::API_PARAM_OAUTH_INTEGRATIONS] as $integration_type) { |
|
112 | + if ( ! empty($integration_type[Domain::API_PARAM_PERMISSIONS_GRANTED])) { |
|
113 | 113 | $permissions_valid = true; |
114 | 114 | } |
115 | 115 | } |
116 | 116 | // Did we find any ? If no - oauth not valid. |
117 | - if (! $permissions_valid) { |
|
117 | + if ( ! $permissions_valid) { |
|
118 | 118 | $err_msg = esc_html__( |
119 | 119 | 'Not all required permissions were granted. Please allow all permissions while onboarding.', |
120 | 120 | 'event_espresso' |
@@ -20,662 +20,662 @@ |
||
20 | 20 | */ |
21 | 21 | class EED_PayPalOnboard extends EED_Module |
22 | 22 | { |
23 | - /** |
|
24 | - * @return EED_Module |
|
25 | - * @throws EE_Error |
|
26 | - * @throws ReflectionException |
|
27 | - */ |
|
28 | - public static function instance(): EED_Module |
|
29 | - { |
|
30 | - return parent::get_instance(__CLASS__); |
|
31 | - } |
|
32 | - |
|
33 | - |
|
34 | - /** |
|
35 | - * Run - initial module setup. |
|
36 | - * |
|
37 | - * @param WP $WP |
|
38 | - * @return void |
|
39 | - */ |
|
40 | - public function run($WP) |
|
41 | - { |
|
42 | - } |
|
43 | - |
|
44 | - |
|
45 | - /** |
|
46 | - * For hooking into EE Admin Core and other modules. |
|
47 | - * |
|
48 | - * @return void |
|
49 | - */ |
|
50 | - public static function set_hooks_admin(): void |
|
51 | - { |
|
52 | - if (DbStatus::isOnline()) { |
|
53 | - // Get onboarding URL. |
|
54 | - add_action('wp_ajax_eeaPpGetOnboardingUrl', [__CLASS__, 'getOnboardingUrl']); |
|
55 | - // Catch the return/redirect from PayPal onboarding page. |
|
56 | - add_action('init', [__CLASS__, 'updateOnboardingStatus'], 10); |
|
57 | - // Return the connection/onboard status. |
|
58 | - add_action('wp_ajax_eeaPpGetOnboardStatus', [__CLASS__, 'getOnboardStatus']); |
|
59 | - // Revoke access. |
|
60 | - add_action('wp_ajax_eeaPpOffboard', [__CLASS__, 'offboard']); |
|
61 | - // Admin notice. |
|
62 | - add_action('admin_init', [__CLASS__, 'adminNotice']); |
|
63 | - } |
|
64 | - } |
|
65 | - |
|
66 | - |
|
67 | - /** |
|
68 | - * Get the onboarding URL. |
|
69 | - * (AJAX) |
|
70 | - * |
|
71 | - * @return void |
|
72 | - */ |
|
73 | - public static function getOnboardingUrl(): void |
|
74 | - { |
|
75 | - $signup_link = ''; |
|
76 | - try { |
|
77 | - $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
|
78 | - if (! $paypal_pm instanceof EE_Payment_Method) { |
|
79 | - PayPalLogger::errorLogAndExit( |
|
80 | - esc_html__('No payment method.', 'event_espresso'), |
|
81 | - EED_Module::getRequest()->postParams(), |
|
82 | - $paypal_pm |
|
83 | - ); |
|
84 | - } |
|
85 | - PayPalExtraMetaManager::updateDebugMode($paypal_pm, EED_Module::getRequest()->postParams()); |
|
86 | - // $signup_link = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_ONBOARDING_URL); |
|
87 | - // $token_expired = EED_PayPalOnboard::partnerAccessTokenExpired($paypal_pm); |
|
88 | - // if (! $signup_link || $token_expired) { |
|
89 | - $signup_link = EED_PayPalOnboard::requestOnboardingUrl($paypal_pm); |
|
90 | - // } |
|
91 | - if (! $signup_link) { |
|
92 | - $err_msg = esc_html__('Error! Could not generate a sign-up link.', 'event_espresso'); |
|
93 | - PayPalLogger::errorLogAndExit($err_msg, ['signup_link' => $signup_link], $paypal_pm); |
|
94 | - } |
|
95 | - PayPalExtraMetaManager::savePmOption($paypal_pm, Domain::META_KEY_ONBOARDING_URL, $signup_link); |
|
96 | - } catch (Exception $exception) { |
|
97 | - PayPalLogger::errorLogAndExit($exception->getMessage()); |
|
98 | - } |
|
99 | - // Is it empty (can happen if we didn't get the URL through the API). |
|
100 | - $signup_link = $signup_link ? $signup_link . '?&displayMode=minibrowser' : '#'; |
|
101 | - wp_send_json( |
|
102 | - [ |
|
103 | - 'signup_link' => $signup_link, |
|
104 | - ] |
|
105 | - ); |
|
106 | - } |
|
107 | - |
|
108 | - |
|
109 | - /** |
|
110 | - * Request the sign-up link from PayPal. |
|
111 | - * |
|
112 | - * @param EE_Payment_Method $paypal_pm |
|
113 | - * @param bool $one_time_request |
|
114 | - * @return string |
|
115 | - * @throws EE_Error |
|
116 | - * @throws Exception |
|
117 | - */ |
|
118 | - public static function requestOnboardingUrl(EE_Payment_Method $paypal_pm, bool $one_time_request = false): string |
|
119 | - { |
|
120 | - $signup_link = ''; |
|
121 | - // Get the access token. |
|
122 | - $access_token = EED_PayPalOnboard::getPartnerAccessToken($paypal_pm); |
|
123 | - if (! $access_token) { |
|
124 | - $err_msg = esc_html__('Error! No access token.', 'event_espresso'); |
|
125 | - PayPalLogger::errorLog($err_msg, ['access_token' => $access_token], $paypal_pm); |
|
126 | - return ''; |
|
127 | - } |
|
128 | - // Request the access token. |
|
129 | - $body_params = EED_PayPalOnboard::signupLinkRequestBody($paypal_pm); |
|
130 | - $bn_code = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_BN_CODE); |
|
131 | - $post_params = [ |
|
132 | - 'method' => 'POST', |
|
133 | - 'headers' => [ |
|
134 | - 'User-Agent' => sanitize_text_field($_SERVER['HTTP_USER_AGENT']), |
|
135 | - 'Content-Type' => 'application/json', |
|
136 | - 'Authorization' => 'Bearer ' . $access_token, |
|
137 | - 'PayPal-Partner-Attribution-Id' => $bn_code, |
|
138 | - ], |
|
139 | - 'body' => $body_params, |
|
140 | - ]; |
|
141 | - $request_url = Domain::getPayPalApiUrl($paypal_pm) . '/v2/customer/partner-referrals'; |
|
142 | - $response = EED_PayPalOnboard::sendRequest($paypal_pm, $request_url, $post_params); |
|
143 | - // Check the data we received. |
|
144 | - if (isset($response['error']) || empty($response['links'])) { |
|
145 | - // Did the original access token get replaced by any chance ? |
|
146 | - if (! $one_time_request |
|
147 | - && ! empty($response['message']) |
|
148 | - && $response['message'] === 'Access Token not found in cache' |
|
149 | - ) { |
|
150 | - // Clear all PM metadata and try getting the access token One more time. |
|
151 | - PayPalExtraMetaManager::deleteAllData($paypal_pm); |
|
152 | - return EED_PayPalOnboard::requestOnboardingUrl($paypal_pm, true); |
|
153 | - } |
|
154 | - $err_msg = esc_html__('Incoming sign-up link parameter validation failed.', 'event_espresso'); |
|
155 | - PayPalLogger::errorLog($err_msg, $response, $paypal_pm); |
|
156 | - return ''; |
|
157 | - } |
|
158 | - // Now retrieve that sign-up link. |
|
159 | - foreach ($response['links'] as $link) { |
|
160 | - if ($link['rel'] === 'action_url') { |
|
161 | - $signup_link = $link['href'] ?? ''; |
|
162 | - } |
|
163 | - } |
|
164 | - return $signup_link; |
|
165 | - } |
|
166 | - |
|
167 | - |
|
168 | - /** |
|
169 | - * Get the return URL. |
|
170 | - * |
|
171 | - * @param EE_Payment_Method $paypal_pm |
|
172 | - * @return string |
|
173 | - * @throws Exception |
|
174 | - */ |
|
175 | - public static function signupLinkRequestBody(EE_Payment_Method $paypal_pm): string |
|
176 | - { |
|
177 | - $identifier_string = new OneTimeString($paypal_pm->debug_mode()); |
|
178 | - $tracking_id = $identifier_string->value(); |
|
179 | - $request = LoaderFactory::getLoader()->getShared(RequestInterface::class); |
|
180 | - $checkout_type = $request->getRequestParam('checkout_type', 'EXPRESS_CHECKOUT', DataType::STRING); |
|
181 | - // Save the identifier for future use. |
|
182 | - PayPalExtraMetaManager::savePmOption($paypal_pm, Domain::META_KEY_TRACKING_ID, $tracking_id); |
|
183 | - // Assemble the return URL. |
|
184 | - $return_url = EED_PayPalOnboard::getReturnUrl($paypal_pm); |
|
185 | - return json_encode([ |
|
186 | - 'tracking_id' => $tracking_id, |
|
187 | - 'operations' => [ |
|
188 | - [ |
|
189 | - 'operation' => 'API_INTEGRATION', |
|
190 | - 'api_integration_preference' => [ |
|
191 | - 'rest_api_integration' => [ |
|
192 | - 'integration_method' => 'PAYPAL', |
|
193 | - 'integration_type' => 'THIRD_PARTY', |
|
194 | - 'third_party_details' => [ |
|
195 | - 'features' => ['PAYMENT', 'REFUND'], |
|
196 | - ], |
|
197 | - ], |
|
198 | - ], |
|
199 | - ], |
|
200 | - ], |
|
201 | - 'products' => [$checkout_type], |
|
202 | - 'legal_consents' => [ |
|
203 | - [ |
|
204 | - 'type' => 'SHARE_DATA_CONSENT', |
|
205 | - 'granted' => true, |
|
206 | - ], |
|
207 | - ], |
|
208 | - 'partner_config_override' => [ |
|
209 | - 'return_url' => $return_url, |
|
210 | - ], |
|
211 | - ]); |
|
212 | - } |
|
213 | - |
|
214 | - |
|
215 | - /** |
|
216 | - * Get the return URL. |
|
217 | - * |
|
218 | - * @param EE_Payment_Method $paypal_pm |
|
219 | - * @return string |
|
220 | - * @throws EE_Error |
|
221 | - * @throws ReflectionException |
|
222 | - */ |
|
223 | - public static function getReturnUrl(EE_Payment_Method $paypal_pm): string |
|
224 | - { |
|
225 | - $wp_nonce = EED_Module::getRequest()->getRequestParam('wp_nonce'); |
|
226 | - $nonce = wp_create_nonce(Domain::NONCE_NAME_ONBOARDING_RETURN); |
|
227 | - return add_query_arg( |
|
228 | - [ |
|
229 | - 'page' => 'espresso_payment_settings', |
|
230 | - 'webhook_action' => 'eepPpcMerchantOnboard', |
|
231 | - 'payment_method' => $paypal_pm->slug(), |
|
232 | - '_wpnonce' => $wp_nonce, |
|
233 | - 'nonce' => $nonce, |
|
234 | - Domain::META_KEY_SANDBOX_MODE => $paypal_pm->debug_mode() ? '1' : '0', |
|
235 | - ], |
|
236 | - admin_url('admin.php') |
|
237 | - ); |
|
238 | - } |
|
239 | - |
|
240 | - |
|
241 | - /** |
|
242 | - * Redirect to the payment method (PP) settings home page. |
|
243 | - * |
|
244 | - * @return void |
|
245 | - */ |
|
246 | - public static function redirectToPmSettingsHome(): void |
|
247 | - { |
|
248 | - $get_params = EED_Module::getRequest()->getParams(); |
|
249 | - if (empty($get_params['payment_method'])) { |
|
250 | - // Simply do not redirect. |
|
251 | - return; |
|
252 | - } |
|
253 | - $args_to_add = [ |
|
254 | - 'page' => 'espresso_payment_settings', |
|
255 | - 'payment_method' => $get_params['payment_method'], |
|
256 | - ]; |
|
257 | - if (isset($get_params['sandbox_mode'])) { |
|
258 | - $args_to_add[ Domain::META_KEY_SANDBOX_MODE ] = $get_params['sandbox_mode']; |
|
259 | - } |
|
260 | - $home_url = add_query_arg($args_to_add, admin_url('admin.php')); |
|
261 | - wp_redirect($home_url); |
|
262 | - exit; |
|
263 | - } |
|
264 | - |
|
265 | - |
|
266 | - /** |
|
267 | - * Check user’s onboarding status. |
|
268 | - * This will handle the user return from the auth page and also check the status via the API. |
|
269 | - * |
|
270 | - * @return void |
|
271 | - * @throws EE_Error |
|
272 | - * @throws ReflectionException |
|
273 | - */ |
|
274 | - public static function updateOnboardingStatus(): void |
|
275 | - { |
|
276 | - // Check if this is the webhook from PayPal. |
|
277 | - if (! isset($_GET['webhook_action'], $_GET['nonce']) |
|
278 | - || $_GET['webhook_action'] !== 'eepPpcMerchantOnboard' |
|
279 | - ) { |
|
280 | - return; // Ignore. |
|
281 | - } |
|
282 | - $get_params = EED_Module::getRequest()->getParams(); |
|
283 | - // Get the payment method. |
|
284 | - $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
|
285 | - // Check the response (GET) parameters. |
|
286 | - if (! EED_PayPalOnboard::onboardingStatusResponseValid($get_params, $paypal_pm)) { |
|
287 | - // Missing parameters. Can't proceed. |
|
288 | - PayPalLogger::errorLog( |
|
289 | - esc_html__('Missing required onboarding parameters.', 'event_espresso'), |
|
290 | - $get_params, |
|
291 | - $paypal_pm |
|
292 | - ); |
|
293 | - EED_PayPalOnboard::redirectToPmSettingsHome(); |
|
294 | - return; |
|
295 | - } |
|
296 | - // Check on the onboarding status (recommended by PP). |
|
297 | - $onboarding_status = EED_PayPalOnboard::trackSellerOnboarding( |
|
298 | - $paypal_pm, |
|
299 | - $get_params[ Domain::META_KEY_SELLER_MERCHANT_ID ] |
|
300 | - ); |
|
301 | - if (! isset($onboarding_status['valid']) || ! $onboarding_status['valid']) { |
|
302 | - PayPalLogger::errorLog( |
|
303 | - $onboarding_status['message'], |
|
304 | - array_merge($get_params, $onboarding_status), |
|
305 | - $paypal_pm |
|
306 | - ); |
|
307 | - EED_PayPalOnboard::redirectToPmSettingsHome(); |
|
308 | - return; |
|
309 | - } |
|
310 | - // Start saving the setup and info. |
|
311 | - PayPalExtraMetaManager::parseAndSaveOptions($paypal_pm, $onboarding_status); |
|
312 | - // Save the credentials. |
|
313 | - PayPalExtraMetaManager::saveSellerApiCredentials($paypal_pm, $get_params); |
|
314 | - // If onboarded successfully, remove the onboarding URL. |
|
315 | - PayPalExtraMetaManager::deletePmOption($paypal_pm, Domain::META_KEY_ONBOARDING_URL); |
|
316 | - // Also clen GET params by redirecting, because PP auto redirects to the return_url on closing the onboarding window. |
|
317 | - EED_PayPalOnboard::redirectToPmSettingsHome(); |
|
318 | - } |
|
319 | - |
|
320 | - |
|
321 | - /** |
|
322 | - * Check if all required parameters for the onboarding status check are present. |
|
323 | - * |
|
324 | - * @param array $data |
|
325 | - * @param mixed $paypal_pm |
|
326 | - * @return bool |
|
327 | - */ |
|
328 | - public static function onboardingStatusResponseValid(array $data, $paypal_pm): bool |
|
329 | - { |
|
330 | - // Check that we have all the required parameters and the nonce is ok. |
|
331 | - if ($paypal_pm instanceof EE_Payment_Method |
|
332 | - && wp_verify_nonce($data['nonce'], Domain::NONCE_NAME_ONBOARDING_RETURN) |
|
333 | - && ! empty($data[ Domain::API_PARAM_PARTNER_ID ]) |
|
334 | - && ! empty($data[ Domain::META_KEY_SELLER_MERCHANT_ID ]) |
|
335 | - && isset($data[ Domain::API_PARAM_EMAIL_CONFIRMED ]) |
|
336 | - ) { |
|
337 | - return true; |
|
338 | - } |
|
339 | - return false; |
|
340 | - } |
|
341 | - |
|
342 | - |
|
343 | - /** |
|
344 | - * Get partner access token. |
|
345 | - * |
|
346 | - * @param EE_Payment_Method $paypal_pm |
|
347 | - * @return string |
|
348 | - * @throws EE_Error |
|
349 | - * @throws ReflectionException |
|
350 | - */ |
|
351 | - public static function getPartnerAccessToken(EE_Payment_Method $paypal_pm): string |
|
352 | - { |
|
353 | - // Do we have it saved ? |
|
354 | - $access_token = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_ACCESS_TOKEN); |
|
355 | - $expired = EED_PayPalOnboard::partnerAccessTokenExpired($paypal_pm); |
|
356 | - // If we don't have it, request/update it. |
|
357 | - if (! $access_token || $expired) { |
|
358 | - return EED_PayPalOnboard::requestPartnerAccessToken($paypal_pm); |
|
359 | - } |
|
360 | - // Access token is saved as encrypted, so return decrypted. |
|
361 | - return $access_token; |
|
362 | - } |
|
363 | - |
|
364 | - |
|
365 | - /** |
|
366 | - * Get partner access token. |
|
367 | - * |
|
368 | - * @param EE_Payment_Method $paypal_pm |
|
369 | - * @return bool |
|
370 | - */ |
|
371 | - public static function partnerAccessTokenExpired(EE_Payment_Method $paypal_pm): bool |
|
372 | - { |
|
373 | - $expires_at = (int) PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_EXPIRES_IN); |
|
374 | - if (! $expires_at) { |
|
375 | - return true; |
|
376 | - } |
|
377 | - // Validate the token expiration date. |
|
378 | - $now = time(); |
|
379 | - $minutes_left = round(($expires_at - $now) / 60); |
|
380 | - // Count as expired if less than 60 minutes till expiration left. |
|
381 | - if ($minutes_left <= 60) { |
|
382 | - return true; |
|
383 | - } |
|
384 | - return false; |
|
385 | - } |
|
386 | - |
|
387 | - |
|
388 | - /** |
|
389 | - * Request the partner access token from PayPal and save/update it. |
|
390 | - * |
|
391 | - * @param EE_Payment_Method $paypal_pm |
|
392 | - * @return string |
|
393 | - * @throws EE_Error |
|
394 | - * @throws ReflectionException |
|
395 | - */ |
|
396 | - public static function requestPartnerAccessToken(EE_Payment_Method $paypal_pm): string |
|
397 | - { |
|
398 | - $nonce = wp_create_nonce('eea_pp_commerce_get_access_token'); |
|
399 | - // Request the access token. |
|
400 | - $post_args = [ |
|
401 | - 'method' => 'POST', |
|
402 | - 'body' => [ |
|
403 | - 'nonce' => $nonce, |
|
404 | - 'api_version' => 'v1', |
|
405 | - Domain::META_KEY_SANDBOX_MODE => $paypal_pm->debug_mode() ? '1' : '0', |
|
406 | - ], |
|
407 | - ]; |
|
408 | - if (defined('LOCAL_MIDDLEMAN_SERVER')) { |
|
409 | - $post_args['sslverify'] = false; |
|
410 | - } |
|
411 | - $post_url = EED_PayPalOnboard::getMiddlemanBaseUrl($paypal_pm) . 'get_token'; |
|
412 | - $response = EED_PayPalOnboard::sendRequest($paypal_pm, $post_url, $post_args); |
|
413 | - if (isset($response['error'])) { |
|
414 | - return ''; |
|
415 | - } |
|
416 | - // Check the data we received. |
|
417 | - if (! EED_PayPalOnboard::partnerTokenResponseValid($response, $paypal_pm)) { |
|
418 | - return ''; |
|
419 | - } |
|
420 | - // If we are here all seems to be ok. Save the token and it's data. |
|
421 | - $saved = PayPalExtraMetaManager::savePartnerAccessToken($paypal_pm, $response); |
|
422 | - if (! $saved) { |
|
423 | - return ''; |
|
424 | - } |
|
425 | - return $response['access_token']; |
|
426 | - } |
|
427 | - |
|
428 | - |
|
429 | - /** |
|
430 | - * Request seller onboarding status from PayPal. |
|
431 | - * |
|
432 | - * @param EE_Payment_Method $paypal_pm |
|
433 | - * @param string $merchant_id |
|
434 | - * @return array |
|
435 | - */ |
|
436 | - public static function trackSellerOnboarding(EE_Payment_Method $paypal_pm, string $merchant_id): array |
|
437 | - { |
|
438 | - $track_onboarding = EED_PayPalOnboard::getTrackOnboardingApi($paypal_pm, $merchant_id); |
|
439 | - if (! $track_onboarding instanceof TrackSellerOnboarding) { |
|
440 | - $err_msg = esc_html__('Failed to track seller onboarding.', 'event_espresso'); |
|
441 | - return ['error' => 'TRACK_ONBOARDING_FAILED', 'message' => $err_msg]; |
|
442 | - } |
|
443 | - return $track_onboarding->isValid(); |
|
444 | - } |
|
445 | - |
|
446 | - |
|
447 | - /** |
|
448 | - * Returns the Track Seller Onboarding API. |
|
449 | - * |
|
450 | - * @param EE_Payment_Method $paypal_pm |
|
451 | - * @param string $merchant_id |
|
452 | - * @return TrackSellerOnboarding|null |
|
453 | - * @throws EE_Error |
|
454 | - * @throws ReflectionException |
|
455 | - */ |
|
456 | - public static function getTrackOnboardingApi( |
|
457 | - EE_Payment_Method $paypal_pm, |
|
458 | - string $merchant_id |
|
459 | - ): ?TrackSellerOnboarding { |
|
460 | - $partner_id = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_PARTNER_MERCHANT_ID); |
|
461 | - $paypal_api = EED_PayPalCommerce::getPayPalApi($paypal_pm); |
|
462 | - if (! $paypal_api instanceof PayPalApi || ! $partner_id) { |
|
463 | - return null; |
|
464 | - } |
|
465 | - return new TrackSellerOnboarding($paypal_api, $partner_id, $merchant_id, $paypal_pm->debug_mode()); |
|
466 | - } |
|
467 | - |
|
468 | - |
|
469 | - /** |
|
470 | - * Check the onboard status and return the result. |
|
471 | - * (AJAX) |
|
472 | - * |
|
473 | - * @return void |
|
474 | - */ |
|
475 | - public static function getOnboardStatus(): void |
|
476 | - { |
|
477 | - $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
|
478 | - if (! $paypal_pm instanceof EE_Payment_Method) { |
|
479 | - $err_msg = esc_html__('Could not specify the payment method.', 'event_espresso'); |
|
480 | - PayPalLogger::errorLog($err_msg, EED_Module::getRequest()->postParams(), $paypal_pm); |
|
481 | - wp_send_json(['on_board' => false]); |
|
482 | - } |
|
483 | - try { |
|
484 | - $seller_id = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_SELLER_MERCHANT_ID) ?? '--'; |
|
485 | - } catch (Exception $e) { |
|
486 | - $seller_id = '--'; |
|
487 | - } |
|
488 | - wp_send_json( |
|
489 | - [ |
|
490 | - 'on_board' => EED_PayPalOnboard::isOnboard($paypal_pm), |
|
491 | - 'seller_id' => $seller_id, |
|
492 | - ] |
|
493 | - ); |
|
494 | - } |
|
495 | - |
|
496 | - |
|
497 | - /** |
|
498 | - * De-authorize the seller. Remove all API credentials. |
|
499 | - * (AJAX) |
|
500 | - * |
|
501 | - * @return void |
|
502 | - */ |
|
503 | - public static function offboard(): void |
|
504 | - { |
|
505 | - $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
|
506 | - if (! $paypal_pm instanceof EE_Payment_Method) { |
|
507 | - wp_send_json([ |
|
508 | - 'error' => 'INVALID_PM', |
|
509 | - 'message' => esc_html__( |
|
510 | - 'Invalid payment method. Please refresh the page and try again.', |
|
511 | - 'event_espresso' |
|
512 | - ), |
|
513 | - ]); |
|
514 | - } |
|
515 | - PayPalExtraMetaManager::deleteAllData($paypal_pm); |
|
516 | - wp_send_json(['success' => true]); |
|
517 | - } |
|
518 | - |
|
519 | - |
|
520 | - /** |
|
521 | - * Checks if already onboard. |
|
522 | - * |
|
523 | - * @param EE_Payment_Method $payment_method |
|
524 | - * @return boolean |
|
525 | - */ |
|
526 | - public static function isOnboard(EE_Payment_Method $payment_method): bool |
|
527 | - { |
|
528 | - $pp_meta_data = PayPalExtraMetaManager::getAllData($payment_method); |
|
529 | - return |
|
530 | - // onborded with a third party integration ? |
|
531 | - (! empty($pp_meta_data[ Domain::META_KEY_SELLER_MERCHANT_ID ]) |
|
532 | - && ! empty($pp_meta_data[ Domain::META_KEY_ACCESS_TOKEN ]) |
|
533 | - ) |
|
534 | - // or with the first party integration ? |
|
535 | - || (! empty($pp_meta_data[ Domain::META_KEY_CLIENT_ID ]) |
|
536 | - && ! empty($pp_meta_data[ Domain::META_KEY_CLIENT_SECRET ]) |
|
537 | - && ! empty($pp_meta_data[ Domain::META_KEY_PAYER_ID ]) |
|
538 | - ); |
|
539 | - } |
|
540 | - |
|
541 | - |
|
542 | - /** |
|
543 | - * Send a request and return a decoded response body. |
|
544 | - * |
|
545 | - * @param EE_Payment_Method $paypal_pm |
|
546 | - * @param string $request_url |
|
547 | - * @param array $request_args |
|
548 | - * @return array |
|
549 | - */ |
|
550 | - public static function sendRequest(EE_Payment_Method $paypal_pm, string $request_url, array $request_args): array |
|
551 | - { |
|
552 | - $error_return = ['error' => true]; |
|
553 | - $response = wp_remote_request($request_url, $request_args); |
|
554 | - if (is_wp_error($response)) { |
|
555 | - $message = $response->get_error_message(); |
|
556 | - PayPalLogger::errorLog($message, [$request_url, $request_args, $response], $paypal_pm); |
|
557 | - $error_return['message'] = $message; |
|
558 | - return $error_return; |
|
559 | - } |
|
560 | - $response_body = (isset($response['body']) && $response['body']) ? json_decode($response['body'], true) : []; |
|
561 | - if (empty($response_body) || isset($response_body['error'])) { |
|
562 | - $message = $response_body['error_description'] |
|
563 | - ?? sprintf( |
|
564 | - esc_html__('Unknown response received while sending a request to: %1$s', 'event_espresso'), |
|
565 | - $request_url |
|
566 | - ); |
|
567 | - PayPalLogger::errorLog($message, [$request_url, $request_args, $response], $paypal_pm); |
|
568 | - $error_return['message'] = $message; |
|
569 | - return $error_return; |
|
570 | - } |
|
571 | - return $response_body; |
|
572 | - } |
|
573 | - |
|
574 | - |
|
575 | - /** |
|
576 | - * Check the response for a partner token request. |
|
577 | - * |
|
578 | - * @param $response |
|
579 | - * @param EE_Payment_Method $paypal_pm |
|
580 | - * @return bool |
|
581 | - */ |
|
582 | - public static function partnerTokenResponseValid($response, EE_Payment_Method $paypal_pm): bool |
|
583 | - { |
|
584 | - // Check the data we received. |
|
585 | - if ( |
|
586 | - empty($response['nonce']) |
|
587 | - || ! wp_verify_nonce($response['nonce'], 'eea_pp_commerce_get_access_token') |
|
588 | - || empty($response['access_token']) |
|
589 | - || empty($response['app_id']) |
|
590 | - || empty($response['expires_in']) |
|
591 | - || empty($response['partner_client_id']) |
|
592 | - || empty($response['partner_merchant_id']) |
|
593 | - ) { |
|
594 | - // This is an error. |
|
595 | - $err_msg = esc_html__('Incoming parameter validation failed.', 'event_espresso'); |
|
596 | - PayPalLogger::errorLog($err_msg, (array) $response, $paypal_pm); |
|
597 | - return false; |
|
598 | - } |
|
599 | - return true; |
|
600 | - } |
|
601 | - |
|
602 | - |
|
603 | - /** |
|
604 | - * Returns the base URL to the middleman server. |
|
605 | - * If LOCAL_MIDDLEMAN_SERVER is defined, requests will be sent to connect.eventespresso.test |
|
606 | - * |
|
607 | - * @param EE_Payment_Method $payment_method |
|
608 | - * @return string |
|
609 | - * @throws EE_Error |
|
610 | - * @throws ReflectionException |
|
611 | - */ |
|
612 | - public static function getMiddlemanBaseUrl(EE_Payment_Method $payment_method): string |
|
613 | - { |
|
614 | - $target = defined('LOCAL_MIDDLEMAN_SERVER') ? 'test' : 'com'; |
|
615 | - // If this PM is used under different provider accounts, you might need an account indicator. |
|
616 | - $account = defined('EE_PAYPAL_COMMERCE_ACCOUNT_INDICATOR') ? EE_PAYPAL_COMMERCE_ACCOUNT_INDICATOR : ''; |
|
617 | - $postfix = $payment_method->debug_mode() ? '_sandbox' : ''; |
|
618 | - $path = 'paypal_commerce' . $account . $postfix; |
|
619 | - return 'https://connect.eventespresso.' . $target . '/' . $path . '/'; |
|
620 | - } |
|
621 | - |
|
622 | - |
|
623 | - /** |
|
624 | - * This Payment Method admin notices. |
|
625 | - * |
|
626 | - * @return void |
|
627 | - * @throws EE_Error |
|
628 | - * @throws ReflectionException |
|
629 | - */ |
|
630 | - public static function adminNotice() |
|
631 | - { |
|
632 | - // A notice to re-connect if still connected through the first party integration. |
|
633 | - $pp_commerce = EEM_Payment_Method::instance()->get_one_by_slug('paypalcheckout'); |
|
634 | - // Show the notice only if PayPal Commerce is active. |
|
635 | - if (! $pp_commerce instanceof EE_Payment_Method |
|
636 | - || ! EED_PayPalOnboard::isOnboard($pp_commerce) |
|
637 | - || EED_PayPalCommerce::isThirdParty($pp_commerce) |
|
638 | - ) { |
|
639 | - return; |
|
640 | - } |
|
641 | - add_action('admin_notices', [__CLASS__, 'reConnectNotice']); |
|
642 | - } |
|
643 | - |
|
644 | - |
|
645 | - /** |
|
646 | - * Re-connect notice contents. |
|
647 | - * |
|
648 | - * @return void |
|
649 | - * @throws EE_Error |
|
650 | - * @throws ReflectionException |
|
651 | - */ |
|
652 | - public static function reConnectNotice() |
|
653 | - { |
|
654 | - $open_anchor = $close_anchor = ''; |
|
655 | - $pp_commerce = EEM_Payment_Method::instance()->get_one_by_slug('paypalcheckout'); |
|
656 | - if ($pp_commerce instanceof EE_Payment_Method) { |
|
657 | - $pm_page = add_query_arg( |
|
658 | - [ |
|
659 | - 'page' => 'espresso_payment_settings', |
|
660 | - 'webhook_action' => 'eepPpcMerchantOnboard', |
|
661 | - 'payment_method' => $pp_commerce->slug(), |
|
662 | - ], |
|
663 | - admin_url('admin.php') |
|
664 | - ); |
|
665 | - $open_anchor = "<a href='$pm_page'>"; |
|
666 | - $close_anchor = "</a>"; |
|
667 | - } |
|
668 | - echo '<div class="error"><p>' |
|
669 | - . sprintf( |
|
670 | - esc_html__( |
|
671 | - '%1$sPayPal Commerce%2$s has updated the API integration type to allow more flexibility with payments. Please disconnect and re-Connect on the %3$sPayment Methods admin%4$s page to update the credentials and allow advanced payment type options.', |
|
672 | - 'event_espresso' |
|
673 | - ), |
|
674 | - '<strong>', |
|
675 | - '</strong>', |
|
676 | - $open_anchor, |
|
677 | - $close_anchor |
|
678 | - ) |
|
679 | - . '</p></div>'; |
|
680 | - } |
|
23 | + /** |
|
24 | + * @return EED_Module |
|
25 | + * @throws EE_Error |
|
26 | + * @throws ReflectionException |
|
27 | + */ |
|
28 | + public static function instance(): EED_Module |
|
29 | + { |
|
30 | + return parent::get_instance(__CLASS__); |
|
31 | + } |
|
32 | + |
|
33 | + |
|
34 | + /** |
|
35 | + * Run - initial module setup. |
|
36 | + * |
|
37 | + * @param WP $WP |
|
38 | + * @return void |
|
39 | + */ |
|
40 | + public function run($WP) |
|
41 | + { |
|
42 | + } |
|
43 | + |
|
44 | + |
|
45 | + /** |
|
46 | + * For hooking into EE Admin Core and other modules. |
|
47 | + * |
|
48 | + * @return void |
|
49 | + */ |
|
50 | + public static function set_hooks_admin(): void |
|
51 | + { |
|
52 | + if (DbStatus::isOnline()) { |
|
53 | + // Get onboarding URL. |
|
54 | + add_action('wp_ajax_eeaPpGetOnboardingUrl', [__CLASS__, 'getOnboardingUrl']); |
|
55 | + // Catch the return/redirect from PayPal onboarding page. |
|
56 | + add_action('init', [__CLASS__, 'updateOnboardingStatus'], 10); |
|
57 | + // Return the connection/onboard status. |
|
58 | + add_action('wp_ajax_eeaPpGetOnboardStatus', [__CLASS__, 'getOnboardStatus']); |
|
59 | + // Revoke access. |
|
60 | + add_action('wp_ajax_eeaPpOffboard', [__CLASS__, 'offboard']); |
|
61 | + // Admin notice. |
|
62 | + add_action('admin_init', [__CLASS__, 'adminNotice']); |
|
63 | + } |
|
64 | + } |
|
65 | + |
|
66 | + |
|
67 | + /** |
|
68 | + * Get the onboarding URL. |
|
69 | + * (AJAX) |
|
70 | + * |
|
71 | + * @return void |
|
72 | + */ |
|
73 | + public static function getOnboardingUrl(): void |
|
74 | + { |
|
75 | + $signup_link = ''; |
|
76 | + try { |
|
77 | + $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
|
78 | + if (! $paypal_pm instanceof EE_Payment_Method) { |
|
79 | + PayPalLogger::errorLogAndExit( |
|
80 | + esc_html__('No payment method.', 'event_espresso'), |
|
81 | + EED_Module::getRequest()->postParams(), |
|
82 | + $paypal_pm |
|
83 | + ); |
|
84 | + } |
|
85 | + PayPalExtraMetaManager::updateDebugMode($paypal_pm, EED_Module::getRequest()->postParams()); |
|
86 | + // $signup_link = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_ONBOARDING_URL); |
|
87 | + // $token_expired = EED_PayPalOnboard::partnerAccessTokenExpired($paypal_pm); |
|
88 | + // if (! $signup_link || $token_expired) { |
|
89 | + $signup_link = EED_PayPalOnboard::requestOnboardingUrl($paypal_pm); |
|
90 | + // } |
|
91 | + if (! $signup_link) { |
|
92 | + $err_msg = esc_html__('Error! Could not generate a sign-up link.', 'event_espresso'); |
|
93 | + PayPalLogger::errorLogAndExit($err_msg, ['signup_link' => $signup_link], $paypal_pm); |
|
94 | + } |
|
95 | + PayPalExtraMetaManager::savePmOption($paypal_pm, Domain::META_KEY_ONBOARDING_URL, $signup_link); |
|
96 | + } catch (Exception $exception) { |
|
97 | + PayPalLogger::errorLogAndExit($exception->getMessage()); |
|
98 | + } |
|
99 | + // Is it empty (can happen if we didn't get the URL through the API). |
|
100 | + $signup_link = $signup_link ? $signup_link . '?&displayMode=minibrowser' : '#'; |
|
101 | + wp_send_json( |
|
102 | + [ |
|
103 | + 'signup_link' => $signup_link, |
|
104 | + ] |
|
105 | + ); |
|
106 | + } |
|
107 | + |
|
108 | + |
|
109 | + /** |
|
110 | + * Request the sign-up link from PayPal. |
|
111 | + * |
|
112 | + * @param EE_Payment_Method $paypal_pm |
|
113 | + * @param bool $one_time_request |
|
114 | + * @return string |
|
115 | + * @throws EE_Error |
|
116 | + * @throws Exception |
|
117 | + */ |
|
118 | + public static function requestOnboardingUrl(EE_Payment_Method $paypal_pm, bool $one_time_request = false): string |
|
119 | + { |
|
120 | + $signup_link = ''; |
|
121 | + // Get the access token. |
|
122 | + $access_token = EED_PayPalOnboard::getPartnerAccessToken($paypal_pm); |
|
123 | + if (! $access_token) { |
|
124 | + $err_msg = esc_html__('Error! No access token.', 'event_espresso'); |
|
125 | + PayPalLogger::errorLog($err_msg, ['access_token' => $access_token], $paypal_pm); |
|
126 | + return ''; |
|
127 | + } |
|
128 | + // Request the access token. |
|
129 | + $body_params = EED_PayPalOnboard::signupLinkRequestBody($paypal_pm); |
|
130 | + $bn_code = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_BN_CODE); |
|
131 | + $post_params = [ |
|
132 | + 'method' => 'POST', |
|
133 | + 'headers' => [ |
|
134 | + 'User-Agent' => sanitize_text_field($_SERVER['HTTP_USER_AGENT']), |
|
135 | + 'Content-Type' => 'application/json', |
|
136 | + 'Authorization' => 'Bearer ' . $access_token, |
|
137 | + 'PayPal-Partner-Attribution-Id' => $bn_code, |
|
138 | + ], |
|
139 | + 'body' => $body_params, |
|
140 | + ]; |
|
141 | + $request_url = Domain::getPayPalApiUrl($paypal_pm) . '/v2/customer/partner-referrals'; |
|
142 | + $response = EED_PayPalOnboard::sendRequest($paypal_pm, $request_url, $post_params); |
|
143 | + // Check the data we received. |
|
144 | + if (isset($response['error']) || empty($response['links'])) { |
|
145 | + // Did the original access token get replaced by any chance ? |
|
146 | + if (! $one_time_request |
|
147 | + && ! empty($response['message']) |
|
148 | + && $response['message'] === 'Access Token not found in cache' |
|
149 | + ) { |
|
150 | + // Clear all PM metadata and try getting the access token One more time. |
|
151 | + PayPalExtraMetaManager::deleteAllData($paypal_pm); |
|
152 | + return EED_PayPalOnboard::requestOnboardingUrl($paypal_pm, true); |
|
153 | + } |
|
154 | + $err_msg = esc_html__('Incoming sign-up link parameter validation failed.', 'event_espresso'); |
|
155 | + PayPalLogger::errorLog($err_msg, $response, $paypal_pm); |
|
156 | + return ''; |
|
157 | + } |
|
158 | + // Now retrieve that sign-up link. |
|
159 | + foreach ($response['links'] as $link) { |
|
160 | + if ($link['rel'] === 'action_url') { |
|
161 | + $signup_link = $link['href'] ?? ''; |
|
162 | + } |
|
163 | + } |
|
164 | + return $signup_link; |
|
165 | + } |
|
166 | + |
|
167 | + |
|
168 | + /** |
|
169 | + * Get the return URL. |
|
170 | + * |
|
171 | + * @param EE_Payment_Method $paypal_pm |
|
172 | + * @return string |
|
173 | + * @throws Exception |
|
174 | + */ |
|
175 | + public static function signupLinkRequestBody(EE_Payment_Method $paypal_pm): string |
|
176 | + { |
|
177 | + $identifier_string = new OneTimeString($paypal_pm->debug_mode()); |
|
178 | + $tracking_id = $identifier_string->value(); |
|
179 | + $request = LoaderFactory::getLoader()->getShared(RequestInterface::class); |
|
180 | + $checkout_type = $request->getRequestParam('checkout_type', 'EXPRESS_CHECKOUT', DataType::STRING); |
|
181 | + // Save the identifier for future use. |
|
182 | + PayPalExtraMetaManager::savePmOption($paypal_pm, Domain::META_KEY_TRACKING_ID, $tracking_id); |
|
183 | + // Assemble the return URL. |
|
184 | + $return_url = EED_PayPalOnboard::getReturnUrl($paypal_pm); |
|
185 | + return json_encode([ |
|
186 | + 'tracking_id' => $tracking_id, |
|
187 | + 'operations' => [ |
|
188 | + [ |
|
189 | + 'operation' => 'API_INTEGRATION', |
|
190 | + 'api_integration_preference' => [ |
|
191 | + 'rest_api_integration' => [ |
|
192 | + 'integration_method' => 'PAYPAL', |
|
193 | + 'integration_type' => 'THIRD_PARTY', |
|
194 | + 'third_party_details' => [ |
|
195 | + 'features' => ['PAYMENT', 'REFUND'], |
|
196 | + ], |
|
197 | + ], |
|
198 | + ], |
|
199 | + ], |
|
200 | + ], |
|
201 | + 'products' => [$checkout_type], |
|
202 | + 'legal_consents' => [ |
|
203 | + [ |
|
204 | + 'type' => 'SHARE_DATA_CONSENT', |
|
205 | + 'granted' => true, |
|
206 | + ], |
|
207 | + ], |
|
208 | + 'partner_config_override' => [ |
|
209 | + 'return_url' => $return_url, |
|
210 | + ], |
|
211 | + ]); |
|
212 | + } |
|
213 | + |
|
214 | + |
|
215 | + /** |
|
216 | + * Get the return URL. |
|
217 | + * |
|
218 | + * @param EE_Payment_Method $paypal_pm |
|
219 | + * @return string |
|
220 | + * @throws EE_Error |
|
221 | + * @throws ReflectionException |
|
222 | + */ |
|
223 | + public static function getReturnUrl(EE_Payment_Method $paypal_pm): string |
|
224 | + { |
|
225 | + $wp_nonce = EED_Module::getRequest()->getRequestParam('wp_nonce'); |
|
226 | + $nonce = wp_create_nonce(Domain::NONCE_NAME_ONBOARDING_RETURN); |
|
227 | + return add_query_arg( |
|
228 | + [ |
|
229 | + 'page' => 'espresso_payment_settings', |
|
230 | + 'webhook_action' => 'eepPpcMerchantOnboard', |
|
231 | + 'payment_method' => $paypal_pm->slug(), |
|
232 | + '_wpnonce' => $wp_nonce, |
|
233 | + 'nonce' => $nonce, |
|
234 | + Domain::META_KEY_SANDBOX_MODE => $paypal_pm->debug_mode() ? '1' : '0', |
|
235 | + ], |
|
236 | + admin_url('admin.php') |
|
237 | + ); |
|
238 | + } |
|
239 | + |
|
240 | + |
|
241 | + /** |
|
242 | + * Redirect to the payment method (PP) settings home page. |
|
243 | + * |
|
244 | + * @return void |
|
245 | + */ |
|
246 | + public static function redirectToPmSettingsHome(): void |
|
247 | + { |
|
248 | + $get_params = EED_Module::getRequest()->getParams(); |
|
249 | + if (empty($get_params['payment_method'])) { |
|
250 | + // Simply do not redirect. |
|
251 | + return; |
|
252 | + } |
|
253 | + $args_to_add = [ |
|
254 | + 'page' => 'espresso_payment_settings', |
|
255 | + 'payment_method' => $get_params['payment_method'], |
|
256 | + ]; |
|
257 | + if (isset($get_params['sandbox_mode'])) { |
|
258 | + $args_to_add[ Domain::META_KEY_SANDBOX_MODE ] = $get_params['sandbox_mode']; |
|
259 | + } |
|
260 | + $home_url = add_query_arg($args_to_add, admin_url('admin.php')); |
|
261 | + wp_redirect($home_url); |
|
262 | + exit; |
|
263 | + } |
|
264 | + |
|
265 | + |
|
266 | + /** |
|
267 | + * Check user’s onboarding status. |
|
268 | + * This will handle the user return from the auth page and also check the status via the API. |
|
269 | + * |
|
270 | + * @return void |
|
271 | + * @throws EE_Error |
|
272 | + * @throws ReflectionException |
|
273 | + */ |
|
274 | + public static function updateOnboardingStatus(): void |
|
275 | + { |
|
276 | + // Check if this is the webhook from PayPal. |
|
277 | + if (! isset($_GET['webhook_action'], $_GET['nonce']) |
|
278 | + || $_GET['webhook_action'] !== 'eepPpcMerchantOnboard' |
|
279 | + ) { |
|
280 | + return; // Ignore. |
|
281 | + } |
|
282 | + $get_params = EED_Module::getRequest()->getParams(); |
|
283 | + // Get the payment method. |
|
284 | + $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
|
285 | + // Check the response (GET) parameters. |
|
286 | + if (! EED_PayPalOnboard::onboardingStatusResponseValid($get_params, $paypal_pm)) { |
|
287 | + // Missing parameters. Can't proceed. |
|
288 | + PayPalLogger::errorLog( |
|
289 | + esc_html__('Missing required onboarding parameters.', 'event_espresso'), |
|
290 | + $get_params, |
|
291 | + $paypal_pm |
|
292 | + ); |
|
293 | + EED_PayPalOnboard::redirectToPmSettingsHome(); |
|
294 | + return; |
|
295 | + } |
|
296 | + // Check on the onboarding status (recommended by PP). |
|
297 | + $onboarding_status = EED_PayPalOnboard::trackSellerOnboarding( |
|
298 | + $paypal_pm, |
|
299 | + $get_params[ Domain::META_KEY_SELLER_MERCHANT_ID ] |
|
300 | + ); |
|
301 | + if (! isset($onboarding_status['valid']) || ! $onboarding_status['valid']) { |
|
302 | + PayPalLogger::errorLog( |
|
303 | + $onboarding_status['message'], |
|
304 | + array_merge($get_params, $onboarding_status), |
|
305 | + $paypal_pm |
|
306 | + ); |
|
307 | + EED_PayPalOnboard::redirectToPmSettingsHome(); |
|
308 | + return; |
|
309 | + } |
|
310 | + // Start saving the setup and info. |
|
311 | + PayPalExtraMetaManager::parseAndSaveOptions($paypal_pm, $onboarding_status); |
|
312 | + // Save the credentials. |
|
313 | + PayPalExtraMetaManager::saveSellerApiCredentials($paypal_pm, $get_params); |
|
314 | + // If onboarded successfully, remove the onboarding URL. |
|
315 | + PayPalExtraMetaManager::deletePmOption($paypal_pm, Domain::META_KEY_ONBOARDING_URL); |
|
316 | + // Also clen GET params by redirecting, because PP auto redirects to the return_url on closing the onboarding window. |
|
317 | + EED_PayPalOnboard::redirectToPmSettingsHome(); |
|
318 | + } |
|
319 | + |
|
320 | + |
|
321 | + /** |
|
322 | + * Check if all required parameters for the onboarding status check are present. |
|
323 | + * |
|
324 | + * @param array $data |
|
325 | + * @param mixed $paypal_pm |
|
326 | + * @return bool |
|
327 | + */ |
|
328 | + public static function onboardingStatusResponseValid(array $data, $paypal_pm): bool |
|
329 | + { |
|
330 | + // Check that we have all the required parameters and the nonce is ok. |
|
331 | + if ($paypal_pm instanceof EE_Payment_Method |
|
332 | + && wp_verify_nonce($data['nonce'], Domain::NONCE_NAME_ONBOARDING_RETURN) |
|
333 | + && ! empty($data[ Domain::API_PARAM_PARTNER_ID ]) |
|
334 | + && ! empty($data[ Domain::META_KEY_SELLER_MERCHANT_ID ]) |
|
335 | + && isset($data[ Domain::API_PARAM_EMAIL_CONFIRMED ]) |
|
336 | + ) { |
|
337 | + return true; |
|
338 | + } |
|
339 | + return false; |
|
340 | + } |
|
341 | + |
|
342 | + |
|
343 | + /** |
|
344 | + * Get partner access token. |
|
345 | + * |
|
346 | + * @param EE_Payment_Method $paypal_pm |
|
347 | + * @return string |
|
348 | + * @throws EE_Error |
|
349 | + * @throws ReflectionException |
|
350 | + */ |
|
351 | + public static function getPartnerAccessToken(EE_Payment_Method $paypal_pm): string |
|
352 | + { |
|
353 | + // Do we have it saved ? |
|
354 | + $access_token = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_ACCESS_TOKEN); |
|
355 | + $expired = EED_PayPalOnboard::partnerAccessTokenExpired($paypal_pm); |
|
356 | + // If we don't have it, request/update it. |
|
357 | + if (! $access_token || $expired) { |
|
358 | + return EED_PayPalOnboard::requestPartnerAccessToken($paypal_pm); |
|
359 | + } |
|
360 | + // Access token is saved as encrypted, so return decrypted. |
|
361 | + return $access_token; |
|
362 | + } |
|
363 | + |
|
364 | + |
|
365 | + /** |
|
366 | + * Get partner access token. |
|
367 | + * |
|
368 | + * @param EE_Payment_Method $paypal_pm |
|
369 | + * @return bool |
|
370 | + */ |
|
371 | + public static function partnerAccessTokenExpired(EE_Payment_Method $paypal_pm): bool |
|
372 | + { |
|
373 | + $expires_at = (int) PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_EXPIRES_IN); |
|
374 | + if (! $expires_at) { |
|
375 | + return true; |
|
376 | + } |
|
377 | + // Validate the token expiration date. |
|
378 | + $now = time(); |
|
379 | + $minutes_left = round(($expires_at - $now) / 60); |
|
380 | + // Count as expired if less than 60 minutes till expiration left. |
|
381 | + if ($minutes_left <= 60) { |
|
382 | + return true; |
|
383 | + } |
|
384 | + return false; |
|
385 | + } |
|
386 | + |
|
387 | + |
|
388 | + /** |
|
389 | + * Request the partner access token from PayPal and save/update it. |
|
390 | + * |
|
391 | + * @param EE_Payment_Method $paypal_pm |
|
392 | + * @return string |
|
393 | + * @throws EE_Error |
|
394 | + * @throws ReflectionException |
|
395 | + */ |
|
396 | + public static function requestPartnerAccessToken(EE_Payment_Method $paypal_pm): string |
|
397 | + { |
|
398 | + $nonce = wp_create_nonce('eea_pp_commerce_get_access_token'); |
|
399 | + // Request the access token. |
|
400 | + $post_args = [ |
|
401 | + 'method' => 'POST', |
|
402 | + 'body' => [ |
|
403 | + 'nonce' => $nonce, |
|
404 | + 'api_version' => 'v1', |
|
405 | + Domain::META_KEY_SANDBOX_MODE => $paypal_pm->debug_mode() ? '1' : '0', |
|
406 | + ], |
|
407 | + ]; |
|
408 | + if (defined('LOCAL_MIDDLEMAN_SERVER')) { |
|
409 | + $post_args['sslverify'] = false; |
|
410 | + } |
|
411 | + $post_url = EED_PayPalOnboard::getMiddlemanBaseUrl($paypal_pm) . 'get_token'; |
|
412 | + $response = EED_PayPalOnboard::sendRequest($paypal_pm, $post_url, $post_args); |
|
413 | + if (isset($response['error'])) { |
|
414 | + return ''; |
|
415 | + } |
|
416 | + // Check the data we received. |
|
417 | + if (! EED_PayPalOnboard::partnerTokenResponseValid($response, $paypal_pm)) { |
|
418 | + return ''; |
|
419 | + } |
|
420 | + // If we are here all seems to be ok. Save the token and it's data. |
|
421 | + $saved = PayPalExtraMetaManager::savePartnerAccessToken($paypal_pm, $response); |
|
422 | + if (! $saved) { |
|
423 | + return ''; |
|
424 | + } |
|
425 | + return $response['access_token']; |
|
426 | + } |
|
427 | + |
|
428 | + |
|
429 | + /** |
|
430 | + * Request seller onboarding status from PayPal. |
|
431 | + * |
|
432 | + * @param EE_Payment_Method $paypal_pm |
|
433 | + * @param string $merchant_id |
|
434 | + * @return array |
|
435 | + */ |
|
436 | + public static function trackSellerOnboarding(EE_Payment_Method $paypal_pm, string $merchant_id): array |
|
437 | + { |
|
438 | + $track_onboarding = EED_PayPalOnboard::getTrackOnboardingApi($paypal_pm, $merchant_id); |
|
439 | + if (! $track_onboarding instanceof TrackSellerOnboarding) { |
|
440 | + $err_msg = esc_html__('Failed to track seller onboarding.', 'event_espresso'); |
|
441 | + return ['error' => 'TRACK_ONBOARDING_FAILED', 'message' => $err_msg]; |
|
442 | + } |
|
443 | + return $track_onboarding->isValid(); |
|
444 | + } |
|
445 | + |
|
446 | + |
|
447 | + /** |
|
448 | + * Returns the Track Seller Onboarding API. |
|
449 | + * |
|
450 | + * @param EE_Payment_Method $paypal_pm |
|
451 | + * @param string $merchant_id |
|
452 | + * @return TrackSellerOnboarding|null |
|
453 | + * @throws EE_Error |
|
454 | + * @throws ReflectionException |
|
455 | + */ |
|
456 | + public static function getTrackOnboardingApi( |
|
457 | + EE_Payment_Method $paypal_pm, |
|
458 | + string $merchant_id |
|
459 | + ): ?TrackSellerOnboarding { |
|
460 | + $partner_id = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_PARTNER_MERCHANT_ID); |
|
461 | + $paypal_api = EED_PayPalCommerce::getPayPalApi($paypal_pm); |
|
462 | + if (! $paypal_api instanceof PayPalApi || ! $partner_id) { |
|
463 | + return null; |
|
464 | + } |
|
465 | + return new TrackSellerOnboarding($paypal_api, $partner_id, $merchant_id, $paypal_pm->debug_mode()); |
|
466 | + } |
|
467 | + |
|
468 | + |
|
469 | + /** |
|
470 | + * Check the onboard status and return the result. |
|
471 | + * (AJAX) |
|
472 | + * |
|
473 | + * @return void |
|
474 | + */ |
|
475 | + public static function getOnboardStatus(): void |
|
476 | + { |
|
477 | + $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
|
478 | + if (! $paypal_pm instanceof EE_Payment_Method) { |
|
479 | + $err_msg = esc_html__('Could not specify the payment method.', 'event_espresso'); |
|
480 | + PayPalLogger::errorLog($err_msg, EED_Module::getRequest()->postParams(), $paypal_pm); |
|
481 | + wp_send_json(['on_board' => false]); |
|
482 | + } |
|
483 | + try { |
|
484 | + $seller_id = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_SELLER_MERCHANT_ID) ?? '--'; |
|
485 | + } catch (Exception $e) { |
|
486 | + $seller_id = '--'; |
|
487 | + } |
|
488 | + wp_send_json( |
|
489 | + [ |
|
490 | + 'on_board' => EED_PayPalOnboard::isOnboard($paypal_pm), |
|
491 | + 'seller_id' => $seller_id, |
|
492 | + ] |
|
493 | + ); |
|
494 | + } |
|
495 | + |
|
496 | + |
|
497 | + /** |
|
498 | + * De-authorize the seller. Remove all API credentials. |
|
499 | + * (AJAX) |
|
500 | + * |
|
501 | + * @return void |
|
502 | + */ |
|
503 | + public static function offboard(): void |
|
504 | + { |
|
505 | + $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
|
506 | + if (! $paypal_pm instanceof EE_Payment_Method) { |
|
507 | + wp_send_json([ |
|
508 | + 'error' => 'INVALID_PM', |
|
509 | + 'message' => esc_html__( |
|
510 | + 'Invalid payment method. Please refresh the page and try again.', |
|
511 | + 'event_espresso' |
|
512 | + ), |
|
513 | + ]); |
|
514 | + } |
|
515 | + PayPalExtraMetaManager::deleteAllData($paypal_pm); |
|
516 | + wp_send_json(['success' => true]); |
|
517 | + } |
|
518 | + |
|
519 | + |
|
520 | + /** |
|
521 | + * Checks if already onboard. |
|
522 | + * |
|
523 | + * @param EE_Payment_Method $payment_method |
|
524 | + * @return boolean |
|
525 | + */ |
|
526 | + public static function isOnboard(EE_Payment_Method $payment_method): bool |
|
527 | + { |
|
528 | + $pp_meta_data = PayPalExtraMetaManager::getAllData($payment_method); |
|
529 | + return |
|
530 | + // onborded with a third party integration ? |
|
531 | + (! empty($pp_meta_data[ Domain::META_KEY_SELLER_MERCHANT_ID ]) |
|
532 | + && ! empty($pp_meta_data[ Domain::META_KEY_ACCESS_TOKEN ]) |
|
533 | + ) |
|
534 | + // or with the first party integration ? |
|
535 | + || (! empty($pp_meta_data[ Domain::META_KEY_CLIENT_ID ]) |
|
536 | + && ! empty($pp_meta_data[ Domain::META_KEY_CLIENT_SECRET ]) |
|
537 | + && ! empty($pp_meta_data[ Domain::META_KEY_PAYER_ID ]) |
|
538 | + ); |
|
539 | + } |
|
540 | + |
|
541 | + |
|
542 | + /** |
|
543 | + * Send a request and return a decoded response body. |
|
544 | + * |
|
545 | + * @param EE_Payment_Method $paypal_pm |
|
546 | + * @param string $request_url |
|
547 | + * @param array $request_args |
|
548 | + * @return array |
|
549 | + */ |
|
550 | + public static function sendRequest(EE_Payment_Method $paypal_pm, string $request_url, array $request_args): array |
|
551 | + { |
|
552 | + $error_return = ['error' => true]; |
|
553 | + $response = wp_remote_request($request_url, $request_args); |
|
554 | + if (is_wp_error($response)) { |
|
555 | + $message = $response->get_error_message(); |
|
556 | + PayPalLogger::errorLog($message, [$request_url, $request_args, $response], $paypal_pm); |
|
557 | + $error_return['message'] = $message; |
|
558 | + return $error_return; |
|
559 | + } |
|
560 | + $response_body = (isset($response['body']) && $response['body']) ? json_decode($response['body'], true) : []; |
|
561 | + if (empty($response_body) || isset($response_body['error'])) { |
|
562 | + $message = $response_body['error_description'] |
|
563 | + ?? sprintf( |
|
564 | + esc_html__('Unknown response received while sending a request to: %1$s', 'event_espresso'), |
|
565 | + $request_url |
|
566 | + ); |
|
567 | + PayPalLogger::errorLog($message, [$request_url, $request_args, $response], $paypal_pm); |
|
568 | + $error_return['message'] = $message; |
|
569 | + return $error_return; |
|
570 | + } |
|
571 | + return $response_body; |
|
572 | + } |
|
573 | + |
|
574 | + |
|
575 | + /** |
|
576 | + * Check the response for a partner token request. |
|
577 | + * |
|
578 | + * @param $response |
|
579 | + * @param EE_Payment_Method $paypal_pm |
|
580 | + * @return bool |
|
581 | + */ |
|
582 | + public static function partnerTokenResponseValid($response, EE_Payment_Method $paypal_pm): bool |
|
583 | + { |
|
584 | + // Check the data we received. |
|
585 | + if ( |
|
586 | + empty($response['nonce']) |
|
587 | + || ! wp_verify_nonce($response['nonce'], 'eea_pp_commerce_get_access_token') |
|
588 | + || empty($response['access_token']) |
|
589 | + || empty($response['app_id']) |
|
590 | + || empty($response['expires_in']) |
|
591 | + || empty($response['partner_client_id']) |
|
592 | + || empty($response['partner_merchant_id']) |
|
593 | + ) { |
|
594 | + // This is an error. |
|
595 | + $err_msg = esc_html__('Incoming parameter validation failed.', 'event_espresso'); |
|
596 | + PayPalLogger::errorLog($err_msg, (array) $response, $paypal_pm); |
|
597 | + return false; |
|
598 | + } |
|
599 | + return true; |
|
600 | + } |
|
601 | + |
|
602 | + |
|
603 | + /** |
|
604 | + * Returns the base URL to the middleman server. |
|
605 | + * If LOCAL_MIDDLEMAN_SERVER is defined, requests will be sent to connect.eventespresso.test |
|
606 | + * |
|
607 | + * @param EE_Payment_Method $payment_method |
|
608 | + * @return string |
|
609 | + * @throws EE_Error |
|
610 | + * @throws ReflectionException |
|
611 | + */ |
|
612 | + public static function getMiddlemanBaseUrl(EE_Payment_Method $payment_method): string |
|
613 | + { |
|
614 | + $target = defined('LOCAL_MIDDLEMAN_SERVER') ? 'test' : 'com'; |
|
615 | + // If this PM is used under different provider accounts, you might need an account indicator. |
|
616 | + $account = defined('EE_PAYPAL_COMMERCE_ACCOUNT_INDICATOR') ? EE_PAYPAL_COMMERCE_ACCOUNT_INDICATOR : ''; |
|
617 | + $postfix = $payment_method->debug_mode() ? '_sandbox' : ''; |
|
618 | + $path = 'paypal_commerce' . $account . $postfix; |
|
619 | + return 'https://connect.eventespresso.' . $target . '/' . $path . '/'; |
|
620 | + } |
|
621 | + |
|
622 | + |
|
623 | + /** |
|
624 | + * This Payment Method admin notices. |
|
625 | + * |
|
626 | + * @return void |
|
627 | + * @throws EE_Error |
|
628 | + * @throws ReflectionException |
|
629 | + */ |
|
630 | + public static function adminNotice() |
|
631 | + { |
|
632 | + // A notice to re-connect if still connected through the first party integration. |
|
633 | + $pp_commerce = EEM_Payment_Method::instance()->get_one_by_slug('paypalcheckout'); |
|
634 | + // Show the notice only if PayPal Commerce is active. |
|
635 | + if (! $pp_commerce instanceof EE_Payment_Method |
|
636 | + || ! EED_PayPalOnboard::isOnboard($pp_commerce) |
|
637 | + || EED_PayPalCommerce::isThirdParty($pp_commerce) |
|
638 | + ) { |
|
639 | + return; |
|
640 | + } |
|
641 | + add_action('admin_notices', [__CLASS__, 'reConnectNotice']); |
|
642 | + } |
|
643 | + |
|
644 | + |
|
645 | + /** |
|
646 | + * Re-connect notice contents. |
|
647 | + * |
|
648 | + * @return void |
|
649 | + * @throws EE_Error |
|
650 | + * @throws ReflectionException |
|
651 | + */ |
|
652 | + public static function reConnectNotice() |
|
653 | + { |
|
654 | + $open_anchor = $close_anchor = ''; |
|
655 | + $pp_commerce = EEM_Payment_Method::instance()->get_one_by_slug('paypalcheckout'); |
|
656 | + if ($pp_commerce instanceof EE_Payment_Method) { |
|
657 | + $pm_page = add_query_arg( |
|
658 | + [ |
|
659 | + 'page' => 'espresso_payment_settings', |
|
660 | + 'webhook_action' => 'eepPpcMerchantOnboard', |
|
661 | + 'payment_method' => $pp_commerce->slug(), |
|
662 | + ], |
|
663 | + admin_url('admin.php') |
|
664 | + ); |
|
665 | + $open_anchor = "<a href='$pm_page'>"; |
|
666 | + $close_anchor = "</a>"; |
|
667 | + } |
|
668 | + echo '<div class="error"><p>' |
|
669 | + . sprintf( |
|
670 | + esc_html__( |
|
671 | + '%1$sPayPal Commerce%2$s has updated the API integration type to allow more flexibility with payments. Please disconnect and re-Connect on the %3$sPayment Methods admin%4$s page to update the credentials and allow advanced payment type options.', |
|
672 | + 'event_espresso' |
|
673 | + ), |
|
674 | + '<strong>', |
|
675 | + '</strong>', |
|
676 | + $open_anchor, |
|
677 | + $close_anchor |
|
678 | + ) |
|
679 | + . '</p></div>'; |
|
680 | + } |
|
681 | 681 | } |
@@ -75,7 +75,7 @@ discard block |
||
75 | 75 | $signup_link = ''; |
76 | 76 | try { |
77 | 77 | $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
78 | - if (! $paypal_pm instanceof EE_Payment_Method) { |
|
78 | + if ( ! $paypal_pm instanceof EE_Payment_Method) { |
|
79 | 79 | PayPalLogger::errorLogAndExit( |
80 | 80 | esc_html__('No payment method.', 'event_espresso'), |
81 | 81 | EED_Module::getRequest()->postParams(), |
@@ -88,7 +88,7 @@ discard block |
||
88 | 88 | // if (! $signup_link || $token_expired) { |
89 | 89 | $signup_link = EED_PayPalOnboard::requestOnboardingUrl($paypal_pm); |
90 | 90 | // } |
91 | - if (! $signup_link) { |
|
91 | + if ( ! $signup_link) { |
|
92 | 92 | $err_msg = esc_html__('Error! Could not generate a sign-up link.', 'event_espresso'); |
93 | 93 | PayPalLogger::errorLogAndExit($err_msg, ['signup_link' => $signup_link], $paypal_pm); |
94 | 94 | } |
@@ -97,7 +97,7 @@ discard block |
||
97 | 97 | PayPalLogger::errorLogAndExit($exception->getMessage()); |
98 | 98 | } |
99 | 99 | // Is it empty (can happen if we didn't get the URL through the API). |
100 | - $signup_link = $signup_link ? $signup_link . '?&displayMode=minibrowser' : '#'; |
|
100 | + $signup_link = $signup_link ? $signup_link.'?&displayMode=minibrowser' : '#'; |
|
101 | 101 | wp_send_json( |
102 | 102 | [ |
103 | 103 | 'signup_link' => $signup_link, |
@@ -120,7 +120,7 @@ discard block |
||
120 | 120 | $signup_link = ''; |
121 | 121 | // Get the access token. |
122 | 122 | $access_token = EED_PayPalOnboard::getPartnerAccessToken($paypal_pm); |
123 | - if (! $access_token) { |
|
123 | + if ( ! $access_token) { |
|
124 | 124 | $err_msg = esc_html__('Error! No access token.', 'event_espresso'); |
125 | 125 | PayPalLogger::errorLog($err_msg, ['access_token' => $access_token], $paypal_pm); |
126 | 126 | return ''; |
@@ -133,17 +133,17 @@ discard block |
||
133 | 133 | 'headers' => [ |
134 | 134 | 'User-Agent' => sanitize_text_field($_SERVER['HTTP_USER_AGENT']), |
135 | 135 | 'Content-Type' => 'application/json', |
136 | - 'Authorization' => 'Bearer ' . $access_token, |
|
136 | + 'Authorization' => 'Bearer '.$access_token, |
|
137 | 137 | 'PayPal-Partner-Attribution-Id' => $bn_code, |
138 | 138 | ], |
139 | 139 | 'body' => $body_params, |
140 | 140 | ]; |
141 | - $request_url = Domain::getPayPalApiUrl($paypal_pm) . '/v2/customer/partner-referrals'; |
|
141 | + $request_url = Domain::getPayPalApiUrl($paypal_pm).'/v2/customer/partner-referrals'; |
|
142 | 142 | $response = EED_PayPalOnboard::sendRequest($paypal_pm, $request_url, $post_params); |
143 | 143 | // Check the data we received. |
144 | 144 | if (isset($response['error']) || empty($response['links'])) { |
145 | 145 | // Did the original access token get replaced by any chance ? |
146 | - if (! $one_time_request |
|
146 | + if ( ! $one_time_request |
|
147 | 147 | && ! empty($response['message']) |
148 | 148 | && $response['message'] === 'Access Token not found in cache' |
149 | 149 | ) { |
@@ -255,7 +255,7 @@ discard block |
||
255 | 255 | 'payment_method' => $get_params['payment_method'], |
256 | 256 | ]; |
257 | 257 | if (isset($get_params['sandbox_mode'])) { |
258 | - $args_to_add[ Domain::META_KEY_SANDBOX_MODE ] = $get_params['sandbox_mode']; |
|
258 | + $args_to_add[Domain::META_KEY_SANDBOX_MODE] = $get_params['sandbox_mode']; |
|
259 | 259 | } |
260 | 260 | $home_url = add_query_arg($args_to_add, admin_url('admin.php')); |
261 | 261 | wp_redirect($home_url); |
@@ -274,16 +274,16 @@ discard block |
||
274 | 274 | public static function updateOnboardingStatus(): void |
275 | 275 | { |
276 | 276 | // Check if this is the webhook from PayPal. |
277 | - if (! isset($_GET['webhook_action'], $_GET['nonce']) |
|
277 | + if ( ! isset($_GET['webhook_action'], $_GET['nonce']) |
|
278 | 278 | || $_GET['webhook_action'] !== 'eepPpcMerchantOnboard' |
279 | 279 | ) { |
280 | - return; // Ignore. |
|
280 | + return; // Ignore. |
|
281 | 281 | } |
282 | 282 | $get_params = EED_Module::getRequest()->getParams(); |
283 | 283 | // Get the payment method. |
284 | 284 | $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
285 | 285 | // Check the response (GET) parameters. |
286 | - if (! EED_PayPalOnboard::onboardingStatusResponseValid($get_params, $paypal_pm)) { |
|
286 | + if ( ! EED_PayPalOnboard::onboardingStatusResponseValid($get_params, $paypal_pm)) { |
|
287 | 287 | // Missing parameters. Can't proceed. |
288 | 288 | PayPalLogger::errorLog( |
289 | 289 | esc_html__('Missing required onboarding parameters.', 'event_espresso'), |
@@ -296,9 +296,9 @@ discard block |
||
296 | 296 | // Check on the onboarding status (recommended by PP). |
297 | 297 | $onboarding_status = EED_PayPalOnboard::trackSellerOnboarding( |
298 | 298 | $paypal_pm, |
299 | - $get_params[ Domain::META_KEY_SELLER_MERCHANT_ID ] |
|
299 | + $get_params[Domain::META_KEY_SELLER_MERCHANT_ID] |
|
300 | 300 | ); |
301 | - if (! isset($onboarding_status['valid']) || ! $onboarding_status['valid']) { |
|
301 | + if ( ! isset($onboarding_status['valid']) || ! $onboarding_status['valid']) { |
|
302 | 302 | PayPalLogger::errorLog( |
303 | 303 | $onboarding_status['message'], |
304 | 304 | array_merge($get_params, $onboarding_status), |
@@ -330,9 +330,9 @@ discard block |
||
330 | 330 | // Check that we have all the required parameters and the nonce is ok. |
331 | 331 | if ($paypal_pm instanceof EE_Payment_Method |
332 | 332 | && wp_verify_nonce($data['nonce'], Domain::NONCE_NAME_ONBOARDING_RETURN) |
333 | - && ! empty($data[ Domain::API_PARAM_PARTNER_ID ]) |
|
334 | - && ! empty($data[ Domain::META_KEY_SELLER_MERCHANT_ID ]) |
|
335 | - && isset($data[ Domain::API_PARAM_EMAIL_CONFIRMED ]) |
|
333 | + && ! empty($data[Domain::API_PARAM_PARTNER_ID]) |
|
334 | + && ! empty($data[Domain::META_KEY_SELLER_MERCHANT_ID]) |
|
335 | + && isset($data[Domain::API_PARAM_EMAIL_CONFIRMED]) |
|
336 | 336 | ) { |
337 | 337 | return true; |
338 | 338 | } |
@@ -354,7 +354,7 @@ discard block |
||
354 | 354 | $access_token = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_ACCESS_TOKEN); |
355 | 355 | $expired = EED_PayPalOnboard::partnerAccessTokenExpired($paypal_pm); |
356 | 356 | // If we don't have it, request/update it. |
357 | - if (! $access_token || $expired) { |
|
357 | + if ( ! $access_token || $expired) { |
|
358 | 358 | return EED_PayPalOnboard::requestPartnerAccessToken($paypal_pm); |
359 | 359 | } |
360 | 360 | // Access token is saved as encrypted, so return decrypted. |
@@ -371,7 +371,7 @@ discard block |
||
371 | 371 | public static function partnerAccessTokenExpired(EE_Payment_Method $paypal_pm): bool |
372 | 372 | { |
373 | 373 | $expires_at = (int) PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_EXPIRES_IN); |
374 | - if (! $expires_at) { |
|
374 | + if ( ! $expires_at) { |
|
375 | 375 | return true; |
376 | 376 | } |
377 | 377 | // Validate the token expiration date. |
@@ -408,18 +408,18 @@ discard block |
||
408 | 408 | if (defined('LOCAL_MIDDLEMAN_SERVER')) { |
409 | 409 | $post_args['sslverify'] = false; |
410 | 410 | } |
411 | - $post_url = EED_PayPalOnboard::getMiddlemanBaseUrl($paypal_pm) . 'get_token'; |
|
411 | + $post_url = EED_PayPalOnboard::getMiddlemanBaseUrl($paypal_pm).'get_token'; |
|
412 | 412 | $response = EED_PayPalOnboard::sendRequest($paypal_pm, $post_url, $post_args); |
413 | 413 | if (isset($response['error'])) { |
414 | 414 | return ''; |
415 | 415 | } |
416 | 416 | // Check the data we received. |
417 | - if (! EED_PayPalOnboard::partnerTokenResponseValid($response, $paypal_pm)) { |
|
417 | + if ( ! EED_PayPalOnboard::partnerTokenResponseValid($response, $paypal_pm)) { |
|
418 | 418 | return ''; |
419 | 419 | } |
420 | 420 | // If we are here all seems to be ok. Save the token and it's data. |
421 | 421 | $saved = PayPalExtraMetaManager::savePartnerAccessToken($paypal_pm, $response); |
422 | - if (! $saved) { |
|
422 | + if ( ! $saved) { |
|
423 | 423 | return ''; |
424 | 424 | } |
425 | 425 | return $response['access_token']; |
@@ -436,7 +436,7 @@ discard block |
||
436 | 436 | public static function trackSellerOnboarding(EE_Payment_Method $paypal_pm, string $merchant_id): array |
437 | 437 | { |
438 | 438 | $track_onboarding = EED_PayPalOnboard::getTrackOnboardingApi($paypal_pm, $merchant_id); |
439 | - if (! $track_onboarding instanceof TrackSellerOnboarding) { |
|
439 | + if ( ! $track_onboarding instanceof TrackSellerOnboarding) { |
|
440 | 440 | $err_msg = esc_html__('Failed to track seller onboarding.', 'event_espresso'); |
441 | 441 | return ['error' => 'TRACK_ONBOARDING_FAILED', 'message' => $err_msg]; |
442 | 442 | } |
@@ -459,7 +459,7 @@ discard block |
||
459 | 459 | ): ?TrackSellerOnboarding { |
460 | 460 | $partner_id = PayPalExtraMetaManager::getPmOption($paypal_pm, Domain::META_KEY_PARTNER_MERCHANT_ID); |
461 | 461 | $paypal_api = EED_PayPalCommerce::getPayPalApi($paypal_pm); |
462 | - if (! $paypal_api instanceof PayPalApi || ! $partner_id) { |
|
462 | + if ( ! $paypal_api instanceof PayPalApi || ! $partner_id) { |
|
463 | 463 | return null; |
464 | 464 | } |
465 | 465 | return new TrackSellerOnboarding($paypal_api, $partner_id, $merchant_id, $paypal_pm->debug_mode()); |
@@ -475,7 +475,7 @@ discard block |
||
475 | 475 | public static function getOnboardStatus(): void |
476 | 476 | { |
477 | 477 | $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
478 | - if (! $paypal_pm instanceof EE_Payment_Method) { |
|
478 | + if ( ! $paypal_pm instanceof EE_Payment_Method) { |
|
479 | 479 | $err_msg = esc_html__('Could not specify the payment method.', 'event_espresso'); |
480 | 480 | PayPalLogger::errorLog($err_msg, EED_Module::getRequest()->postParams(), $paypal_pm); |
481 | 481 | wp_send_json(['on_board' => false]); |
@@ -503,7 +503,7 @@ discard block |
||
503 | 503 | public static function offboard(): void |
504 | 504 | { |
505 | 505 | $paypal_pm = EED_PayPalCommerce::getPaymentMethod(); |
506 | - if (! $paypal_pm instanceof EE_Payment_Method) { |
|
506 | + if ( ! $paypal_pm instanceof EE_Payment_Method) { |
|
507 | 507 | wp_send_json([ |
508 | 508 | 'error' => 'INVALID_PM', |
509 | 509 | 'message' => esc_html__( |
@@ -528,13 +528,13 @@ discard block |
||
528 | 528 | $pp_meta_data = PayPalExtraMetaManager::getAllData($payment_method); |
529 | 529 | return |
530 | 530 | // onborded with a third party integration ? |
531 | - (! empty($pp_meta_data[ Domain::META_KEY_SELLER_MERCHANT_ID ]) |
|
532 | - && ! empty($pp_meta_data[ Domain::META_KEY_ACCESS_TOKEN ]) |
|
531 | + ( ! empty($pp_meta_data[Domain::META_KEY_SELLER_MERCHANT_ID]) |
|
532 | + && ! empty($pp_meta_data[Domain::META_KEY_ACCESS_TOKEN]) |
|
533 | 533 | ) |
534 | 534 | // or with the first party integration ? |
535 | - || (! empty($pp_meta_data[ Domain::META_KEY_CLIENT_ID ]) |
|
536 | - && ! empty($pp_meta_data[ Domain::META_KEY_CLIENT_SECRET ]) |
|
537 | - && ! empty($pp_meta_data[ Domain::META_KEY_PAYER_ID ]) |
|
535 | + || ( ! empty($pp_meta_data[Domain::META_KEY_CLIENT_ID]) |
|
536 | + && ! empty($pp_meta_data[Domain::META_KEY_CLIENT_SECRET]) |
|
537 | + && ! empty($pp_meta_data[Domain::META_KEY_PAYER_ID]) |
|
538 | 538 | ); |
539 | 539 | } |
540 | 540 | |
@@ -615,8 +615,8 @@ discard block |
||
615 | 615 | // If this PM is used under different provider accounts, you might need an account indicator. |
616 | 616 | $account = defined('EE_PAYPAL_COMMERCE_ACCOUNT_INDICATOR') ? EE_PAYPAL_COMMERCE_ACCOUNT_INDICATOR : ''; |
617 | 617 | $postfix = $payment_method->debug_mode() ? '_sandbox' : ''; |
618 | - $path = 'paypal_commerce' . $account . $postfix; |
|
619 | - return 'https://connect.eventespresso.' . $target . '/' . $path . '/'; |
|
618 | + $path = 'paypal_commerce'.$account.$postfix; |
|
619 | + return 'https://connect.eventespresso.'.$target.'/'.$path.'/'; |
|
620 | 620 | } |
621 | 621 | |
622 | 622 | |
@@ -632,7 +632,7 @@ discard block |
||
632 | 632 | // A notice to re-connect if still connected through the first party integration. |
633 | 633 | $pp_commerce = EEM_Payment_Method::instance()->get_one_by_slug('paypalcheckout'); |
634 | 634 | // Show the notice only if PayPal Commerce is active. |
635 | - if (! $pp_commerce instanceof EE_Payment_Method |
|
635 | + if ( ! $pp_commerce instanceof EE_Payment_Method |
|
636 | 636 | || ! EED_PayPalOnboard::isOnboard($pp_commerce) |
637 | 637 | || EED_PayPalCommerce::isThirdParty($pp_commerce) |
638 | 638 | ) { |