Initial commit
diff --git a/includes/payment-methods/class-wc-stripe-upe-payment-method-cc.php b/includes/payment-methods/class-wc-stripe-upe-payment-method-cc.php
new file mode 100644
index 0000000..31bbb48
--- /dev/null
+++ b/includes/payment-methods/class-wc-stripe-upe-payment-method-cc.php
@@ -0,0 +1,112 @@
+<?php
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+/**
+ * Class WC_Stripe_UPE_Payment_Method_CC
+ */
+
+/**
+ * Credit card Payment Method class extending UPE base class
+ */
+class WC_Stripe_UPE_Payment_Method_CC extends WC_Stripe_UPE_Payment_Method {
+
+	const STRIPE_ID = 'card';
+
+	const LPM_GATEWAY_CLASS = WC_Gateway_Stripe::class;
+
+	/**
+	 * Constructor for card payment method
+	 */
+	public function __construct() {
+		parent::__construct();
+		$this->stripe_id   = self::STRIPE_ID;
+		$this->title       = __( 'Pay with credit card / debit card', 'woocommerce-gateway-stripe' );
+		$this->is_reusable = true;
+		$this->label       = __( 'Credit card / debit card', 'woocommerce-gateway-stripe' );
+		$this->description = __(
+			'Let your customers pay with major credit and debit cards without leaving your store.',
+			'woocommerce-gateway-stripe'
+		);
+	}
+
+	/**
+	 * Returns payment method title
+	 *
+	 * @param array|bool $payment_details Optional payment details from charge object.
+	 *
+	 * @return string
+	 */
+	public function get_title( $payment_details = false ) {
+		if ( ! $payment_details ) {
+			return $this->title;
+		}
+
+		$details       = $payment_details[ $this->stripe_id ];
+		$funding_types = [
+			'credit'  => __( 'credit', 'woocommerce-gateway-stripe' ),
+			'debit'   => __( 'debit', 'woocommerce-gateway-stripe' ),
+			'prepaid' => __( 'prepaid', 'woocommerce-gateway-stripe' ),
+			'unknown' => __( 'unknown', 'woocommerce-gateway-stripe' ),
+		];
+
+		return sprintf(
+			// Translators: %1$s card brand, %2$s card funding (prepaid, credit, etc.).
+			__( '%1$s %2$s card', 'woocommerce-gateway-stripe' ),
+			ucfirst( $details->network ),
+			$funding_types[ $details->funding ]
+		);
+	}
+
+	/**
+	 * Returns string representing payment method type
+	 * to query to retrieve saved payment methods from Stripe.
+	 */
+	public function get_retrievable_type() {
+		return $this->get_id();
+	}
+
+	/**
+	 * Create and return WC payment token for user.
+	 *
+	 * This will be used from the WC_Stripe_Payment_Tokens service
+	 * as opposed to WC_Stripe_UPE_Payment_Gateway.
+	 *
+	 * @param string $user_id        WP_User ID
+	 * @param object $payment_method Stripe payment method object
+	 *
+	 * @return WC_Payment_Token_CC
+	 */
+	public function create_payment_token_for_user( $user_id, $payment_method ) {
+		$token = new WC_Payment_Token_CC();
+		$token->set_expiry_month( $payment_method->card->exp_month );
+		$token->set_expiry_year( $payment_method->card->exp_year );
+		$token->set_card_type( strtolower( $payment_method->card->brand ) );
+		$token->set_last4( $payment_method->card->last4 );
+		$token->set_gateway_id( WC_Stripe_UPE_Payment_Gateway::ID );
+		$token->set_token( $payment_method->id );
+		$token->set_user_id( $user_id );
+		$token->save();
+		return $token;
+	}
+
+	/**
+	 * Returns boolean dependent on whether capability
+	 * for site account is enabled for payment method.
+	 *
+	 * @return bool
+	 */
+	public function is_capability_active() {
+		return true;
+	}
+
+	/**
+	 * The Credit Card method allows automatic capture.
+	 *
+	 * @return bool
+	 */
+	public function requires_automatic_capture() {
+		return false;
+	}
+}