Changeset 3336019
- Timestamp:
- 07/29/2025 02:07:42 PM (8 months ago)
- Location:
- ecommpay-payments/trunk
- Files:
-
- 3 added
- 6 deleted
- 23 edited
-
assets/css/woocommerce-ecommpay-admin.css (modified) (1 diff)
-
assets/img/giropay.svg (deleted)
-
assets/img/humm.svg (added)
-
assets/img/sofort.svg (deleted)
-
common/EcpCore.php (modified) (7 diffs)
-
common/__autoload.php (modified) (2 diffs)
-
common/api/EcpGatewayAPI.php (modified) (3 diffs)
-
common/api/EcpGatewayAPIPayment.php (modified) (9 diffs)
-
common/api/EcpGatewayAPISubscription.php (modified) (8 diffs)
-
common/gateways/EcpGiropay.php (deleted)
-
common/gateways/EcpHumm.php (added)
-
common/gateways/EcpSofort.php (deleted)
-
common/helpers/EcpGatewayAPIProtocol.php (modified) (8 diffs)
-
common/includes/EcpCallbacksHandler.php (modified) (2 diffs)
-
common/includes/EcpGatewayPayment.php (modified) (1 diff)
-
common/includes/filters/EcpApiFilters.php (modified) (2 diffs)
-
common/includes/filters/EcpAppendsFilters.php (modified) (4 diffs)
-
common/includes/filters/EcpFilters.php (modified) (1 diff)
-
common/includes/filters/EcpWCFilters.php (modified) (1 diff)
-
common/modules/EcpModuleAdminUI.php (modified) (3 diffs)
-
common/modules/EcpModuleCancel.php (modified) (2 diffs)
-
common/modules/EcpModulePaymentPage.php (modified) (1 diff)
-
common/settings/EcpSettingsGeneral.php (modified) (1 diff)
-
common/settings/EcpSettingsGiropay.php (deleted)
-
common/settings/EcpSettingsHumm.php (added)
-
common/settings/EcpSettingsSofort.php (deleted)
-
common/settings/forms/EcpTabManager.php (modified) (3 diffs)
-
gateway-ecommpay.php (modified) (1 diff)
-
helpers/ecp-helper.php (modified) (2 diffs)
-
helpers/ecp-payment.php (modified) (2 diffs)
-
helpers/ecp-woo-blocks-support.php (modified) (5 diffs)
-
readme.txt (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ecommpay-payments/trunk/assets/css/woocommerce-ecommpay-admin.css
r3218798 r3336019 106 106 .ecp-pm-logo { 107 107 max-height: 2.2em; 108 max-width: 7em; 108 109 } 109 110 -
ecommpay-payments/trunk/common/EcpCore.php
r3316762 r3336019 13 13 use common\gateways\EcpDirectDebitSEPA; 14 14 use common\gateways\EcpGateway; 15 use common\gateways\EcpGiropay;16 15 use common\gateways\EcpGooglepay; 16 use common\gateways\EcpHumm; 17 17 use common\gateways\EcpIdeal; 18 18 use common\gateways\EcpKlarna; … … 20 20 use common\gateways\EcpPayPal; 21 21 use common\gateways\EcpPayPalPayLater; 22 use common\gateways\EcpSofort;23 22 use common\helpers\EcpGatewayAPIProtocol; 24 23 use common\includes\EcpCallbacksHandler; … … 43 42 use common\settings\EcpSettingsDirectDebitSEPA; 44 43 use common\settings\EcpSettingsGeneral; 45 use common\settings\EcpSettingsGiropay;46 44 use common\settings\EcpSettingsGooglepay; 45 use common\settings\EcpSettingsHumm; 47 46 use common\settings\EcpSettingsIdeal; 48 47 use common\settings\EcpSettingsKlarna; … … 50 49 use common\settings\EcpSettingsPayPal; 51 50 use common\settings\EcpSettingsPayPalPayLater; 52 use common\settings\EcpSettingsSofort;53 51 use common\settings\forms\EcpForm; 54 52 use WC_Settings_API; … … 63 61 * @since 2.0.0 64 62 */ 65 public const WC_ECP_VERSION = '4. 1.1';63 public const WC_ECP_VERSION = '4.2.0'; 66 64 67 65 public const ECOMMPAY_PAYMENT_METHOD = 'ecommpay'; … … 101 99 EcpPayPal::class, 102 100 EcpPayPalPayLater::class, 103 EcpSofort::class,104 101 EcpIdeal::class, 105 102 EcpKlarna::class, 106 103 EcpBlik::class, 107 Ecp Giropay::class,104 EcpHumm::class, 108 105 EcpBrazilOnlineBanks::class, 109 106 EcpMore::class, … … 179 176 EcpSettingsPayPalPayLater::ID => EcpPayPalPayLater::get_instance(), 180 177 EcpSettingsKlarna::ID => EcpKlarna::get_instance(), 181 EcpSettingsSofort::ID => EcpSofort::get_instance(),182 178 EcpSettingsBlik::ID => EcpBlik::get_instance(), 183 179 EcpSettingsIdeal::ID => EcpIdeal::get_instance(), 184 180 EcpSettingsBanks::ID => EcpBanks::get_instance(), 185 EcpSettings Giropay::ID => EcpGiropay::get_instance(),181 EcpSettingsHumm::ID => EcpHumm::get_instance(), 186 182 EcpSettingsBrazilOnline_Banks::ID => EcpBrazilOnlineBanks::get_instance(), 187 183 EcpSettingsGooglepay::ID => EcpGooglepay::get_instance(), -
ecommpay-payments/trunk/common/__autoload.php
r3218798 r3336019 102 102 require_once __DIR__ . '/settings/EcpSettingsPayPalPayLater.php'; 103 103 require_once __DIR__ . '/settings/EcpSettingsKlarna.php'; 104 require_once __DIR__ . '/settings/EcpSettingsGiropay.php';105 require_once __DIR__ . '/settings/EcpSettingsSofort.php';106 104 require_once __DIR__ . '/settings/EcpSettingsBlik.php'; 107 105 require_once __DIR__ . '/settings/EcpSettingsIdeal.php'; 108 106 require_once __DIR__ . '/settings/EcpSettingsBanks.php'; 107 require_once __DIR__ . '/settings/EcpSettingsHumm.php'; 109 108 require_once __DIR__ . '/settings/EcpSettingsApplepay.php'; 110 109 require_once __DIR__ . '/settings/EcpSettingsMore.php'; … … 129 128 require_once __DIR__ . '/gateways/EcpPayPalPayLater.php'; 130 129 require_once __DIR__ . '/gateways/EcpKlarna.php'; 131 require_once __DIR__ . '/gateways/EcpGiropay.php';132 require_once __DIR__ . '/gateways/EcpSofort.php';133 130 require_once __DIR__ . '/gateways/EcpBlik.php'; 134 131 require_once __DIR__ . '/gateways/EcpIdeal.php'; 135 132 require_once __DIR__ . '/gateways/EcpBanks.php'; 133 require_once __DIR__ . '/gateways/EcpHumm.php'; 136 134 require_once __DIR__ . '/gateways/EcpGooglepay.php'; 137 135 require_once __DIR__ . '/gateways/EcpApplepay.php'; -
ecommpay-payments/trunk/common/api/EcpGatewayAPI.php
r3218798 r3336019 3 3 namespace common\api; 4 4 5 use WC_Abstract_Order; 5 6 use common\EcpCore; 6 7 use common\models\EcpGatewayInfoError; 7 8 use common\models\EcpGatewayInfoStatus; 8 use common\modules\EcpSigner;9 9 10 10 defined( 'ABSPATH' ) || exit; … … 45 45 private const VERSION = 'v2'; 46 46 47 protected const MERCHANT_DESTINATION = 'merchant';48 47 49 48 protected const STATUS_API_ENDPOINT = 'status'; … … 280 279 } 281 280 282 /** 283 * <h2>Returns form data with general section.</h2> 284 * 285 * @param array $data <p>Order object or request identifier.</p> 286 * 287 * @return array 288 * @since 3.0.0 289 */ 290 protected function create_general_section( array $data ): array { 281 protected function build_general_api_block(string $payment_id ): array { 291 282 return [ 292 EcpSigner::GENERAL => $data 283 'general' => [ 284 'payment_id' => $payment_id, 285 'project_id' => ecommpay()->get_project_id(), 286 'merchant_callback_url' => ecp_callback_url() 287 ], 288 'interface_type' => ecommpay()->get_interface_type() 293 289 ]; 294 290 } 295 291 296 protected function get_general_data( $order ): array { 297 return [ 298 EcpSigner::GENERAL => apply_filters( 299 'ecp_append_merchant_callback_url', 300 apply_filters( 'ecp_create_general_data', $order ) 301 ) 292 protected function build_general_api_block_with_payment(string $payment_id, WC_Abstract_Order $order): array { 293 $api_data = $this->build_general_api_block($payment_id); 294 $api_data['payment'] = [ 295 'amount' => ecp_price_multiply( abs( $order->get_total() ), $order->get_currency() ), 296 'currency' => $order->get_currency(), 302 297 ]; 303 } 304 305 298 return $api_data; 299 } 306 300 } -
ecommpay-payments/trunk/common/api/EcpGatewayAPIPayment.php
r3267715 r3336019 12 12 use common\settings\EcpSettingsApplepay; 13 13 use common\settings\EcpSettingsCard; 14 use common\settings\EcpSettingsGeneral;15 14 use common\settings\EcpSettingsGooglepay; 16 15 … … 61 60 } 62 61 63 // Run request64 62 $response = new EcpGatewayInfoStatus( 65 63 $this->post( 66 64 self::STATUS_API_ENDPOINT, 67 apply_filters( EcpAppendsFilters::ECP_APPEND_SIGNATURE, $this->create_status_request_form_data( $order ) ) 65 apply_filters( 66 EcpAppendsFilters::ECP_APPEND_SIGNATURE, 67 $this->build_general_api_block($order->get_payment_id()) 68 ) 68 69 ) 69 70 ); … … 72 73 73 74 return $response; 74 }75 76 /**77 * <h2>Returns the underlying form data for the status request.</h2>78 *79 * @param EcpGatewayOrder $order <p>Order with payment.</p>80 *81 * @return array[] <p>Basic form-data.</p>82 * @since 3.0.083 */84 private function create_status_request_form_data( EcpGatewayOrder $order ): array {85 ecp_get_log()->info( __( 'Create form data for status request.', 'woo-ecommpay' ) );86 $data = $this->create_general_section(87 apply_filters(88 'ecp_append_merchant_callback_url',89 apply_filters( 'ecp_create_general_data', $order )90 )91 );92 $data['destination'] = self::MERCHANT_DESTINATION;93 94 return $data;95 75 } 96 76 … … 108 88 ecp_debug( ecpTr( 'Order ID:' ), $order->get_id() ); 109 89 110 // Create form data111 $data = $this->create_refund_request_form_data( $refund, $order );112 113 /** @var array $variables */114 $variables = ecommpay()->get_general_option( EcpSettingsGeneral::OPTION_CUSTOM_VARIABLES, [] );115 116 if ( array_search( EcpSettingsGeneral::CUSTOM_RECEIPT_DATA, $variables, true ) ) {117 // Append receipt data118 $data = apply_filters( 'ecp_append_receipt_data', $data, $refund );119 }120 121 // Run request122 90 $response = $this->post( 123 91 sprintf( … … 126 94 'refund' 127 95 ), 128 apply_filters( EcpAppendsFilters::ECP_APPEND_SIGNATURE, $data ) 96 apply_filters( 97 EcpAppendsFilters::ECP_APPEND_SIGNATURE, 98 $this->create_refund_request_form_data( $refund ) 99 ) 129 100 ); 130 101 … … 145 116 * @since 3.0.0 146 117 */ 147 final public function create_refund_request_form_data( EcpGatewayRefund $refund, EcpGatewayOrder $order ): array { 148 ecp_get_log()->info( __( 'Create form data for refund request.', 'woo-ecommpay' ) ); 149 $data = $this->create_general_section( 150 apply_filters( 151 'ecp_append_merchant_callback_url', 152 apply_filters( 'ecp_create_payment_data', $refund ) 153 ) 154 ); 155 $data = apply_filters( 'ecp_append_payment_section', $data, $refund ); 156 157 return apply_filters( 'ecp_append_interface_type', $data ); 118 final public function create_refund_request_form_data( EcpGatewayRefund $refund ): array { 119 $api_data = $this->build_general_api_block_with_payment($refund->get_order()->get_payment_id(), $refund); 120 $api_data['payment']['description'] = $refund->get_reason() ? : sprintf( 'User %s create refund', wp_get_current_user()->ID ); 121 $api_data['payment']['merchant_refund_id'] = $refund->get_payment_id(); 122 return $api_data; 158 123 } 159 124 … … 161 126 ecp_info( 'Run cancel payment API process.' ); 162 127 ecp_debug( 'Order ID: ', $order->get_id() ); 163 $data = $this->create_general_request_form_data($order );128 $data = $this->build_general_api_block_with_payment( $order->get_payment_id(), $order ); 164 129 $url = $this->getMethodEndpoint( $order->get_payment_method(), EcpGatewayAPI::CANCEL_ENDPOINT ); 165 130 $response = $this->post( $url, apply_filters( EcpAppendsFilters::ECP_APPEND_SIGNATURE, $data ) ); … … 169 134 170 135 return $response; 171 }172 173 final public function create_general_request_form_data( EcpGatewayOrder $order ): array {174 ecp_get_log()->info( __( 'Create general form data for request.', 'woo-ecommpay' ) );175 $data = $this->create_general_section(176 apply_filters(177 'ecp_append_merchant_callback_url',178 apply_filters( 'ecp_create_payment_data', $order )179 )180 );181 $data = apply_filters( 'ecp_append_payment_section', $data, $order );182 183 return apply_filters( 'ecp_append_interface_type', $data );184 136 } 185 137 … … 205 157 ecp_info( 'Run capture payment API process.' ); 206 158 ecp_debug( 'Order ID: ' . $order->get_id() ); 207 $data = $this->create_general_request_form_data($order );159 $data = $this->build_general_api_block_with_payment( $order->get_payment_id(), $order ); 208 160 $url = $this->getMethodEndpoint( $order->get_payment_method(), EcpGatewayAPI::CAPTURE_ENDPOINT ); 209 161 $response = $this->post( $url, apply_filters( EcpAppendsFilters::ECP_APPEND_SIGNATURE, $data ) ); -
ecommpay-payments/trunk/common/api/EcpGatewayAPISubscription.php
r3267715 r3336019 6 6 use common\helpers\EcpGatewayPaymentMethods; 7 7 use common\includes\EcpGatewayOrder; 8 use common\includes\filters\EcpApiFilters;9 8 use common\includes\filters\EcpAppendsFilters; 10 use common\includes\filters\EcpFilters;11 9 use common\models\EcpGatewayInfoResponse; 12 10 use WC_Subscriptions_Order; … … 23 21 */ 24 22 class EcpGatewayAPISubscription extends EcpGatewayAPI { 23 private const STATUS_REQUEST_API_ENDPOINT = 'status/request'; 25 24 26 25 /** … … 61 60 } 62 61 63 // Check if a custom amount has been set64 62 if ( $amount === null ) { 65 // No custom amount set. Default to the order total66 63 $amount = WC_Subscriptions_Order::get_recurring_total( $order ); 67 64 } … … 77 74 ecp_get_log()->debug( __( 'Payment method:', 'woo-ecommpay' ), $payment_method ); 78 75 79 // Create form data 80 $data = apply_filters( EcpApiFilters::ECP_API_RECURRING_FORM_DATA, $subscription_id, $order ); 76 $data = $this->create_recurring_request_form_data($subscription_id, $order); 81 77 82 // Run request83 78 $response = new EcpGatewayInfoResponse( 84 79 $this->post( … … 105 100 ecp_get_log()->debug( __( 'Request ID:', 'woo-ecommpay' ), $request_id ); 106 101 107 // Create form data 108 $data = apply_filters( EcpFilters::ECP_CREATE_GENERAL_DATA, $request_id ); 109 110 // Run request 111 $response = new EcpGatewayInfoResponse( 112 $this->post( 113 'status/request', 114 apply_filters( EcpAppendsFilters::ECP_APPEND_SIGNATURE, $data ) 102 $data = apply_filters( 103 EcpAppendsFilters::ECP_APPEND_SIGNATURE, 104 apply_filters( 105 EcpAppendsFilters::ECP_APPEND_PROJECT_ID, 106 ['request_id' => $request_id] 115 107 ) 116 108 ); 109 110 $response = new EcpGatewayInfoResponse($this->post(self::STATUS_REQUEST_API_ENDPOINT, $data)); 117 111 118 112 ecp_get_log()->info( __( 'Check transaction status process completed.', 'woo-ecommpay' ) ); … … 136 130 ecp_get_log()->debug( __( 'Payment status:', 'woo-ecommpay' ), $order->get_ecp_status() ); 137 131 132 //that is the mock 138 133 return true; 139 134 } … … 151 146 ecp_get_log()->info( __( 'Create form data for recurring request.', 'woo-ecommpay' ) ); 152 147 153 $data = $this->create_general_section( 154 apply_filters( 155 EcpAppendsFilters::ECP_APPEND_MERCHANT_CALLBACK_URL, 156 apply_filters( EcpFilters::ECP_CREATE_GENERAL_DATA, $order ) 157 ) 158 ); 159 $data = apply_filters( EcpApiFilters::ECP_API_APPEND_RECURRING_DATA, $data, $subscription_id ); 160 $data = apply_filters( EcpAppendsFilters::ECP_APPEND_PAYMENT_SECTION, $data, $order ); 148 $data = $this->build_general_api_block_with_payment($order->get_payment_id(), $order); 149 $data['recurring'] = ['id' => $subscription_id]; 150 $data['recurring_id'] = $subscription_id; 161 151 162 152 $ip_address = $order->get_ecp_meta( '_customer_ip_address' ); … … 166 156 ]; 167 157 168 return apply_filters( EcpAppendsFilters::ECP_APPEND_INTERFACE_TYPE, $data );169 }170 171 /**172 * <h2>Returns the underlying form data for the recurring cancel request.</h2>173 *174 * @param int $subscription_id <p>ECOMMPAY recurring identifier.</p>175 * @param EcpGatewayOrder $order <p>Renewal subscription order.</p>176 *177 * @return array <p>Form data for the cancel recurring request.</p>178 * @since 2.0.0179 */180 final public function create_cancel_request_form_data( int $subscription_id, EcpGatewayOrder $order ): array {181 ecp_get_log()->info( __( 'Create form data for recurring cancel request.', 'woo-ecommpay' ) );182 183 return apply_filters(184 EcpAppendsFilters::ECP_APPEND_INTERFACE_TYPE,185 $this->create_general_section(186 apply_filters(187 EcpApiFilters::ECP_API_APPEND_RECURRING_DATA,188 apply_filters(189 EcpAppendsFilters::ECP_APPEND_MERCHANT_CALLBACK_URL,190 apply_filters( EcpFilters::ECP_CREATE_GENERAL_DATA, $order )191 ),192 $subscription_id193 )194 )195 );196 }197 198 /**199 * <h2>Append recurring information to the form data.</h2>200 *201 * @param array $data <p>Form data as array.</p>202 * @param string $subscription_id <p>Identifier of the subscription.</p>203 *204 * @return array <p>Form data with recurring information.</p>205 * @since 3.0.0206 */207 public function append_recurring_data( array $data, int $subscription_id ): array {208 $data['recurring'] = [ 'id' => $subscription_id ];209 $data['recurring_id'] = $subscription_id;210 211 158 return $data; 212 159 } 213 214 /**215 * @inheritDoc216 * @return void217 * @since 2.0.0218 */219 protected function hooks(): void {220 parent::hooks();221 222 add_filter( EcpApiFilters::ECP_API_RECURRING_FORM_DATA, [223 $this,224 'create_recurring_request_form_data'225 ], 10, 2 );226 add_filter( EcpApiFilters::ECP_API_APPEND_RECURRING_DATA, [ $this, 'append_recurring_data' ], 10, 2 );227 add_filter( EcpApiFilters::ECP_API_RECURRING_CANCEL_FORM_DATA, [228 $this,229 'create_cancel_request_form_data'230 ], 10, 2 );231 }232 160 } -
ecommpay-payments/trunk/common/helpers/EcpGatewayAPIProtocol.php
r3267715 r3336019 6 6 use common\exceptions\EcpGatewaySignatureException; 7 7 use common\includes\EcpGatewayOrder; 8 use common\includes\EcpGatewayRefund;9 8 use common\includes\filters\EcpAppendsFilters; 10 9 use common\includes\filters\EcpFilters; … … 17 16 18 17 class EcpGatewayAPIProtocol extends EcpGatewayRegistry { 19 20 /**21 * @param EcpGatewayOrder|EcpGatewayRefund $order22 *23 * @return array24 */25 public function create_payment_data( $order ): array {26 $data = apply_filters( 'ecp_append_project_id', [] );27 28 if ( $order instanceof EcpGatewayOrder ) {29 // Identifier of the payment, must be unique within the project.30 $this->append_argument( 'payment_id', $order->create_payment_id(), $data );31 } else if ( $order instanceof EcpGatewayRefund ) {32 // Identifier of the payment, must be unique within the project.33 $this->append_argument( 'payment_id', $order->get_order()->get_payment_id(), $data );34 }35 36 return $data;37 }38 39 18 /** 40 19 * @param string $key … … 50 29 51 30 $values[ $key ] = $value; 52 }53 54 public function create_general_info( $order ) {55 $data = apply_filters( 'ecp_append_project_id', [] );56 57 switch ( true ) {58 case is_string( $order ):59 // Identifier of the request from ECOMMPAY payment platform.60 $this->append_argument( 'request_id', $order, $data );61 break;62 case $order instanceof EcpGatewayRefund:63 // Identifier of the payment, must be unique within the project.64 $this->append_argument( 'payment_id', $order->get_order()->get_payment_id(), $data );65 break;66 case $order instanceof EcpGatewayOrder:67 // Identifier of the payment, must be unique within the project.68 $this->append_argument( 'payment_id', $order->get_payment_id(), $data );69 break;70 }71 72 return $data;73 }74 75 public function append_payment_section( $data, $order ) {76 $this->append_argument( 'payment', $this->create_payment_info( $order ), $data );77 78 return $data;79 }80 81 public function create_payment_info( $order ): array {82 $payment = [];83 84 $this->append_argument(85 'amount',86 ecp_price_multiply( abs( $order->get_total() ), $order->get_currency() ),87 $payment88 );89 $this->append_argument( 'currency', $order->get_currency(), $payment );90 91 if ( $order instanceof EcpGatewayRefund ) {92 // Refund comment. REQUIRED!!!93 $this->append_argument(94 'description',95 (string) $order->get_reason() !== ''96 ? $order->get_reason()97 : sprintf( 'User %s create refund', wp_get_current_user()->ID ),98 $payment99 );100 // Refund ECOMMPAY identifier in WooCommerce.101 $this->append_argument( 'merchant_refund_id', $order->get_payment_id(), $payment );102 }103 104 return $payment;105 31 } 106 32 … … 412 338 'billing_postal', 413 339 wc_format_postcode( $order->get_billing_postcode(), $order->get_billing_country() ), 414 $values415 );416 417 return $values;418 }419 420 /**421 * @param EcpGatewayOrder $order422 * @param array $values423 *424 * @return array425 * @since 3.0.0426 */427 public function append_billing_region( array $values, EcpGatewayOrder $order ): array {428 $this->append_argument( 'billing_region', $order->get_billing_state(), $values );429 430 return $values;431 }432 433 434 /**435 * @param EcpGatewayOrder $order436 * @param array $values437 *438 * @return array439 * @since 3.0.0440 */441 public function append_billing_region_code( array $values, EcpGatewayOrder $order ): array {442 $this->append_argument(443 'billing_region_code',444 ecp_region_code( $order->get_billing_country(), $order->get_billing_state() ),445 340 $values 446 341 ); … … 867 762 868 763 /** 869 * <h2>Appends shipping information.</h2>870 *871 * @param EcpGatewayOrder $order <p>Order object.</p>872 * @param array $values <p>Base array for appending data</p>873 *874 * @return array Result of appending data as new array.875 */876 public function filter_shipping_data( EcpGatewayOrder $order, array $values ): array {877 if ( ! $order->needs_shipping_address() ) {878 return $values;879 }880 881 $shipping_args = [882 'type' => $order->get_shipping_type(),883 'delivery_email' => $this->limit_length( $order->get_billing_email(), 255 ),884 'city' => $this->limit_length( $order->get_shipping_city(), 50 ),885 'country' => $order->get_shipping_country(),886 'address' => $this->limit_length( $order->get_shipping_address(), 150 ),887 'postal' => wc_format_postcode( $order->get_shipping_postcode(), $order->get_shipping_country() ),888 'region_code' => ecp_region_code( $order->get_shipping_country(), $order->get_shipping_state() ),889 'name_indicator' => $order->get_shipping_name_indicator(),890 ];891 892 apply_filters( EcpFilters::ECP_PAYMENT_PAGE_CLEAN_PARAMETERS, $shipping_args );893 894 if ( count( $shipping_args ) <= 0 ) {895 return $values;896 }897 898 $values['customer_shipping'] = base64_encode( json_encode( [ 'customer' => [ 'shipping' => $shipping_args ] ] ) );899 900 return $values;901 }902 903 public function filter_cash_voucher_data( $values, $order ) {904 return $values;905 }906 907 /**908 764 * @inheritDoc 909 765 * @return void 910 766 */ 911 767 protected function init(): void { 912 add_filter( EcpFilters::ECP_CREATE_GENERAL_DATA_FILTER, [ $this, 'create_general_info' ] );913 add_filter( EcpFilters::ECP_CREATE_PAYMENT_DATA, [ $this, 'create_payment_data' ] );914 add_filter( EcpFilters::ECP_CREATE_PAYMENT_INFO, [ $this, 'create_payment_info' ] );915 916 768 // register filters for appending payment arguments 917 769 add_filter( EcpAppendsFilters::ECP_APPEND_PROJECT_ID, [ $this, 'append_project_id' ] ); … … 924 776 add_filter( EcpAppendsFilters::ECP_APPEND_FORCE_MODE, [ $this, 'append_force_mode' ], 10, 2 ); 925 777 add_filter( EcpAppendsFilters::ECP_APPEND_DISPLAY_MODE, [ $this, 'append_display_mode' ], 10, 3 ); 926 add_filter( EcpAppendsFilters::ECP_APPEND_PAYMENT_SECTION, [ $this, 'append_payment_section' ], 10, 2 );927 778 add_filter( EcpAppendsFilters::ECP_APPEND_LANGUAGE_CODE, [ $this, 'append_language' ] ); 928 779 add_filter( EcpAppendsFilters::ECP_APPEND_MERCHANT_SUCCESS_URL, [ … … 969 820 add_filter( EcpAppendsFilters::ECP_APPEND_BILLING_COUNTRY, [ $this, 'append_billing_country' ], 10, 2 ); 970 821 add_filter( EcpAppendsFilters::ECP_APPEND_BILLING_POSTAL, [ $this, 'append_billing_postal' ], 10, 2 ); 971 add_filter( EcpAppendsFilters::ECP_APPEND_BILLING_REGION, [ $this, 'append_billing_region' ], 10, 2 );972 add_filter( EcpAppendsFilters::ECP_APPEND_BILLING_REGION_CODE, [973 $this,974 'append_billing_region_code'975 ], 10, 2 );976 822 add_filter( EcpAppendsFilters::ECP_APPEND_ADDITIONAL_VARIABLES, [ 977 823 $this, … … 980 826 add_filter( EcpFilters::ECP_PAYMENT_PAGE_CLEAN_PARAMETERS, [ $this, 'filter_clean' ] ); 981 827 add_filter( EcpAppendsFilters::ECP_APPEND_RECURRING, [ $this, 'append_recurring' ], 10, 2 ); 982 add_filter( EcpAppendsFilters::ECP_APPEND_SHIPPING_DATA, [ $this, 'filter_shipping_data' ], 10, 2 );983 828 add_filter( EcpAppendsFilters::ECP_APPEND_RECEIPT_DATA, [ $this, 'filter_receipt_data' ], 10, 3 ); 984 add_filter( EcpAppendsFilters::ECP_APPEND_CASH_VOUCHER_DATA, [ $this, 'filter_cash_voucher_data' ], 10, 2 );985 829 add_filter( EcpAppendsFilters::ECP_APPEND_VERSIONS, [ $this, 'append_versions' ] ); 986 830 add_filter( EcpAppendsFilters::ECP_APPEND_SIGNATURE, [ $this, 'append_signature' ] ); -
ecommpay-payments/trunk/common/includes/EcpCallbacksHandler.php
r3267715 r3336019 135 135 $order = ecp_get_order( $order_number ); 136 136 137 $last_payment_id = $order->get_payment_id();138 139 if ( $payment_id !== $last_payment_id ) {140 $message = sprintf('Order with payment id %s found but it already has a new payment id %s', $payment_id, $last_payment_id);141 ecp_get_log()->info( __( $message, 'woo-ecommpay' ) );142 http_response_code( 200 );143 die ( $message );144 }145 146 137 if ( ! $order ) { 147 138 // Print debug information to logs … … 160 151 161 152 http_response_code( 404 ); 153 die ( $message ); 154 } 155 156 $last_payment_id = $order->get_payment_id(); 157 158 if ( $payment_id !== $last_payment_id ) { 159 $message = sprintf('Order with payment id %s found but it already has a new payment id %s', $payment_id, $last_payment_id); 160 ecp_get_log()->info( __( $message, 'woo-ecommpay' ) ); 161 http_response_code( 200 ); 162 162 die ( $message ); 163 163 } -
ecommpay-payments/trunk/common/includes/EcpGatewayPayment.php
r3218798 r3336019 85 85 * @var EcpGatewayInfoPayment 86 86 */ 87 private EcpGatewayInfoPayment $info;87 private ?EcpGatewayInfoPayment $info = null; 88 88 89 89 -
ecommpay-payments/trunk/common/includes/filters/EcpApiFilters.php
r3267715 r3336019 8 8 public const WP_AJAX_CHECK_CART_AMOUNT = 'wp_ajax_check_cart_amount'; 9 9 public const WP_AJAX_ECOMMPAY_PROCESS = 'wp_ajax_ecommpay_process'; 10 public const ECP_API_RECURRING_CANCEL_FORM_DATA = 'ecp_api_recurring_cancel_form_data';11 10 public const WP_AJAX_NOPRIV_ECOMMPAY_BREAK = 'wp_ajax_nopriv_ecommpay_break'; 12 11 public const WP_AJAX_NOPRIV_GET_DATA_FOR_PAYMENT_FORM = 'wp_ajax_nopriv_get_data_for_payment_form'; 13 12 public const WP_AJAX_GET_PAYMENT_STATUS = 'wp_ajax_get_payment_status'; 14 public const ECP_API_RECURRING_FORM_DATA = 'ecp_api_recurring_form_data';15 13 public const WP_AJAX_ECOMMPAY_BREAK = 'wp_ajax_ecommpay_break'; 16 14 public const ECP_API_REFUND_ENDPOINT_PREFIX = 'ecp_api_refund_endpoint_'; … … 18 16 public const WP_AJAX_NOPRIV_ECOMMPAY_PROCESS = 'wp_ajax_nopriv_ecommpay_process'; 19 17 public const WP_AJAX_ADD_PAYMENT_ID_TO_ORDER = 'wp_ajax_add_payment_id_to_order'; 20 public const ECP_API_APPEND_RECURRING_DATA = 'ecp_api_append_recurring_data';21 18 public const WP_AJAX_NOPRIV_CHECK_CART_AMOUNT = 'wp_ajax_nopriv_check_cart_amount'; 22 19 public const WP_AJAX_NOPRIV_ADD_PAYMENT_ID_TO_ORDER = 'wp_ajax_nopriv_add_payment_id_to_order'; 20 public const WP_AJAX_ECP_PROCESS_CANCEL_ORDER = 'wp_ajax_ecp_process_cancel_order'; 23 21 } -
ecommpay-payments/trunk/common/includes/filters/EcpAppendsFilters.php
r3267715 r3336019 7 7 public const ECP_APPEND_INTERFACE_TYPE = 'ecp_append_interface_type'; 8 8 public const ECP_APPEND_MERCHANT_RETURN_URL = 'ecp_append_merchant_return_url'; 9 public const ECP_APPEND_PAYMENT_SECTION = 'ecp_append_payment_section';10 9 public const ECP_APPEND_MERCHANT_SUCCESS_URL = 'ecp_append_merchant_success_url'; 11 10 public const ECP_APPEND_REDIRECT_SUCCESS_URL = 'ecp_append_redirect_success_url'; … … 20 19 public const ECP_APPEND_CUSTOMER_ADDRESS = 'ecp_append_customer_address'; 21 20 public const ECP_APPEND_BILLING_POSTAL = 'ecp_append_billing_postal'; 22 public const ECP_APPEND_BILLING_REGION = 'ecp_append_billing_region';23 21 public const ECP_APPEND_GATEWAY_ARGUMENTS = 'ecp_append_gateway_arguments_'; 24 22 public const ECP_APPEND_AVS_STREET_ADDRESS = 'ecp_append_avs_street_address'; … … 28 26 public const ECP_APPEND_ADDITIONAL_VARIABLES = 'ecp_append_additional_variables'; 29 27 public const ECP_APPEND_CUSTOMER_FIRST_NAME = 'ecp_append_customer_first_name'; 30 public const ECP_APPEND_CASH_VOUCHER_DATA = 'ecp_append_cash_voucher_data';31 28 public const ECP_APPEND_CUSTOMER_DATA = 'ecp_append_customer_data'; 32 29 public const ECP_APPEND_CUSTOMER_COUNTRY = 'ecp_append_customer_country'; … … 40 37 public const ECP_APPEND_CUSTOMER_LAST_NAME = 'ecp_append_customer_last_name'; 41 38 public const ECP_APPEND_CUSTOMER_ZIP = 'ecp_append_customer_zip'; 42 public const ECP_APPEND_SHIPPING_DATA = 'ecp_append_shipping_data';43 public const ECP_APPEND_BILLING_REGION_CODE = 'ecp_append_billing_region_code';44 39 public const ECP_APPEND_CUSTOMER_EMAIL = 'ecp_append_customer_email'; 45 40 public const ECP_APPEND_AVS_POST_CODE = 'ecp_append_avs_post_code'; -
ecommpay-payments/trunk/common/includes/filters/EcpFilters.php
r3267715 r3336019 7 7 public const FILTER_ACTION_LINKS = 'plugin_action_links_plugin-ecommpay/gateway-ecommpay.php'; 8 8 public const ECP_FIELD_NORMALISATION = 'ecp_field_normalisation'; 9 public const ECP_CREATE_GENERAL_DATA = 'ecp_create_general_data';10 9 public const ECP_PREFIX_GET_SETTINGS = 'ecp_get_settings_'; 11 public const ECP_CREATE_PAYMENT_DATA = 'ecp_create_payment_data';12 public const ECP_CREATE_PAYMENT_INFO = 'ecp_create_payment_info';13 public const ECP_CREATE_GENERAL_DATA_FILTER = 'ecp_create_general_data';14 10 public const ECP_APPEND_CUSTOMER_CITY = 'ecp_append_customer_city'; 15 11 public const ECP_PAYMENT_PAGE_CLEAN_PARAMETERS = 'ecp_payment_page_clean_parameters'; 16 12 public const ECP_APPEND_BILLING_ADDRESS = 'ecp_append_billing_address'; 17 public const ECP_PAYMENT_STATUSES = 'ecp_payment_statuses';18 13 } -
ecommpay-payments/trunk/common/includes/filters/EcpWCFilters.php
r3267715 r3336019 17 17 public const WOOCOMMERCE_ORDER_CLASS = 'woocommerce_order_class'; 18 18 public const WOOCOMMERCE_ECOMMPAY_CAN_USER_EMPTY_LOGS = 'woocommerce_ecommpay_can_user_empty_logs'; 19 public const WOOCOMMERCE_ORDER_STATUS_CANCELLED = 'woocommerce_order_status_cancelled'; 19 20 } -
ecommpay-payments/trunk/common/modules/EcpModuleAdminUI.php
r3218798 r3336019 542 542 global $wpdb; 543 543 544 $statuses = $wpdb->get_col( "SELECT DISTINCT {$wpdb->prefix}wc_orders_meta.meta_value 545 FROM {$wpdb->prefix}wc_orders_meta 546 WHERE {$wpdb->prefix}wc_orders_meta.meta_key = '_payment_status'" 547 ); 544 if ( ecp_HPOS_enabled() ) { 545 $statuses = $wpdb->get_col( 546 "SELECT DISTINCT {$wpdb->prefix}wc_orders_meta.meta_value 547 FROM {$wpdb->prefix}wc_orders_meta 548 WHERE {$wpdb->prefix}wc_orders_meta.meta_key = '_payment_status'" 549 ); 550 } else { 551 $statuses = $wpdb->get_col( 552 "SELECT DISTINCT meta_value 553 FROM {$wpdb->postmeta} 554 WHERE meta_key = '_payment_status'" 555 ); 556 } 548 557 549 558 if ( empty( $statuses ) ) { … … 551 560 } 552 561 553 554 $statuses = array_combine($statuses,562 $statuses = array_combine( 563 $statuses, 555 564 array_map( 556 565 function ( $status ) { … … 566 575 567 576 ecp_get_view( 568 'admin/sections/html-filter.php', [ 'statuses' => $statuses, 'selected_value' => $selected_value ] 577 'admin/sections/html-filter.php', [ 578 'statuses' => $statuses, 579 'selected_value' => $selected_value 580 ] 569 581 ); 570 582 } -
ecommpay-payments/trunk/common/modules/EcpModuleCancel.php
r3218798 r3336019 6 6 use common\api\EcpGatewayAPIPayment; 7 7 use common\exceptions\EcpGatewayAPIException; 8 use common\helpers\EcpGatewayPaymentStatus; 8 9 use common\helpers\EcpGatewayRegistry; 10 use common\includes\EcpGatewayOrder; 11 use common\includes\filters\EcpApiFilters; 12 use common\includes\filters\EcpWCFilters; 13 use common\settings\EcpSettingsGeneral; 9 14 use Exception; 15 use Throwable; 16 use WC_Order; 10 17 11 18 class EcpModuleCancel extends EcpGatewayRegistry { 12 19 13 private const WP_AJAX_ECP_PROCESS_CANCEL_ORDER = 'wp_ajax_ecp_process_cancel_order'; 20 protected function init(): void { 21 add_action( EcpApiFilters::WP_AJAX_ECP_PROCESS_CANCEL_ORDER, [ $this, 'process' ] ); 14 22 15 protected function init(): void { 16 add_action( self::WP_AJAX_ECP_PROCESS_CANCEL_ORDER, [ $this, 'process' ] ); 23 add_action( EcpWCFilters::WOOCOMMERCE_ORDER_STATUS_CANCELLED, [ $this, 'try_auto_cancel_payment' ] ); 17 24 } 18 25 … … 65 72 } 66 73 } 74 75 /** 76 * Determine if the order should be auto-cancelled via Ecommpay. 77 * 78 * @param $order EcpGatewayOrder|null 79 * 80 * @return bool 81 */ 82 private function should_auto_cancel_payment( ?EcpGatewayOrder $order ): bool { 83 if ( ! $order || ! $order->is_ecp() ) { 84 return false; 85 } 86 if ( ! ecommpay()->get_general_option( EcpSettingsGeneral::AUTOMATIC_CANCELLATION ) ) { 87 return false; 88 } 89 if ( $order->get_ecp_status() !== EcpGatewayPaymentStatus::AWAITING_CAPTURE ) { 90 return false; 91 } 92 93 return true; 94 } 95 96 /** 97 * Automatically cancel Ecommpay payment if order is cancelled and feature is enabled. 98 * 99 * @param int|WC_Order $order_id 100 */ 101 public function try_auto_cancel_payment( $order_id ) { 102 $order = ecp_get_order( $order_id ); 103 if ( ! $this->should_auto_cancel_payment( $order ) ) { 104 return; 105 } 106 try { 107 $api = new EcpGatewayAPIPayment(); 108 $api->cancel( $order ); 109 } catch ( Throwable $e ) { 110 ecp_error( 'Automatic cancellation failed: ' . $e->getMessage() ); 111 } 112 } 67 113 } -
ecommpay-payments/trunk/common/modules/EcpModulePaymentPage.php
r3316762 r3336019 422 422 */ 423 423 private function get_form_data( EcpGatewayOrder $order, EcpGateway $gateway ): array { 424 // General options 425 $values = apply_filters( EcpFilters::ECP_CREATE_PAYMENT_DATA, $order ); 426 $values['baseUrl'] = $this->endpoint; 427 428 // Set payment information 429 $info = apply_filters( EcpFilters::ECP_CREATE_PAYMENT_INFO, $order ); 430 foreach ( $info as $key => $value ) { 431 $values[ 'payment_' . $key ] = $value; 432 } 424 $values = [ 425 'baseUrl' => $this->endpoint, 426 'payment_id' => $order->create_payment_id(), 427 'payment_amount' => ecp_price_multiply( abs( $order->get_total() ), $order->get_currency() ), 428 'payment_currency' => $order->get_currency() 429 ]; 433 430 434 431 $return_url = esc_url_raw( add_query_arg( 'utm_nooverride', '1', $gateway->get_return_url( $order ) ) ); 435 432 $fail_url = home_url( self::FAILED_URI ); 433 434 $values = apply_filters( EcpAppendsFilters::ECP_APPEND_PROJECT_ID, $values ); 436 435 $values = apply_filters( EcpAppendsFilters::ECP_APPEND_LANGUAGE_CODE, $values ); 437 436 $values = apply_filters( EcpAppendsFilters::ECP_APPEND_ADDITIONAL_VARIABLES, $values, $order ); 438 437 $values = apply_filters( EcpAppendsFilters::ECP_APPEND_MERCHANT_SUCCESS_URL, $values, $return_url ); 439 438 $values = apply_filters( EcpAppendsFilters::ECP_APPEND_MERCHANT_FAIL_URL, $values, $fail_url ); 440 $values = apply_filters( EcpAppendsFilters::ECP_APPEND_REDIRECT_RETURN_URL, $values, home_url( '/checkout' ) ); 439 //todo: uncomment after Humm is fixed 440 //$values = apply_filters( EcpAppendsFilters::ECP_APPEND_REDIRECT_RETURN_URL, $values, home_url( '/checkout' ) ); 441 441 $values = apply_filters( EcpAppendsFilters::ECP_APPEND_MERCHANT_RETURN_URL, $values, esc_url_raw( $order->get_checkout_payment_url() ) ); 442 442 $values = apply_filters( EcpAppendsFilters::ECP_APPEND_MERCHANT_CALLBACK_URL, $values ); -
ecommpay-payments/trunk/common/settings/EcpSettingsGeneral.php
r3267715 r3336019 150 150 'By enabling this, you can have payments cancelled automatically when cancelling related orders.', 151 151 'Settings payment form', 'woo-ecommpay' 152 ) 152 ), 153 self::FIELD_DEFAULT => self::VALUE_ENABLED, 153 154 ], 154 155 [ -
ecommpay-payments/trunk/common/settings/forms/EcpTabManager.php
r3267715 r3336019 13 13 use common\settings\EcpSettingsDirectDebitSEPA; 14 14 use common\settings\EcpSettingsGeneral; 15 use common\settings\EcpSettingsGiropay;16 15 use common\settings\EcpSettingsGooglepay; 16 use common\settings\EcpSettingsHumm; 17 17 use common\settings\EcpSettingsIdeal; 18 18 use common\settings\EcpSettingsKlarna; … … 21 21 use common\settings\EcpSettingsPayPalPayLater; 22 22 use common\settings\EcpSettingsProducts; 23 use common\settings\EcpSettingsSofort;24 23 use common\settings\EcpSettingsSubscriptions; 25 24 … … 54 53 new EcpSettingsPayPal(), 55 54 new EcpSettingsPayPalPayLater(), 56 new EcpSettingsSofort(),57 55 new EcpSettingsIdeal(), 58 56 new EcpSettingsKlarna(), 59 57 new EcpSettingsBlik(), 60 new EcpSettings Giropay(),58 new EcpSettingsHumm(), 61 59 new EcpSettingsBrazilOnline_Banks(), 62 60 new EcpSettingsMore(), -
ecommpay-payments/trunk/gateway-ecommpay.php
r3316762 r3336019 5 5 * GitHub Plugin URI: 6 6 * Description: Easy payment from WooCommerce by different methods in single Payment Page. 7 * Version: 4. 1.17 * Version: 4.2.0 8 8 * License: GPL2 9 9 * License URI: https://www.gnu.org/licenses/gpl-2.0.html -
ecommpay-payments/trunk/helpers/ecp-helper.php
r3218798 r3336019 296 296 'google-pay' => 'google_pay.png', 297 297 'google-pay-host' => 'google_pay.svg', 298 'humm' => 'humm.svg', 298 299 'jeton-wallet' => 'jetonWallet.svg', 299 300 'mobile' => 'mobile.svg', … … 304 305 'rapid' => 'rapid.svg', 305 306 'skrill' => 'skrill.svg', 306 'sofort' => 'sofort.svg',307 307 'unionpay' => 'unionpay.svg', 308 308 'webmoney' => 'webmoney.svg', -
ecommpay-payments/trunk/helpers/ecp-payment.php
r3267715 r3336019 6 6 use common\helpers\EcpGatewayOperationType; 7 7 use common\helpers\EcpGatewayPaymentStatus; 8 use common\includes\filters\EcpFilters;9 8 10 9 /** … … 16 15 */ 17 16 function ecp_get_payment_statuses(): array { 18 $payment_statuses = EcpGatewayPaymentStatus::get_status_names(); 19 20 return apply_filters( EcpFilters::ECP_PAYMENT_STATUSES, $payment_statuses ); 17 return EcpGatewayPaymentStatus::get_status_names(); 21 18 } 22 19 -
ecommpay-payments/trunk/helpers/ecp-woo-blocks-support.php
r3218798 r3336019 13 13 use common\gateways\EcpDirectDebitBACS; 14 14 use common\gateways\EcpDirectDebitSEPA; 15 use common\gateways\EcpGiropay;16 15 use common\gateways\EcpGooglepay; 16 use common\gateways\EcpHumm; 17 17 use common\gateways\EcpIdeal; 18 18 use common\gateways\EcpKlarna; … … 20 20 use common\gateways\EcpPayPal; 21 21 use common\gateways\EcpPayPalPayLater; 22 use common\gateways\EcpSofort;23 22 use common\includes\EcpGatewayBlocksSupport; 24 23 use common\settings\EcpSettingsApplepay; … … 29 28 use common\settings\EcpSettingsDirectDebitBACS; 30 29 use common\settings\EcpSettingsDirectDebitSEPA; 31 use common\settings\EcpSettingsGiropay;32 30 use common\settings\EcpSettingsGooglepay; 31 use common\settings\EcpSettingsHumm; 33 32 use common\settings\EcpSettingsIdeal; 34 33 use common\settings\EcpSettingsKlarna; … … 36 35 use common\settings\EcpSettingsPayPal; 37 36 use common\settings\EcpSettingsPayPalPayLater; 38 use common\settings\EcpSettingsSofort;39 37 40 38 add_action( 'before_woocommerce_init', function () { … … 55 53 function ( Automattic\WooCommerce\Blocks\Payments\PaymentMethodRegistry $payment_method_registry ) { 56 54 $gateways = [ 57 EcpSettingsApplepay::ID => new EcpApplepay(), 58 EcpSettingsBanks::ID => new EcpBanks(), 55 EcpSettingsCard::ID => new EcpCard(), 56 EcpSettingsPayPal::ID => new EcpPayPal(), 57 EcpSettingsPayPalPayLater::ID => new EcpPayPalPayLater(), 58 EcpSettingsKlarna::ID => new EcpKlarna(), 59 59 EcpSettingsBlik::ID => new EcpBlik(), 60 EcpSettingsIdeal::ID => new EcpIdeal(), 61 EcpSettingsBanks::ID => new EcpBanks(), 62 EcpSettingsHumm::ID => new EcpHumm(), 60 63 EcpSettingsBrazilOnline_Banks::ID => new EcpBrazilOnlineBanks(), 64 EcpSettingsGooglepay::ID => new EcpGooglepay(), 65 EcpSettingsApplepay::ID => new EcpApplepay(), 61 66 EcpSettingsDirectDebitBACS::ID => new EcpDirectDebitBACS(), 62 67 EcpSettingsDirectDebitSEPA::ID => new EcpDirectDebitSEPA(), 63 EcpSettingsCard::ID => new EcpCard(),64 EcpSettingsGiropay::ID => new EcpGiropay(),65 EcpSettingsGooglepay::ID => new EcpGooglepay(),66 EcpSettingsIdeal::ID => new EcpIdeal(),67 EcpSettingsKlarna::ID => new EcpKlarna(),68 68 EcpSettingsMore::ID => new EcpMore(), 69 EcpSettingsPayPal::ID => new EcpPayPal(),70 EcpSettingsPayPalPayLater::ID => new EcpPayPalPayLater(),71 EcpSettingsSofort::ID => new EcpSofort(),72 69 ]; 73 70 -
ecommpay-payments/trunk/readme.txt
r3316762 r3336019 1 1 === ECOMMPAY Payments === 2 2 Contributors: ECOMMPAY 3 Tags: card payments, apple pay, google pay, open banking, subscriptions, paypal, sofort, ideal, klarna, giropay, payment gateway, woocommerce3 Tags: card payments, apple pay, google pay, open banking, subscriptions, paypal, humm, ideal, klarna, payment gateway, woocommerce 4 4 Requires at least: 6.2 5 5 Tested up to: 6.7 6 Stable tag: 4. 1.16 Stable tag: 4.2.0 7 7 License: GPLv2 8 8 License URI: http://www.gnu.org/licenses/gpl-2.0.html … … 26 26 Take payments in all the popular cryptocurrencies and settle in USD, GBP or EUR without the conversion risk. 27 27 = eWallets = 28 Offer an option to pay Apple Pay and Google Pay or local eWallets your customers know and trust, like Blik, Bancontact, EPS, Giropay, iDEAL, Multibanco, Neteller and more.28 Offer an option to pay Apple Pay and Google Pay or local eWallets your customers know and trust, like Blik, Bancontact, EPS, Humm, iDEAL, Multibanco, Neteller and more. 29 29 = Subscriptions and recurring payments = 30 30 Offer your customers subscriptions or flexible recurring payment plans. Migrate from your old payment service provider without any interruption. … … 62 62 63 63 == Changelog == 64 = 4.2.0 = 65 * Removed Sofort and Giropay payment methods 66 * Added Humm payment method 67 * Fixed minor bugs 68 64 69 = 4.1.0 = 65 70 * Added a convenient option to make a repeat payment
Note: See TracChangeset
for help on using the changeset viewer.