laipower/wp-content/plugins/easy-digital-downloads/includes/gateways/stripe/includes/template-functions.php

917 lines
32 KiB
PHP

<?php
/**
* Add an errors div
*
* @since 1.0
* @return void
*/
function edds_add_stripe_errors() {
echo '<div id="edd-stripe-payment-errors"></div>';
}
add_action( 'edd_after_cc_fields', 'edds_add_stripe_errors', 999 );
/**
* Stripe uses it's own credit card form because the card details are tokenized.
*
* We don't want the name attributes to be present on the fields in order to prevent them from getting posted to the server
*
* @since 1.7.5
* @return void
*/
function edds_credit_card_form( $echo = true ) {
if ( edd_stripe()->rate_limiting->has_hit_card_error_limit() ) {
edd_set_error( 'edd_stripe_error_limit', __( 'We are unable to process your payment at this time, please try again later or contact support.', 'easy-digital-downloads' ) );
return;
}
ob_start(); ?>
<?php if ( ! wp_script_is( 'edd-stripe-js' ) ) : ?>
<?php edd_stripe_js( true ); ?>
<?php endif; ?>
<?php do_action( 'edd_before_cc_fields' ); ?>
<fieldset id="edd_cc_fields" class="edd-do-validate">
<?php $elements_mode = edds_get_elements_mode(); ?>
<?php if ( 'card-elements' === $elements_mode ) : ?>
<legend><?php esc_html_e( 'Credit Card Info', 'easy-digital-downloads' ); ?></legend>
<?php else: ?>
<legend><?php esc_html_e( 'Payment Info', 'easy-digital-downloads' ); ?></legend>
<?php endif; ?>
<?php if ( is_ssl() ) : ?>
<div id="edd_secure_site_wrapper">
<span class="padlock">
<?php
echo edd_get_payment_icon(
array(
'icon' => 'lock',
'width' => 18,
'height' => 28,
'classes' => array(
'edd-icon',
'edd-icon-lock',
),
)
);
?>
</span>
<span><?php _e( 'This is a secure SSL encrypted payment.', 'easy-digital-downloads' ); ?></span>
</div>
<?php endif; ?>
<?php
if ( 'card-elements' === $elements_mode ) {
$existing_cards = edd_stripe_get_existing_cards( get_current_user_id() );
?>
<?php if ( ! empty( $existing_cards ) ) { edd_stripe_existing_card_field_radio( get_current_user_id() ); } ?>
<?php } ?>
<div class="edd-stripe-new-card" <?php if ( ! empty( $existing_cards ) ) { echo 'style="display: none;"'; } ?>>
<?php do_action( 'edd_stripe_new_card_form' ); ?>
<?php do_action( 'edd_after_cc_expiration' ); ?>
</div>
</fieldset>
<?php
echo edds_get_tokenizer_input();
do_action( 'edd_after_cc_fields' );
$form = ob_get_clean();
if ( false !== $echo ) {
echo $form;
}
return $form;
}
add_action( 'edd_stripe_cc_form', 'edds_credit_card_form' );
/**
* Display the markup for the Stripe new card form
*
* @since 2.6
* @return void
*/
function edd_stripe_new_card_form() {
if ( edd_stripe()->rate_limiting->has_hit_card_error_limit() ) {
edd_set_error( 'edd_stripe_error_limit', __( 'Adding new payment methods is currently unavailable.', 'easy-digital-downloads' ) );
edd_print_errors();
return;
}
$elements_mode = edds_get_elements_mode();
if ( 'payment-elements' === $elements_mode ) {
edds_output_payment_elements_form();
} else {
edds_output_legacy_new_card_form();
}
}
add_action( 'edd_stripe_new_card_form', 'edd_stripe_new_card_form' );
/**
* Add the element for the Stripe Payment Elements to attach to.
*
* @since 2.9.0
*/
function edds_output_payment_elements_form() {
// Payment Elements needs to not allow checking out with mixed carts or multiple subscriptions.
if ( function_exists( 'edd_recurring' ) ) {
if ( ( count( edd_get_cart_contents() ) > 1 && edd_recurring()->cart_contains_recurring() ) || edd_recurring()->cart_is_mixed() ) {
add_filter( 'edd_checkout_button_purchase', '__return_empty_string', 999 );
?>
<div class="edd_errors edd-alert edd-alert-info">
<p class="edd_error" id="edd_error_edd-stripe-incompatible-cart"><?php echo edds_get_single_subscription_cart_error(); ?></p>
</div>
<?php
return;
}
}
// Clear any errors that might be sitting from a previous AJAX loading of errors.
edd_clear_errors();
?>
<div id="edd-card-wrap">
<?php if ( edd_stripe()->has_regional_support && edd_stripe()->regional_support->requires_card_name ) : ?>
<p id="edd-card-name-wrap">
<label for="card_name" class="edd-label">
<?php esc_html_e( 'Name on the Card', 'easy-digital-downloads' ); ?>
<span class="edd-required-indicator">*</span>
</label>
<input type="text" name="card_name" id="card_name" class="card-name edd-input required" placeholder="<?php esc_attr_e( 'Card name', 'easy-digital-downloads' ); ?>" autocomplete="cc-name" required/>
</p>
<?php endif; ?>
<div id="edd-stripe-payment-element"></div>
<p class="edds-field-spacer-shim"></p><!-- Extra spacing -->
</div>
<?php
}
/**
* Add the legacy Card Element fields for users who are still on Card Elements.
*
* @since 2.9.0
*/
function edds_output_legacy_new_card_form() {
$split = edd_get_option( 'stripe_split_payment_fields', false );
?>
<p id="edd-card-name-wrap">
<label for="card_name" class="edd-label">
<?php esc_html_e( 'Name on the Card', 'easy-digital-downloads' ); ?>
<span class="edd-required-indicator">*</span>
</label>
<span class="edd-description"><?php esc_html_e( 'The name printed on the front of your credit card.', 'easy-digital-downloads' ); ?></span>
<input type="text" name="card_name" id="card_name" class="card-name edd-input required" placeholder="<?php esc_attr_e( 'Card name', 'easy-digital-downloads' ); ?>" autocomplete="cc-name" />
</p>
<div id="edd-card-wrap">
<label for="edd-card-element" class="edd-label">
<?php
if ( '1' === $split ) :
esc_html_e( 'Credit Card Number', 'easy-digital-downloads' );
else :
esc_html_e( 'Credit Card', 'easy-digital-downloads' );
endif;
?>
<span class="edd-required-indicator">*</span>
</label>
<div id="edd-stripe-card-element-wrapper">
<?php if ( '1' === $split ) : ?>
<span class="card-type"></span>
<?php endif; ?>
<div id="edd-stripe-card-element" class="edd-stripe-card-element"></div>
</div>
<p class="edds-field-spacer-shim"></p><!-- Extra spacing -->
</div>
<?php if ( '1' === $split ) : ?>
<div id="edd-card-details-wrap">
<p class="edds-field-spacer-shim"></p><!-- Extra spacing -->
<div id="edd-card-exp-wrap">
<label for="edd-card-exp-element" class="edd-label">
<?php esc_html_e( 'Expiration', 'easy-digital-downloads' ); ?>
<span class="edd-required-indicator">*</span>
</label>
<div id="edd-stripe-card-exp-element" class="edd-stripe-card-exp-element"></div>
</div>
<div id="edd-card-cvv-wrap">
<label for="edd-card-exp-element" class="edd-label">
<?php esc_html_e( 'CVC', 'easy-digital-downloads' ); ?>
<span class="edd-required-indicator">*</span>
</label>
<div id="edd-stripe-card-cvc-element" class="edd-stripe-card-cvc-element"></div>
</div>
</div>
<?php endif; ?>
<div id="edd-stripe-card-errors" role="alert"></div>
<?php
/**
* Allow output of extra content before the credit card expiration field.
*
* This content no longer appears before the credit card expiration field
* with the introduction of Stripe Elements.
*
* @deprecated 2.7
* @since unknown
*/
do_action( 'edd_before_cc_expiration' );
}
/**
* Show the checkbox for updating the billing information on an existing Stripe card
*
* @since 2.6
* @return void
*/
function edd_stripe_update_billing_address_field() {
$payment_mode = strtolower( edd_get_chosen_gateway() );
if ( edd_is_checkout() && 'stripe' !== $payment_mode ) {
return;
}
$existing_cards = edd_stripe_get_existing_cards( get_current_user_id() );
if ( empty( $existing_cards ) ) {
return;
}
if ( ! did_action( 'edd_stripe_cc_form' ) ) {
return;
}
$default_card = false;
foreach ( $existing_cards as $existing_card ) {
if ( $existing_card['default'] ) {
$default_card = $existing_card['source'];
break;
}
}
?>
<p class="edd-stripe-update-billing-address-current">
<?php
if ( $default_card ) :
$address_fields = array(
'line1' => isset( $default_card->address_line1 ) ? $default_card->address_line1 : null,
'line2' => isset( $default_card->address_line2 ) ? $default_card->address_line2 : null,
'city' => isset( $default_card->address_city ) ? $default_card->address_city : null,
'state' => isset( $default_card->address_state ) ? $default_card->address_state : null,
'zip' => isset( $default_card->address_zip ) ? $default_card->address_zip : null,
'country' => isset( $default_card->address_country ) ? $default_card->address_country : null,
);
$address_fields = array_filter( $address_fields );
echo esc_html( implode( ', ', $address_fields ) );
endif;
?>
</p>
<p class="edd-stripe-update-billing-address-wrapper">
<input type="checkbox" name="edd_stripe_update_billing_address" id="edd-stripe-update-billing-address" value="1" />
<label for="edd-stripe-update-billing-address">
<?php
echo wp_kses(
sprintf(
/* translators: %1$s Card type. %2$s Card last 4. */
__( 'Update card billing address for %1$s •••• %2$s', 'easy-digital-downloads' ),
'<span class="edd-stripe-update-billing-address-brand">' . ( $default_card ? $default_card->brand : '' ) . '</span>',
'<span class="edd-stripe-update-billing-address-last4">' . ( $default_card ? $default_card->last4 : '' ) . '</span>'
),
array(
'strong' => true,
'span' => array(
'class' => true,
),
)
);
?>
</label>
</p>
<?php
}
add_action( 'edd_cc_billing_top', 'edd_stripe_update_billing_address_field', 10 );
/**
* Display a radio list of existing cards on file for a user ID
*
* @since 2.6
* @param int $user_id
*
* @return void
*/
function edd_stripe_existing_card_field_radio( $user_id = 0 ) {
if ( edd_stripe()->rate_limiting->has_hit_card_error_limit() ) {
edd_set_error( 'edd_stripe_error_limit', __( 'We are unable to process your payment at this time, please try again later or contacts support.', 'easy-digital-downloads' ) );
return;
}
// Can't use just edd_is_checkout() because this could happen in an AJAX request.
$is_checkout = edd_is_checkout() || ( isset( $_REQUEST['action'] ) && 'edd_load_gateway' === $_REQUEST['action'] );
edd_stripe_css( true );
$existing_cards = edd_stripe_get_existing_cards( $user_id );
if ( ! empty( $existing_cards ) ) : ?>
<div class="edd-stripe-card-selector edd-card-selector-radio">
<?php foreach ( $existing_cards as $card ) : ?>
<?php $source = $card['source']; ?>
<div class="edd-stripe-card-radio-item existing-card-wrapper <?php if ( $card['default'] ) { echo ' selected'; } ?>">
<input
type="hidden"
id="<?php echo esc_attr( $source->id ); ?>-billing-details"
data-address_city="<?php echo esc_attr( $source->address_city ); ?>"
data-address_country="<?php echo esc_attr( $source->address_country ); ?>"
data-address_line1="<?php echo esc_attr( $source->address_line1 ); ?>"
data-address_line2="<?php echo esc_attr( $source->address_line2 ); ?>"
data-address_state="<?php echo esc_attr( $source->address_state ); ?>"
data-address_zip="<?php echo esc_attr( $source->address_zip ); ?>"
data-brand="<?php echo esc_attr( $source->brand ); ?>"
data-last4="<?php echo esc_attr( $source->last4 ); ?>"
/>
<label for="<?php echo esc_attr( $source->id ); ?>">
<input <?php checked( true, $card['default'], true ); ?> type="radio" id="<?php echo esc_attr( $source->id ); ?>" name="edd_stripe_existing_card" value="<?php echo esc_attr( $source->id ); ?>" class="edd-stripe-existing-card">
<span class="card-label">
<span class="card-data">
<span class="card-name-number">
<?php
echo wp_kses(
sprintf(
/* translators: %1$s Card type. %2$s Card last 4. */
__( '%1$s •••• %2$s', 'easy-digital-downloads' ),
'<span class="card-brand">' . $source->brand . '</span>',
'<span class="card-last-4">' . $source->last4 . '</span>'
),
array(
'span' => array(
'class' => true,
),
)
);
?>
</span>
<small class="card-expires-on">
<span class="default-card-sep"><?php echo '&nbsp;&nbsp;&nbsp;'; ?></span>
<span class="card-expiration">
<?php echo $source->exp_month . '/' . $source->exp_year; ?>
</span>
</small>
</span>
<?php
$current = strtotime( date( 'm/Y' ) );
$exp_date = strtotime( $source->exp_month . '/' . $source->exp_year );
if ( $exp_date < $current ) :
?>
<span class="card-expired">
<?php _e( 'Expired', 'easy-digital-downloads' ); ?>
</span>
<?php
endif;
?>
</span>
</label>
</div>
<?php endforeach; ?>
<div class="edd-stripe-card-radio-item new-card-wrapper">
<label for="edd-stripe-add-new">
<input type="radio" id="edd-stripe-add-new" class="edd-stripe-existing-card" name="edd_stripe_existing_card" value="new" />
<span class="add-new-card"><?php _e( 'Add New Card', 'easy-digital-downloads' ); ?></span>
</label>
</div>
</div>
<?php endif;
}
/**
* Output the management interface for a user's Stripe card
*
* @since 2.6
* @return void
*/
function edd_stripe_manage_cards() {
if ( false === edds_is_gateway_active() ) {
return;
}
$enabled = edd_stripe_existing_cards_enabled();
if ( ! $enabled ) {
return;
}
$stripe_customer_id = edds_get_stripe_customer_id( get_current_user_id() );
if ( empty( $stripe_customer_id ) ) {
return;
}
if ( edd_stripe()->rate_limiting->has_hit_card_error_limit() ) {
edd_set_error( 'edd_stripe_error_limit', __( 'Payment method management is currently unavailable.', 'easy-digital-downloads' ) );
edd_print_errors();
return;
}
$existing_cards = edd_stripe_get_existing_cards( get_current_user_id() );
edd_stripe_css( true );
edd_stripe_js( true );
$display = edd_get_option( 'stripe_billing_fields', 'full' );
?>
<div id="edd-stripe-manage-cards">
<fieldset>
<legend><?php _e( 'Manage Payment Methods', 'easy-digital-downloads' ); ?></legend>
<input type="hidden" id="stripe-update-card-user_id" name="stripe-update-user-id" value="<?php echo esc_attr( get_current_user_id() ); ?>" />
<?php if ( ! empty( $existing_cards ) ) : ?>
<?php foreach( $existing_cards as $card ) : ?>
<?php $source = $card['source']; ?>
<div id="<?php echo esc_attr( $source->id ); ?>_card_item" class="edd-stripe-card-item">
<span class="card-details">
<?php
echo wp_kses(
sprintf(
__( '%1$s •••• %2$s', 'easy-digital-downloads' ),
'<span class="card-brand">' . esc_html( $source->brand ) . '</span>',
'<span class="card-last-4">' . esc_html( $source->last4 ) . '</span>'
),
array(
'span' => array(
'class' => true,
),
)
);
?>
<?php if ( $card['default'] ) { ?>
<span class="default-card-sep"><?php echo '&mdash; '; ?></span>
<span class="card-is-default"><?php _e( 'Default', 'easy-digital-downloads'); ?></span>
<?php } ?>
</span>
<span class="card-meta">
<span class="card-expiration"><span class="card-expiration-label"><?php _e( 'Expires', 'easy-digital-downloads' ); ?>: </span><span class="card-expiration-date"><?php echo $source->exp_month; ?>/<?php echo $source->exp_year; ?></span></span>
<span class="card-address">
<?php
$address_fields = array(
'line1' => isset( $source->address_line1 ) ? $source->address_line1 : '',
'zip' => isset( $source->address_zip ) ? $source->address_zip : '',
'country' => isset( $source->address_country ) ? $source->address_country : '',
);
echo esc_html( implode( ' ', $address_fields ) );
?>
</span>
</span>
<span id="<?php echo esc_attr( $source->id ); ?>-card-actions" class="card-actions">
<span class="card-update">
<a href="#" class="edd-stripe-update-card" data-source="<?php echo esc_attr( $source->id ); ?>"><?php _e( 'Update', 'easy-digital-downloads' ); ?></a>
</span>
<?php if ( ! $card['default'] ) : ?>
|
<span class="card-set-as-default">
<a href="#" class="edd-stripe-default-card" data-source="<?php echo esc_attr( $source->id ); ?>"><?php _e( 'Set as Default', 'easy-digital-downloads' ); ?></a>
</span>
<?php
endif;
$can_delete = apply_filters( 'edd_stripe_can_delete_card', true, $card, $existing_cards );
if ( $can_delete ) :
?>
|
<span class="card-delete">
<a href="#" class="edd-stripe-delete-card delete" data-source="<?php echo esc_attr( $source->id ); ?>"><?php _e( 'Delete', 'easy-digital-downloads' ); ?></a>
</span>
<?php endif; ?>
<span style="display: none;" class="edd-loading-ajax edd-loading"></span>
</span>
<form id="<?php echo esc_attr( $source->id ); ?>-update-form" class="card-update-form" data-source="<?php echo esc_attr( $source->id ); ?>">
<label><?php _e( 'Billing Details', 'easy-digital-downloads' ); ?></label>
<div class="card-address-fields">
<p class="edds-card-address-field edds-card-address-field--address1">
<?php
echo EDD()->html->text( array(
'id' => sprintf( 'edds_address_line1_%1$s', $source->id ),
'value' => sanitize_text_field( isset( $source->address_line1 ) ? $source->address_line1 : '' ),
'label' => esc_html__( 'Address Line 1', 'easy-digital-downloads' ),
'name' => 'address_line1',
'class' => 'card-update-field address_line1 text edd-input',
'data' => array(
'key' => 'address_line1',
)
) );
?>
</p>
<p class="edds-card-address-field edds-card-address-field--address2">
<?php
echo EDD()->html->text( array(
'id' => sprintf( 'edds_address_line2_%1$s', $source->id ),
'value' => sanitize_text_field( isset( $source->address_line2 ) ? $source->address_line2 : '' ),
'label' => esc_html__( 'Address Line 2', 'easy-digital-downloads' ),
'name' => 'address_line2',
'class' => 'card-update-field address_line2 text edd-input',
'data' => array(
'key' => 'address_line2',
)
) );
?>
</p>
<p class="edds-card-address-field edds-card-address-field--city">
<?php
echo EDD()->html->text( array(
'id' => sprintf( 'edds_address_city_%1$s', $source->id ),
'value' => sanitize_text_field( isset( $source->address_city ) ? $source->address_city : '' ),
'label' => esc_html__( 'City', 'easy-digital-downloads' ),
'name' => 'address_city',
'class' => 'card-update-field address_city text edd-input',
'data' => array(
'key' => 'address_city',
)
) );
?>
</p>
<p class="edds-card-address-field edds-card-address-field--zip">
<?php
echo EDD()->html->text( array(
'id' => sprintf( 'edds_address_zip_%1$s', $source->id ),
'value' => sanitize_text_field( isset( $source->address_zip ) ? $source->address_zip : '' ),
'label' => esc_html__( 'ZIP Code', 'easy-digital-downloads' ),
'name' => 'address_zip',
'class' => 'card-update-field address_zip text edd-input',
'data' => array(
'key' => 'address_zip',
)
) );
?>
</p>
<p class="edds-card-address-field edds-card-address-field--country">
<label for="<?php echo esc_attr( sprintf( 'edds_address_country_%1$s', $source->id ) ); ?>">
<?php esc_html_e( 'Country', 'easy-digital-downloads' ); ?>
</label>
<?php
$countries = array_filter( edd_get_country_list() );
$country = isset( $source->address_country ) ? $source->address_country : edd_get_shop_country();
echo EDD()->html->select( array(
'id' => sprintf( 'edds_address_country_%1$s', $source->id ),
'name' => 'address_country',
'label' => esc_html__( 'Country', 'easy-digital-downloads' ),
'options' => $countries,
'selected' => $country,
'class' => 'card-update-field address_country',
'data' => array( 'key' => 'address_country' ),
'show_option_all' => false,
'show_option_none' => false,
) );
?>
</p>
<p class="edds-card-address-field edds-card-address-field--state">
<label for="<?php echo esc_attr( sprintf( 'edds_address_state_%1$s', $source->id ) ); ?>">
<?php esc_html_e( 'State', 'easy-digital-downloads' ); ?>
</label>
<?php
$selected_state = isset( $source->address_state ) ? $source->address_state : edd_get_shop_state();
$states = edd_get_shop_states( $country );
echo EDD()->html->select( array(
'id' => sprintf( 'edds_address_state_%1$s', $source->id ),
'name' => 'address_state',
'options' => $states,
'selected' => $selected_state,
'class' => 'card-update-field address_state card_state',
'data' => array( 'key' => 'address_state' ),
'show_option_all' => false,
'show_option_none' => false,
) );
?>
</p>
</div>
<p class="card-expiration-fields">
<label for="<?php echo esc_attr( sprintf( 'edds_card_exp_month_%1$s', $source->id ) ); ?>" class="edd-label">
<?php _e( 'Expiration (MM/YY)', 'easy-digital-downloads' ); ?>
</label>
<?php
$months = array_combine( $r = range( 1, 12 ), $r );
echo EDD()->html->select( array(
'id' => sprintf( 'edds_card_exp_month_%1$s', $source->id ),
'name' => 'exp_month',
'options' => $months,
'selected' => $source->exp_month,
'class' => 'card-expiry-month edd-select edd-select-small card-update-field exp_month',
'data' => array( 'key' => 'exp_month' ),
'show_option_all' => false,
'show_option_none' => false,
) );
?>
<span class="exp-divider"> / </span>
<?php
$years = array_combine( $r = range( date( 'Y' ), date( 'Y' ) + 30 ), $r );
echo EDD()->html->select( array(
'id' => sprintf( 'edds_card_exp_year_%1$s', $source->id ),
'name' => 'exp_year',
'options' => $years,
'selected' => $source->exp_year,
'class' => 'card-expiry-year edd-select edd-select-small card-update-field exp_year',
'data' => array( 'key' => 'exp_year' ),
'show_option_all' => false,
'show_option_none' => false,
) );
?>
</p>
<p>
<input
type="submit"
class="edd-stripe-submit-update"
data-loading="<?php echo esc_attr__( 'Please Wait…', 'easy-digital-downloads' ); ?>"
data-submit="<?php echo esc_attr__( 'Update Card', 'easy-digital-downloads' ); ?>"
value="<?php echo esc_attr__( 'Update Card', 'easy-digital-downloads' ); ?>"
/>
<a href="#" class="edd-stripe-cancel-update" data-source="<?php echo esc_attr( $source->id ); ?>"><?php _e( 'Cancel', 'easy-digital-downloads' ); ?></a>
<input type="hidden" name="card_id" data-key="id" value="<?php echo esc_attr( $source->id ); ?>" />
<?php
wp_nonce_field( $source->id . '_update', 'card_update_nonce_' . $source->id, true );
echo edds_get_tokenizer_input( $source->id );
?>
</p>
</form>
</div>
<?php endforeach; ?>
<?php endif; ?>
<form id="edd-stripe-add-new-card">
<div class="edd-stripe-add-new-card edd-stripe-new-card" style="display: none;">
<label><?php _e( 'Add New Card', 'easy-digital-downloads' ); ?></label>
<fieldset id="edd_cc_card_info" class="cc-card-info">
<legend><?php _e( 'Credit Card Details', 'easy-digital-downloads' ); ?></legend>
<?php do_action( 'edd_stripe_new_card_form' ); ?>
</fieldset>
<?php
switch( $display ) {
case 'full' :
edd_default_cc_address_fields();
break;
case 'zip_country' :
edd_stripe_zip_and_country();
add_filter( 'edd_purchase_form_required_fields', 'edd_stripe_require_zip_and_country' );
break;
}
?>
</div>
<div class="edd-stripe-add-card-errors"></div>
<div class="edd-stripe-add-card-actions">
<input
type="submit"
class="edd-button edd-stripe-add-new"
data-loading="<?php echo esc_attr__( 'Please Wait…', 'easy-digital-downloads' ); ?>"
data-submit="<?php echo esc_attr__( 'Add new card', 'easy-digital-downloads' ); ?>"
value="<?php echo esc_attr__( 'Add new card', 'easy-digital-downloads' ); ?>"
/>
<a href="#" id="edd-stripe-add-new-cancel" style="display: none;"><?php _e( 'Cancel', 'easy-digital-downloads' ); ?></a>
<?php
wp_nonce_field( 'edd-stripe-add-card', 'edd-stripe-add-card-nonce', false, true );
echo edds_get_tokenizer_input();
?>
</div>
</form>
</fieldset>
</div>
<?php
}
add_action( 'edd_profile_editor_after', 'edd_stripe_manage_cards' );
/**
* Determines if the default Profile Editor's "Billing Address"
* fields should be hidden.
*
* If using Stripe + Saved Cards (and Stripe is the only active gateway)
* the information set in "Billing Address" is never utilized:
*
* - When using an existing Card that Card's billing address is used.
* - When adding a new Card the address form is blanked.
*
* @since 2.8.0
*/
function edd_stripe_maybe_hide_profile_editor_billing_address() {
if ( false === edds_is_gateway_active() ) {
return;
}
// Only hide if Stripe is the only active gateway.
$active_gateways = edd_get_enabled_payment_gateways();
if ( ! ( 1 === count( $active_gateways ) && isset( $active_gateways['stripe'] ) ) ) {
return;
}
// Only hide if using Saved Cards.
$use_saved_cards = edd_stripe_existing_cards_enabled();
if ( false === $use_saved_cards ) {
return;
}
// Allow a default addres to be entered for the first Card
// if the Profile Editor is found before Checkout.
$existing_cards = edd_stripe_get_existing_cards( get_current_user_id() );
if ( empty( $existing_cards ) ) {
return;
}
echo '<style>#edd_profile_address_fieldset { display: none; }</style>';
}
add_action( 'edd_profile_editor_after', 'edd_stripe_maybe_hide_profile_editor_billing_address' );
/**
* Zip / Postal Code field for when full billing address is disabled
*
* @since 2.5
* @return void
*/
function edd_stripe_zip_and_country() {
$logged_in = is_user_logged_in();
$customer = EDD()->session->get( 'customer' );
$customer = wp_parse_args( $customer, array( 'address' => array(
'line1' => '',
'line2' => '',
'city' => '',
'zip' => '',
'state' => '',
'country' => ''
) ) );
$customer['address'] = array_map( 'sanitize_text_field', $customer['address'] );
if( $logged_in ) {
$existing_cards = edd_stripe_get_existing_cards( get_current_user_id() );
if ( empty( $existing_cards ) ) {
$user_address = edd_get_customer_address( get_current_user_id() );
foreach( $customer['address'] as $key => $field ) {
if ( empty( $field ) && ! empty( $user_address[ $key ] ) ) {
$customer['address'][ $key ] = $user_address[ $key ];
} else {
$customer['address'][ $key ] = '';
}
}
} else {
foreach ( $existing_cards as $card ) {
if ( false === $card['default'] ) {
continue;
}
$source = $card['source'];
$customer['address'] = array(
'line1' => $source->address_line1,
'line2' => $source->address_line2,
'city' => $source->address_city,
'zip' => $source->address_zip,
'state' => $source->address_state,
'country' => $source->address_country,
);
}
}
}
?>
<fieldset id="edd_cc_address" class="cc-address">
<legend><?php _e( 'Billing Details', 'easy-digital-downloads' ); ?></legend>
<p id="edd-card-country-wrap">
<label for="billing_country" class="edd-label">
<?php _e( 'Billing Country', 'easy-digital-downloads' ); ?>
<?php if( edd_field_is_required( 'billing_country' ) ) { ?>
<span class="edd-required-indicator">*</span>
<?php } ?>
</label>
<span class="edd-description"><?php _e( 'The country for your billing address.', 'easy-digital-downloads' ); ?></span>
<select name="billing_country" id="billing_country" class="billing_country edd-select<?php if( edd_field_is_required( 'billing_country' ) ) { echo ' required'; } ?>"<?php if( edd_field_is_required( 'billing_country' ) ) { echo ' required '; } ?> autocomplete="billing country">
<?php
$selected_country = edd_get_shop_country();
if( ! empty( $customer['address']['country'] ) && '*' !== $customer['address']['country'] ) {
$selected_country = $customer['address']['country'];
}
$countries = edd_get_country_list();
foreach( $countries as $country_code => $country ) {
echo '<option value="' . esc_attr( $country_code ) . '"' . selected( $country_code, $selected_country, false ) . '>' . esc_html( $country ) . '</option>';
}
?>
</select>
</p>
<p id="edd-card-zip-wrap">
<label for="card_zip" class="edd-label">
<?php _e( 'Billing Zip / Postal Code', 'easy-digital-downloads' ); ?>
<?php if( edd_field_is_required( 'card_zip' ) ) { ?>
<span class="edd-required-indicator">*</span>
<?php } ?>
</label>
<span class="edd-description"><?php _e( 'The zip or postal code for your billing address.', 'easy-digital-downloads' ); ?></span>
<input type="text" size="4" name="card_zip" id="card_zip" class="card-zip edd-input<?php if( edd_field_is_required( 'card_zip' ) ) { echo ' required'; } ?>" placeholder="<?php _e( 'Zip / Postal Code', 'easy-digital-downloads' ); ?>" value="<?php echo esc_attr( $customer['address']['zip'] ); ?>"<?php if( edd_field_is_required( 'card_zip' ) ) { echo ' required '; } ?> autocomplete="billing postal-code" />
</p>
</fieldset>
<?php
}
/**
* Determine how the billing address fields should be displayed
*
* @access public
* @since 2.5
* @return void
*/
function edd_stripe_setup_billing_address_fields() {
if ( 'stripe' !== edd_get_chosen_gateway() || ! edd_get_cart_total() > 0 ) {
return;
}
$hook = 'payment-elements' === edds_get_elements_mode() || apply_filters( 'edds_address_before_payment', false ) ? 'edd_before_cc_fields' : 'edd_after_cc_fields';
if ( edd_use_taxes() ) {
remove_action( 'edd_after_cc_fields', 'edd_default_cc_address_fields' );
add_action( $hook, 'edd_default_cc_address_fields' );
return;
}
$display = edd_get_option( 'stripe_billing_fields', 'full' );
switch ( $display ) {
case 'full':
// Make address fields required.
add_filter( 'edd_require_billing_address', '__return_true' );
remove_action( 'edd_after_cc_fields', 'edd_default_cc_address_fields' );
add_action( $hook, 'edd_default_cc_address_fields' );
break;
case 'zip_country':
remove_action( 'edd_after_cc_fields', 'edd_default_cc_address_fields', 10 );
add_action( $hook, 'edd_stripe_zip_and_country', 9 );
// Make Zip required.
add_filter( 'edd_purchase_form_required_fields', 'edd_stripe_require_zip_and_country' );
break;
case 'none':
remove_action( 'edd_after_cc_fields', 'edd_default_cc_address_fields', 10 );
break;
}
}
add_action( 'init', 'edd_stripe_setup_billing_address_fields', 9 );
/**
* Force zip code and country to be required when billing address display is zip only
*
* @access public
* @since 2.5
* @return array $fields The required fields
*/
function edd_stripe_require_zip_and_country( $fields ) {
$fields['card_zip'] = array(
'error_id' => 'invalid_zip_code',
'error_message' => __( 'Please enter your zip / postal code', 'easy-digital-downloads' )
);
$fields['billing_country'] = array(
'error_id' => 'invalid_country',
'error_message' => __( 'Please select your billing country', 'easy-digital-downloads' )
);
return $fields;
}