Initial commit
diff --git a/includes/payment-methods/class-wc-gateway-stripe-oxxo.php b/includes/payment-methods/class-wc-gateway-stripe-oxxo.php
new file mode 100644
index 0000000..1c8bc2b
--- /dev/null
+++ b/includes/payment-methods/class-wc-gateway-stripe-oxxo.php
@@ -0,0 +1,127 @@
+<?php
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+/**
+ * Class that handles OXXO payment method.
+ *
+ * @extends WC_Gateway_Stripe
+ *
+ * @since 5.8.0
+ */
+class WC_Gateway_Stripe_Oxxo extends WC_Stripe_Payment_Gateway_Voucher {
+
+	/**
+	 * ID used by UPE
+	 *
+	 * @var string
+	 */
+	const ID = 'stripe_boleto';
+
+	/**
+	 * ID used by WooCommerce to identify the payment method
+	 *
+	 * @var string
+	 */
+	public $id = 'stripe_oxxo';
+
+	/**
+	 * ID used by stripe
+	 */
+	protected $stripe_id = 'oxxo';
+
+	/**
+	 * List of accepted currencies
+	 *
+	 * @var array
+	 */
+	protected $supported_currencies = [ 'MXN' ];
+
+	/**
+	 * List of accepted countries
+	 */
+	protected $supported_countries = [ 'MX' ];
+
+	/**
+	 * Constructor
+	 *
+	 * @since 5.8.0
+	 */
+	public function __construct() {
+		$this->method_title = __( 'Stripe OXXO', 'woocommerce-gateway-stripe' );
+		parent::__construct();
+
+		add_filter( 'wc_stripe_allowed_payment_processing_statuses', [ $this, 'add_allowed_payment_processing_statuses' ], 10, 2 );
+	}
+
+	/**
+	 * Adds on-hold as accepted status during webhook handling on orders paid with voucher
+	 *
+	 * @param $allowed_statuses
+	 * @param $order
+	 *
+	 * @return mixed
+	 */
+	public function add_allowed_payment_processing_statuses( $allowed_statuses, $order ) {
+		if ( $this->stripe_id === $order->get_meta( '_stripe_upe_payment_type' ) && ! in_array( 'on-hold', $allowed_statuses ) ) {
+			$allowed_statuses[] = 'on-hold';
+		}
+
+		return $allowed_statuses;
+	}
+
+	/**
+	 * Payment form on checkout page
+	 *
+	 * @since 5.8.0
+	 */
+	public function payment_fields() {
+		$description = $this->get_description();
+		apply_filters( 'wc_stripe_description', wpautop( wp_kses_post( $description ) ), $this->id )
+		?>
+		<div class="stripe-source-errors" role="alert"></div>
+
+		<div id="stripe-boleto-payment-data"><?php echo $description; ?></div>
+		<?php
+	}
+
+	/**
+	 * Validates the minimum and maximum amount. Throws exception when out of range value is added
+	 *
+	 * @since 5.8.0
+	 *
+	 * @param $amount
+	 *
+	 * @throws WC_Stripe_Exception
+	 */
+	protected function validate_amount_limits( $amount ) {
+
+		if ( $amount < 10.00 ) {
+			/* translators: 1) amount (including currency symbol) */
+			throw new WC_Stripe_Exception( sprintf( __( 'Sorry, the minimum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( 10.0 ) ) );
+		} elseif ( $amount > 10000.00 ) {
+			/* translators: 1) amount (including currency symbol) */
+			throw new WC_Stripe_Exception( sprintf( __( 'Sorry, the maximum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( 10000.00 ) ) );
+		}
+	}
+
+	/**
+	 * Gather the data necessary to confirm the payment via javascript
+	 * Override this when extending the class
+	 *
+	 * @param WC_Order $order
+	 *
+	 * @return array
+	 */
+	protected function get_confirm_payment_data( $order ) {
+		return [
+			'payment_method' => [
+				'billing_details' => [
+					'name'  => $order->get_formatted_billing_full_name(),
+					'email' => $order->get_billing_email(),
+				],
+			],
+		];
+	}
+}