woocommerce/includes/class-wc-payment-gateway-fo...

285 lines
11 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
/**
* Default payment Form for gateways.
*
* @class WC_Payment_Gateway_Form
* @since 2.6
* @package WooCommerce/Classes
* @category Class
* @author WooThemes
*/
class WC_Payment_Gateway_Form {
/** @protected WC_Payment_Gateway Gateway Class */
protected $gateway;
/**
* Setup and hook into WordPress & WooCommerce.
*
* @since 2.6
* @param WC_Payment_Gateway $gateway
*/
public function __construct( $gateway ) {
$this->gateway = $gateway;
$gateway_id = $this->gateway->id;
if ( is_user_logged_in() && $this->gateway->supports( 'tokenization' ) ) {
$this->tokens = $this->filter_tokens_by_gateway(
$gateway_id,
WC_Payment_Tokens::get_customer_tokens( get_current_user_id() )
);
$this->saved_payment_methods();
}
if ( $this->gateway->supports( 'tokenization' ) ) {
$this->use_new_payment_method_checkbox();
}
$this->load_scripts();
$this->payment_fields();
}
/**
* Grab and display our saved payment methods.
*
* @since 2.6
*/
public function saved_payment_methods() {
$html = '<p>';
foreach ( $this->tokens as $token ) {
$html .= $this->saved_payment_method( $token );
}
$html .= '</p><span id="wc-' . $this->gateway->id . '-method-count" data-count="' . esc_attr( count( $this->tokens ) ) . '"></span>';
$html .= '<div class="clear"></div>';
echo apply_filters( 'wc_payment_gateway_form_saved_payment_methods_html', $html, $this );
}
/**
* Outputs a saved payment method from a token.
*
* @since 2.6
* @param WC_Payment_Token $token Payment Token
* @return string Generated payment method HTML
*/
public function saved_payment_method( $token ) {
$html = sprintf(
'<input type="radio" id="wc-%1$s-payment-token-%2$s" name="wc-%1$s-payment-token" style="width:auto;" class="wc-gateway-payment-token wc-%1$s-payment-token" value="%2$s" %3$s/>',
esc_attr( $this->gateway->id ),
esc_attr( $token->get_id() ),
checked( $token->is_default(), true, false )
);
$html .= sprintf( '<label class="wc-gateway-payment-form-saved-payment-method wc-gateway-payment-token-label" for="wc-%s-payment-token-%s">',
esc_attr( $this->gateway->id ),
esc_attr( $token->get_id() )
);
$html .= $this->saved_payment_method_title( $token );
$html .= '</label><br />';
return apply_filters( 'wc_payment_gateway_form_saved_payment_method_html', $html, $token, $this );
}
/**
* Outputs a saved payment method's title based on the passed token.
*
* @since 2.6
* @param WC_Payment_Token $token Payment Token
* @return string Generated payment method title HTML
*/
public function saved_payment_method_title( $token ) {
if ( 'CC' == $token->get_type() && is_callable( array( $token, 'get_card_type' ) ) ) {
$type = esc_html__( ucfirst( $token->get_card_type() ), 'woocommerce' );
} else if ( 'eCheck' === $token->get_type() ) {
$type = esc_html__( 'eCheck', 'woocommerce' );
}
$type = apply_filters( 'wc_payment_gateway_form_saved_payment_method_title_type_html', $type, $token, $this );
$title = $type;
if ( is_callable( array( $token, 'get_last4' ) ) ) {
$title .= '&nbsp;' . sprintf( esc_html__( 'ending in %s', 'woocommerce' ), $token->get_last4() );
}
if ( is_callable( array( $token, 'get_expiry_month' ) ) && is_callable( array( $token, 'get_expiry_year' ) ) ) {
$title .= ' ' . sprintf( esc_html__( '(expires %s)', 'woocommerce' ), $token->get_expiry_month() . '/' . substr( $token->get_expiry_year(), 2 ) );
}
return apply_filters( 'wc_payment_gateway_form_saved_payment_method_title_html', $title, $token, $this );
}
/**
* Outputs payment fields for entering new card info.
*
* @since 2.6
*/
public function payment_fields() {
if ( $this->gateway->supports( 'credit_card_form' ) ) {
echo $this->credit_card_payment_fields();
if ( $this->gateway->supports( 'tokenization' ) ) {
$this->save_payment_method_checkbox();
}
} else if ( $this->gateway->supports( 'echeck_form' ) ) {
echo $this->echeck_payment_fields();
if ( $this->gateway->supports( 'tokenization' ) ) {
$this->save_payment_method_checkbox();
}
} else {
echo apply_filters( 'wc_payment_gateway_form_payment_fields_html', '', $this );
}
}
/**
* Filters out tokens not for the current gateway.
*
* @since 2.6
* @param string $gateway_id Gateway ID
* @param array $tokens Set of tokens
* @return array Subset of tokens based on gateway ID
*/
public function filter_tokens_by_gateway( $gateway_id, $tokens ) {
$filtered_tokens = array();
foreach ( $tokens as $key => $token ) {
if ( $gateway_id === $token->get_gateway_id() ) {
$filtered_tokens[ $key ] = $token;
}
}
return $filtered_tokens;
}
/**
* Outputs fields for entering credit card information.
*
* @since 2.6
*/
public function credit_card_payment_fields() {
$html = '';
$fields = array();
$cvc_class = '';
if ( $this->gateway->supports( 'credit_card_form_cvc_on_saved_method' ) ) {
$cvc_class = ' show-if-payment-method-selected';
}
$default_fields = array(
'card-number-field' => '<p class="form-row form-row-wide">
<label for="' . esc_attr( $this->gateway->id ) . '-card-number">' . __( 'Card Number', 'woocommerce' ) . ' <span class="required">*</span></label>
<input id="' . esc_attr( $this->gateway->id ) . '-card-number" class="input-text wc-credit-card-form-card-number" type="text" maxlength="20" autocomplete="off" placeholder="•••• •••• •••• ••••" name="' . esc_attr( $this->gateway->id ) . '-card-number" />
</p>',
'card-expiry-field' => '<p class="form-row form-row-first">
<label for="' . esc_attr( $this->gateway->id ) . '-card-expiry">' . __( 'Expiry (MM/YY)', 'woocommerce' ) . ' <span class="required">*</span></label>
<input id="' . esc_attr( $this->gateway->id ) . '-card-expiry" class="input-text wc-credit-card-form-card-expiry" type="text" autocomplete="off" placeholder="' . esc_attr__( 'MM / YY', 'woocommerce' ) . '" name="' . esc_attr( $this->gateway->id ) . '-card-expiry" />
</p>',
'card-cvc-field' => '<p class="form-row form-row-last' . esc_attr( $cvc_class ) . '">
<label for="' . esc_attr( $this->gateway->id ) . '-card-cvc">' . __( 'Card Code', 'woocommerce' ) . ' <span class="required">*</span></label>
<input id="' . esc_attr( $this->gateway->id ) . '-card-cvc" class="input-text wc-credit-card-form-card-cvc" type="text" autocomplete="off" placeholder="' . esc_attr__( 'CVC', 'woocommerce' ) . '" name="' . esc_attr( $this->gateway->id ) . '-card-cvc" />
</p>',
);
$fields = wp_parse_args( $fields, apply_filters( 'woocommerce_credit_card_form_fields', $default_fields, $this->gateway->id ) );
?>
<fieldset id="wc-<?php echo esc_attr( $this->gateway->id ); ?>-cc-form" class='wc-credit-card-form'>
<?php do_action( 'woocommerce_credit_card_form_start', $this->gateway->id ); ?>
<?php
foreach ( $fields as $field ) {
echo $field;
}
?>
<?php do_action( 'woocommerce_credit_card_form_end', $this->gateway->id ); ?>
<div class="clear"></div>
</fieldset><?php
}
/**
* Outputs fields for entering echeck information.
*
* @since 2.6
* @return string eCheck form HTML
*/
public function echeck_payment_fields() {
$html = '';
$fields = array();
$default_fields = array(
'routing-number' => '<p class="form-row form-row-first">
<label for="' . esc_attr( $this->gateway->id ) . '-routing-number">' . __( 'Routing Number', 'woocommerce' ) . ' <span class="required">*</span></label>
<input id="' . esc_attr( $this->gateway->id ) . '-routing-number" class="input-text wc-echeck-form-routing-number" type="text" maxlength="9" autocomplete="off" placeholder="•••••••••" name="' . esc_attr( $this->gateway->id ) . '-routing-number" />
</p>',
'account-number' => '<p class="form-row form-row-wide">
<label for="' . esc_attr( $this->gateway->id ) . '-account-number">' . __( 'Account Number', 'woocommerce' ) . ' <span class="required">*</span></label>
<input id="' . esc_attr( $this->gateway->id ) . '-account-number" class="input-text wc-echeck-form-account-number" type="text" autocomplete="off" name="' . esc_attr( $this->gateway->id ) . '-account-number" maxlength="17" />
</p>',
);
$fields = wp_parse_args( $fields, apply_filters( 'woocommerce_echeck_form_fields', $default_fields, $this->gateway->id ) );
?>
<fieldset id="<?php echo esc_attr( $this->gateway->id ); ?>-cc-form" class='wc-echeck-form'>
<?php do_action( 'woocommerce_echeck_form_start', $this->gateway->id ); ?>
<?php
foreach ( $fields as $field ) {
echo $field;
}
?>
<?php do_action( 'woocommerce_echeck_form_end', $this->gateway->id ); ?>
<div class="clear"></div>
</fieldset><?php
}
/**
* Outputs a checkbox for saving a new payment method.
*
* @since 2.6
*/
public function save_payment_method_checkbox() {
$html = sprintf(
'<p class="form-row" id="wc-%s-new-payment-method-wrap">',
esc_attr( $this->gateway->id )
);
$html .= sprintf(
'<input name="wc-%1$s-new-payment-method" id="wc-%1$s-new-payment-method" type="checkbox" value="true" style="width:auto;"/>',
esc_attr( $this->gateway->id )
);
$html .= sprintf(
'<label for="wc-%s-new-payment-method" style="display:inline;">%s</label>',
esc_attr( $this->gateway->id ),
esc_html__( 'Save to Account', 'woocommerce' )
);
$html .= '</p><div class="clear"></div>';
echo $html;
}
public function use_new_payment_method_checkbox() {
$html = '<input type="radio" id="wc-' . esc_attr( $this->gateway->id ). '-new" name="wc-' . esc_attr( $this->gateway->id ) . '-payment-token" value="new" style="width:auto;">';
$html .= '<label class="wc-' . esc_attr( $this->gateway->id ) . '-payment-form-new-checkbox wc-gateway-payment-token-label" for="wc-' . esc_attr( $this->gateway->id ) . '-new">';
$html .= esc_html__( 'Use a new payment method', 'woocommerce' );
$html .= '</label>';
echo '<div class="wc-' . esc_attr( $this->gateway->id ) . '-payment-form-new-checkbox-wrap">' . $html . '</div>';
}
public function load_scripts() {
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
wp_enqueue_script(
'woocommerce-payment-gateway-form',
plugins_url( '/assets/js/frontend/payment-gateway-form' . $suffix . '.js', WC_PLUGIN_FILE ),
array( 'jquery' ),
WC()->version
);
wp_localize_script( 'woocommerce-payment-gateway-form', 'woocommercePaymentGatewayParams', array(
'gatewayID' => $this->gateway->id,
'userLoggedIn' => (bool) is_user_logged_in(),
) );
}
}