Plugin Directory

Changeset 3336019


Ignore:
Timestamp:
07/29/2025 02:07:42 PM (8 months ago)
Author:
ecommpay
Message:

new version 4.2.0

Location:
ecommpay-payments/trunk
Files:
3 added
6 deleted
23 edited

Legend:

Unmodified
Added
Removed
  • ecommpay-payments/trunk/assets/css/woocommerce-ecommpay-admin.css

    r3218798 r3336019  
    106106.ecp-pm-logo {
    107107  max-height: 2.2em;
     108    max-width: 7em;
    108109}
    109110
  • ecommpay-payments/trunk/common/EcpCore.php

    r3316762 r3336019  
    1313use common\gateways\EcpDirectDebitSEPA;
    1414use common\gateways\EcpGateway;
    15 use common\gateways\EcpGiropay;
    1615use common\gateways\EcpGooglepay;
     16use common\gateways\EcpHumm;
    1717use common\gateways\EcpIdeal;
    1818use common\gateways\EcpKlarna;
     
    2020use common\gateways\EcpPayPal;
    2121use common\gateways\EcpPayPalPayLater;
    22 use common\gateways\EcpSofort;
    2322use common\helpers\EcpGatewayAPIProtocol;
    2423use common\includes\EcpCallbacksHandler;
     
    4342use common\settings\EcpSettingsDirectDebitSEPA;
    4443use common\settings\EcpSettingsGeneral;
    45 use common\settings\EcpSettingsGiropay;
    4644use common\settings\EcpSettingsGooglepay;
     45use common\settings\EcpSettingsHumm;
    4746use common\settings\EcpSettingsIdeal;
    4847use common\settings\EcpSettingsKlarna;
     
    5049use common\settings\EcpSettingsPayPal;
    5150use common\settings\EcpSettingsPayPalPayLater;
    52 use common\settings\EcpSettingsSofort;
    5351use common\settings\forms\EcpForm;
    5452use WC_Settings_API;
     
    6361     * @since 2.0.0
    6462     */
    65     public const WC_ECP_VERSION = '4.1.1';
     63    public const WC_ECP_VERSION = '4.2.0';
    6664
    6765    public const ECOMMPAY_PAYMENT_METHOD = 'ecommpay';
     
    10199        EcpPayPal::class,
    102100        EcpPayPalPayLater::class,
    103         EcpSofort::class,
    104101        EcpIdeal::class,
    105102        EcpKlarna::class,
    106103        EcpBlik::class,
    107         EcpGiropay::class,
     104        EcpHumm::class,
    108105        EcpBrazilOnlineBanks::class,
    109106        EcpMore::class,
     
    179176            EcpSettingsPayPalPayLater::ID     => EcpPayPalPayLater::get_instance(),
    180177            EcpSettingsKlarna::ID             => EcpKlarna::get_instance(),
    181             EcpSettingsSofort::ID             => EcpSofort::get_instance(),
    182178            EcpSettingsBlik::ID               => EcpBlik::get_instance(),
    183179            EcpSettingsIdeal::ID              => EcpIdeal::get_instance(),
    184180            EcpSettingsBanks::ID              => EcpBanks::get_instance(),
    185             EcpSettingsGiropay::ID            => EcpGiropay::get_instance(),
     181            EcpSettingsHumm::ID => EcpHumm::get_instance(),
    186182            EcpSettingsBrazilOnline_Banks::ID => EcpBrazilOnlineBanks::get_instance(),
    187183            EcpSettingsGooglepay::ID          => EcpGooglepay::get_instance(),
  • ecommpay-payments/trunk/common/__autoload.php

    r3218798 r3336019  
    102102require_once __DIR__ . '/settings/EcpSettingsPayPalPayLater.php';
    103103require_once __DIR__ . '/settings/EcpSettingsKlarna.php';
    104 require_once __DIR__ . '/settings/EcpSettingsGiropay.php';
    105 require_once __DIR__ . '/settings/EcpSettingsSofort.php';
    106104require_once __DIR__ . '/settings/EcpSettingsBlik.php';
    107105require_once __DIR__ . '/settings/EcpSettingsIdeal.php';
    108106require_once __DIR__ . '/settings/EcpSettingsBanks.php';
     107require_once __DIR__ . '/settings/EcpSettingsHumm.php';
    109108require_once __DIR__ . '/settings/EcpSettingsApplepay.php';
    110109require_once __DIR__ . '/settings/EcpSettingsMore.php';
     
    129128require_once __DIR__ . '/gateways/EcpPayPalPayLater.php';
    130129require_once __DIR__ . '/gateways/EcpKlarna.php';
    131 require_once __DIR__ . '/gateways/EcpGiropay.php';
    132 require_once __DIR__ . '/gateways/EcpSofort.php';
    133130require_once __DIR__ . '/gateways/EcpBlik.php';
    134131require_once __DIR__ . '/gateways/EcpIdeal.php';
    135132require_once __DIR__ . '/gateways/EcpBanks.php';
     133require_once __DIR__ . '/gateways/EcpHumm.php';
    136134require_once __DIR__ . '/gateways/EcpGooglepay.php';
    137135require_once __DIR__ . '/gateways/EcpApplepay.php';
  • ecommpay-payments/trunk/common/api/EcpGatewayAPI.php

    r3218798 r3336019  
    33namespace common\api;
    44
     5use WC_Abstract_Order;
    56use common\EcpCore;
    67use common\models\EcpGatewayInfoError;
    78use common\models\EcpGatewayInfoStatus;
    8 use common\modules\EcpSigner;
    99
    1010defined( 'ABSPATH' ) || exit;
     
    4545    private const VERSION = 'v2';
    4646
    47     protected const MERCHANT_DESTINATION = 'merchant';
    4847
    4948    protected const STATUS_API_ENDPOINT = 'status';
     
    280279    }
    281280
    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 {
    291282        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()
    293289        ];
    294290    }
    295291
    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(),
    302297        ];
    303     }
    304 
    305 
     298        return $api_data;
     299    }
    306300}
  • ecommpay-payments/trunk/common/api/EcpGatewayAPIPayment.php

    r3267715 r3336019  
    1212use common\settings\EcpSettingsApplepay;
    1313use common\settings\EcpSettingsCard;
    14 use common\settings\EcpSettingsGeneral;
    1514use common\settings\EcpSettingsGooglepay;
    1615
     
    6160        }
    6261
    63         // Run request
    6462        $response = new EcpGatewayInfoStatus(
    6563            $this->post(
    6664                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                )
    6869            )
    6970        );
     
    7273
    7374        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.0
    83      */
    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;
    9575    }
    9676
     
    10888        ecp_debug( ecpTr( 'Order ID:' ), $order->get_id() );
    10989
    110         // Create form data
    111         $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 data
    118             $data = apply_filters( 'ecp_append_receipt_data', $data, $refund );
    119         }
    120 
    121         // Run request
    12290        $response = $this->post(
    12391            sprintf(
     
    12694                'refund'
    12795            ),
    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            )
    129100        );
    130101
     
    145116     * @since 3.0.0
    146117     */
    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;
    158123    }
    159124
     
    161126        ecp_info( 'Run cancel payment API process.' );
    162127        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 );
    164129        $url = $this->getMethodEndpoint( $order->get_payment_method(), EcpGatewayAPI::CANCEL_ENDPOINT );
    165130        $response = $this->post( $url, apply_filters( EcpAppendsFilters::ECP_APPEND_SIGNATURE, $data ) );
     
    169134
    170135        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 );
    184136    }
    185137
     
    205157        ecp_info( 'Run capture payment API process.' );
    206158        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 );
    208160        $url = $this->getMethodEndpoint( $order->get_payment_method(), EcpGatewayAPI::CAPTURE_ENDPOINT );
    209161        $response = $this->post( $url, apply_filters( EcpAppendsFilters::ECP_APPEND_SIGNATURE, $data ) );
  • ecommpay-payments/trunk/common/api/EcpGatewayAPISubscription.php

    r3267715 r3336019  
    66use common\helpers\EcpGatewayPaymentMethods;
    77use common\includes\EcpGatewayOrder;
    8 use common\includes\filters\EcpApiFilters;
    98use common\includes\filters\EcpAppendsFilters;
    10 use common\includes\filters\EcpFilters;
    119use common\models\EcpGatewayInfoResponse;
    1210use WC_Subscriptions_Order;
     
    2321 */
    2422class EcpGatewayAPISubscription extends EcpGatewayAPI {
     23    private const STATUS_REQUEST_API_ENDPOINT = 'status/request';
    2524
    2625    /**
     
    6160        }
    6261
    63         // Check if a custom amount has been set
    6462        if ( $amount === null ) {
    65             // No custom amount set. Default to the order total
    6663            $amount = WC_Subscriptions_Order::get_recurring_total( $order );
    6764        }
     
    7774        ecp_get_log()->debug( __( 'Payment method:', 'woo-ecommpay' ), $payment_method );
    7875
    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);
    8177
    82         // Run request
    8378        $response = new EcpGatewayInfoResponse(
    8479            $this->post(
     
    105100        ecp_get_log()->debug( __( 'Request ID:', 'woo-ecommpay' ), $request_id );
    106101
    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]
    115107            )
    116108        );
     109
     110        $response = new EcpGatewayInfoResponse($this->post(self::STATUS_REQUEST_API_ENDPOINT, $data));
    117111
    118112        ecp_get_log()->info( __( 'Check transaction status process completed.', 'woo-ecommpay' ) );
     
    136130        ecp_get_log()->debug( __( 'Payment status:', 'woo-ecommpay' ), $order->get_ecp_status() );
    137131
     132        //that is the mock
    138133        return true;
    139134    }
     
    151146        ecp_get_log()->info( __( 'Create form data for recurring request.', 'woo-ecommpay' ) );
    152147
    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;
    161151
    162152        $ip_address       = $order->get_ecp_meta( '_customer_ip_address' );
     
    166156        ];
    167157
    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.0
    179      */
    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_id
    193                 )
    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.0
    206      */
    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 
    211158        return $data;
    212159    }
    213 
    214     /**
    215      * @inheritDoc
    216      * @return void
    217      * @since 2.0.0
    218      */
    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     }
    232160}
  • ecommpay-payments/trunk/common/helpers/EcpGatewayAPIProtocol.php

    r3267715 r3336019  
    66use common\exceptions\EcpGatewaySignatureException;
    77use common\includes\EcpGatewayOrder;
    8 use common\includes\EcpGatewayRefund;
    98use common\includes\filters\EcpAppendsFilters;
    109use common\includes\filters\EcpFilters;
     
    1716
    1817class EcpGatewayAPIProtocol extends EcpGatewayRegistry {
    19 
    20     /**
    21      * @param EcpGatewayOrder|EcpGatewayRefund $order
    22      *
    23      * @return array
    24      */
    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 
    3918    /**
    4019     * @param string $key
     
    5029
    5130        $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             $payment
    88         );
    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                 $payment
    99             );
    100             // Refund ECOMMPAY identifier in WooCommerce.
    101             $this->append_argument( 'merchant_refund_id', $order->get_payment_id(), $payment );
    102         }
    103 
    104         return $payment;
    10531    }
    10632
     
    412338            'billing_postal',
    413339            wc_format_postcode( $order->get_billing_postcode(), $order->get_billing_country() ),
    414             $values
    415         );
    416 
    417         return $values;
    418     }
    419 
    420     /**
    421      * @param EcpGatewayOrder $order
    422      * @param array $values
    423      *
    424      * @return array
    425      * @since 3.0.0
    426      */
    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 $order
    436      * @param array $values
    437      *
    438      * @return array
    439      * @since 3.0.0
    440      */
    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() ),
    445340            $values
    446341        );
     
    867762
    868763    /**
    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     /**
    908764     * @inheritDoc
    909765     * @return void
    910766     */
    911767    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 
    916768        // register filters for appending payment arguments
    917769        add_filter( EcpAppendsFilters::ECP_APPEND_PROJECT_ID, [ $this, 'append_project_id' ] );
     
    924776        add_filter( EcpAppendsFilters::ECP_APPEND_FORCE_MODE, [ $this, 'append_force_mode' ], 10, 2 );
    925777        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 );
    927778        add_filter( EcpAppendsFilters::ECP_APPEND_LANGUAGE_CODE, [ $this, 'append_language' ] );
    928779        add_filter( EcpAppendsFilters::ECP_APPEND_MERCHANT_SUCCESS_URL, [
     
    969820        add_filter( EcpAppendsFilters::ECP_APPEND_BILLING_COUNTRY, [ $this, 'append_billing_country' ], 10, 2 );
    970821        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 );
    976822        add_filter( EcpAppendsFilters::ECP_APPEND_ADDITIONAL_VARIABLES, [
    977823            $this,
     
    980826        add_filter( EcpFilters::ECP_PAYMENT_PAGE_CLEAN_PARAMETERS, [ $this, 'filter_clean' ] );
    981827        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 );
    983828        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 );
    985829        add_filter( EcpAppendsFilters::ECP_APPEND_VERSIONS, [ $this, 'append_versions' ] );
    986830        add_filter( EcpAppendsFilters::ECP_APPEND_SIGNATURE, [ $this, 'append_signature' ] );
  • ecommpay-payments/trunk/common/includes/EcpCallbacksHandler.php

    r3267715 r3336019  
    135135        $order        = ecp_get_order( $order_number );
    136136
    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 
    146137        if ( ! $order ) {
    147138            // Print debug information to logs
     
    160151
    161152            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 );
    162162            die ( $message );
    163163        }
  • ecommpay-payments/trunk/common/includes/EcpGatewayPayment.php

    r3218798 r3336019  
    8585     * @var EcpGatewayInfoPayment
    8686     */
    87     private EcpGatewayInfoPayment $info;
     87    private ?EcpGatewayInfoPayment $info = null;
    8888
    8989
  • ecommpay-payments/trunk/common/includes/filters/EcpApiFilters.php

    r3267715 r3336019  
    88    public const WP_AJAX_CHECK_CART_AMOUNT = 'wp_ajax_check_cart_amount';
    99    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';
    1110    public const WP_AJAX_NOPRIV_ECOMMPAY_BREAK = 'wp_ajax_nopriv_ecommpay_break';
    1211    public const WP_AJAX_NOPRIV_GET_DATA_FOR_PAYMENT_FORM = 'wp_ajax_nopriv_get_data_for_payment_form';
    1312    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';
    1513    public const WP_AJAX_ECOMMPAY_BREAK = 'wp_ajax_ecommpay_break';
    1614    public const ECP_API_REFUND_ENDPOINT_PREFIX = 'ecp_api_refund_endpoint_';
     
    1816    public const WP_AJAX_NOPRIV_ECOMMPAY_PROCESS = 'wp_ajax_nopriv_ecommpay_process';
    1917    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';
    2118    public const WP_AJAX_NOPRIV_CHECK_CART_AMOUNT = 'wp_ajax_nopriv_check_cart_amount';
    2219    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';
    2321}
  • ecommpay-payments/trunk/common/includes/filters/EcpAppendsFilters.php

    r3267715 r3336019  
    77    public const ECP_APPEND_INTERFACE_TYPE = 'ecp_append_interface_type';
    88    public const ECP_APPEND_MERCHANT_RETURN_URL = 'ecp_append_merchant_return_url';
    9     public const ECP_APPEND_PAYMENT_SECTION = 'ecp_append_payment_section';
    109    public const ECP_APPEND_MERCHANT_SUCCESS_URL = 'ecp_append_merchant_success_url';
    1110    public const ECP_APPEND_REDIRECT_SUCCESS_URL = 'ecp_append_redirect_success_url';
     
    2019    public const ECP_APPEND_CUSTOMER_ADDRESS = 'ecp_append_customer_address';
    2120    public const ECP_APPEND_BILLING_POSTAL = 'ecp_append_billing_postal';
    22     public const ECP_APPEND_BILLING_REGION = 'ecp_append_billing_region';
    2321    public const ECP_APPEND_GATEWAY_ARGUMENTS = 'ecp_append_gateway_arguments_';
    2422    public const ECP_APPEND_AVS_STREET_ADDRESS = 'ecp_append_avs_street_address';
     
    2826    public const ECP_APPEND_ADDITIONAL_VARIABLES = 'ecp_append_additional_variables';
    2927    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';
    3128    public const ECP_APPEND_CUSTOMER_DATA = 'ecp_append_customer_data';
    3229    public const ECP_APPEND_CUSTOMER_COUNTRY = 'ecp_append_customer_country';
     
    4037    public const ECP_APPEND_CUSTOMER_LAST_NAME = 'ecp_append_customer_last_name';
    4138    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';
    4439    public const ECP_APPEND_CUSTOMER_EMAIL = 'ecp_append_customer_email';
    4540    public const ECP_APPEND_AVS_POST_CODE = 'ecp_append_avs_post_code';
  • ecommpay-payments/trunk/common/includes/filters/EcpFilters.php

    r3267715 r3336019  
    77    public const FILTER_ACTION_LINKS = 'plugin_action_links_plugin-ecommpay/gateway-ecommpay.php';
    88    public const ECP_FIELD_NORMALISATION = 'ecp_field_normalisation';
    9     public const ECP_CREATE_GENERAL_DATA = 'ecp_create_general_data';
    109    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';
    1410    public const ECP_APPEND_CUSTOMER_CITY = 'ecp_append_customer_city';
    1511    public const ECP_PAYMENT_PAGE_CLEAN_PARAMETERS = 'ecp_payment_page_clean_parameters';
    1612    public const ECP_APPEND_BILLING_ADDRESS = 'ecp_append_billing_address';
    17     public const ECP_PAYMENT_STATUSES = 'ecp_payment_statuses';
    1813}
  • ecommpay-payments/trunk/common/includes/filters/EcpWCFilters.php

    r3267715 r3336019  
    1717    public const WOOCOMMERCE_ORDER_CLASS = 'woocommerce_order_class';
    1818    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';
    1920}
  • ecommpay-payments/trunk/common/modules/EcpModuleAdminUI.php

    r3218798 r3336019  
    542542        global $wpdb;
    543543
    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        }
    548557
    549558        if ( empty( $statuses ) ) {
     
    551560        }
    552561
    553 
    554         $statuses = array_combine( $statuses,
     562        $statuses = array_combine(
     563            $statuses,
    555564            array_map(
    556565                function ( $status ) {
     
    566575
    567576        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            ]
    569581        );
    570582    }
  • ecommpay-payments/trunk/common/modules/EcpModuleCancel.php

    r3218798 r3336019  
    66use common\api\EcpGatewayAPIPayment;
    77use common\exceptions\EcpGatewayAPIException;
     8use common\helpers\EcpGatewayPaymentStatus;
    89use common\helpers\EcpGatewayRegistry;
     10use common\includes\EcpGatewayOrder;
     11use common\includes\filters\EcpApiFilters;
     12use common\includes\filters\EcpWCFilters;
     13use common\settings\EcpSettingsGeneral;
    914use Exception;
     15use Throwable;
     16use WC_Order;
    1017
    1118class EcpModuleCancel extends EcpGatewayRegistry {
    1219
    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' ] );
    1422
    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' ] );
    1724    }
    1825
     
    6572        }
    6673    }
     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    }
    67113}
  • ecommpay-payments/trunk/common/modules/EcpModulePaymentPage.php

    r3316762 r3336019  
    422422     */
    423423    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        ];
    433430
    434431        $return_url = esc_url_raw( add_query_arg( 'utm_nooverride', '1', $gateway->get_return_url( $order ) ) );
    435432        $fail_url = home_url( self::FAILED_URI );
     433
     434        $values = apply_filters( EcpAppendsFilters::ECP_APPEND_PROJECT_ID, $values );
    436435        $values = apply_filters( EcpAppendsFilters::ECP_APPEND_LANGUAGE_CODE, $values );
    437436        $values = apply_filters( EcpAppendsFilters::ECP_APPEND_ADDITIONAL_VARIABLES, $values, $order );
    438437        $values = apply_filters( EcpAppendsFilters::ECP_APPEND_MERCHANT_SUCCESS_URL, $values, $return_url );
    439438        $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' ) );
    441441        $values = apply_filters( EcpAppendsFilters::ECP_APPEND_MERCHANT_RETURN_URL, $values, esc_url_raw( $order->get_checkout_payment_url() ) );
    442442        $values = apply_filters( EcpAppendsFilters::ECP_APPEND_MERCHANT_CALLBACK_URL, $values );
  • ecommpay-payments/trunk/common/settings/EcpSettingsGeneral.php

    r3267715 r3336019  
    150150                    'By enabling this, you can have payments cancelled automatically when cancelling related orders.',
    151151                    'Settings payment form', 'woo-ecommpay'
    152                 )
     152                ),
     153                self::FIELD_DEFAULT => self::VALUE_ENABLED,
    153154            ],
    154155            [
  • ecommpay-payments/trunk/common/settings/forms/EcpTabManager.php

    r3267715 r3336019  
    1313use common\settings\EcpSettingsDirectDebitSEPA;
    1414use common\settings\EcpSettingsGeneral;
    15 use common\settings\EcpSettingsGiropay;
    1615use common\settings\EcpSettingsGooglepay;
     16use common\settings\EcpSettingsHumm;
    1717use common\settings\EcpSettingsIdeal;
    1818use common\settings\EcpSettingsKlarna;
     
    2121use common\settings\EcpSettingsPayPalPayLater;
    2222use common\settings\EcpSettingsProducts;
    23 use common\settings\EcpSettingsSofort;
    2423use common\settings\EcpSettingsSubscriptions;
    2524
     
    5453                new EcpSettingsPayPal(),
    5554                new EcpSettingsPayPalPayLater(),
    56                 new EcpSettingsSofort(),
    5755                new EcpSettingsIdeal(),
    5856                new EcpSettingsKlarna(),
    5957                new EcpSettingsBlik(),
    60                 new EcpSettingsGiropay(),
     58                new EcpSettingsHumm(),
    6159                new EcpSettingsBrazilOnline_Banks(),
    6260                new EcpSettingsMore(),
  • ecommpay-payments/trunk/gateway-ecommpay.php

    r3316762 r3336019  
    55 * GitHub Plugin URI:
    66 * Description:       Easy payment from WooCommerce by different methods in single Payment Page.
    7  * Version:           4.1.1
     7 * Version:           4.2.0
    88 * License:           GPL2
    99 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
  • ecommpay-payments/trunk/helpers/ecp-helper.php

    r3218798 r3336019  
    296296        'google-pay'      => 'google_pay.png',
    297297        'google-pay-host' => 'google_pay.svg',
     298        'humm'            => 'humm.svg',
    298299        'jeton-wallet'    => 'jetonWallet.svg',
    299300        'mobile'          => 'mobile.svg',
     
    304305        'rapid'           => 'rapid.svg',
    305306        'skrill'          => 'skrill.svg',
    306         'sofort'          => 'sofort.svg',
    307307        'unionpay'        => 'unionpay.svg',
    308308        'webmoney'        => 'webmoney.svg',
  • ecommpay-payments/trunk/helpers/ecp-payment.php

    r3267715 r3336019  
    66use common\helpers\EcpGatewayOperationType;
    77use common\helpers\EcpGatewayPaymentStatus;
    8 use common\includes\filters\EcpFilters;
    98
    109/**
     
    1615 */
    1716function 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();
    2118}
    2219
  • ecommpay-payments/trunk/helpers/ecp-woo-blocks-support.php

    r3218798 r3336019  
    1313use common\gateways\EcpDirectDebitBACS;
    1414use common\gateways\EcpDirectDebitSEPA;
    15 use common\gateways\EcpGiropay;
    1615use common\gateways\EcpGooglepay;
     16use common\gateways\EcpHumm;
    1717use common\gateways\EcpIdeal;
    1818use common\gateways\EcpKlarna;
     
    2020use common\gateways\EcpPayPal;
    2121use common\gateways\EcpPayPalPayLater;
    22 use common\gateways\EcpSofort;
    2322use common\includes\EcpGatewayBlocksSupport;
    2423use common\settings\EcpSettingsApplepay;
     
    2928use common\settings\EcpSettingsDirectDebitBACS;
    3029use common\settings\EcpSettingsDirectDebitSEPA;
    31 use common\settings\EcpSettingsGiropay;
    3230use common\settings\EcpSettingsGooglepay;
     31use common\settings\EcpSettingsHumm;
    3332use common\settings\EcpSettingsIdeal;
    3433use common\settings\EcpSettingsKlarna;
     
    3635use common\settings\EcpSettingsPayPal;
    3736use common\settings\EcpSettingsPayPalPayLater;
    38 use common\settings\EcpSettingsSofort;
    3937
    4038add_action( 'before_woocommerce_init', function () {
     
    5553            function ( Automattic\WooCommerce\Blocks\Payments\PaymentMethodRegistry $payment_method_registry ) {
    5654                $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(),
    5959                    EcpSettingsBlik::ID               => new EcpBlik(),
     60                    EcpSettingsIdeal::ID          => new EcpIdeal(),
     61                    EcpSettingsBanks::ID          => new EcpBanks(),
     62                    EcpSettingsHumm::ID           => new EcpHumm(),
    6063                    EcpSettingsBrazilOnline_Banks::ID => new EcpBrazilOnlineBanks(),
     64                    EcpSettingsGooglepay::ID      => new EcpGooglepay(),
     65                    EcpSettingsApplepay::ID       => new EcpApplepay(),
    6166                    EcpSettingsDirectDebitBACS::ID    => new EcpDirectDebitBACS(),
    6267                    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(),
    6868                    EcpSettingsMore::ID               => new EcpMore(),
    69                     EcpSettingsPayPal::ID             => new EcpPayPal(),
    70                     EcpSettingsPayPalPayLater::ID     => new EcpPayPalPayLater(),
    71                     EcpSettingsSofort::ID             => new EcpSofort(),
    7269                ];
    7370
  • ecommpay-payments/trunk/readme.txt

    r3316762 r3336019  
    11=== ECOMMPAY Payments ===
    22Contributors: ECOMMPAY
    3 Tags: card payments, apple pay, google pay, open banking, subscriptions, paypal, sofort, ideal, klarna, giropay, payment gateway, woocommerce
     3Tags: card payments, apple pay, google pay, open banking, subscriptions, paypal, humm, ideal, klarna, payment gateway, woocommerce
    44Requires at least: 6.2
    55Tested up to: 6.7
    6 Stable tag: 4.1.1
     6Stable tag: 4.2.0
    77License: GPLv2
    88License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    2626Take payments in all the popular cryptocurrencies and settle in USD, GBP or EUR without the conversion risk.
    2727= 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.
     28Offer 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.
    2929= Subscriptions and recurring payments =
    3030Offer your customers subscriptions or flexible recurring payment plans. Migrate from your old payment service provider without any interruption.
     
    6262
    6363== Changelog ==
     64= 4.2.0 =
     65* Removed Sofort and Giropay payment methods
     66* Added Humm payment method
     67* Fixed minor bugs
     68
    6469= 4.1.0 =
    6570* Added a convenient option to make a repeat payment
Note: See TracChangeset for help on using the changeset viewer.