bottega/simple-membership/views/payments/payment-gateway/stripe_button_shortcode_view.php

313 lines
15 KiB
PHP

<?php
/* * ************************************************
* Stripe Buy Now button shortcode handler
* *********************************************** */
add_filter( 'swpm_payment_button_shortcode_for_stripe_buy_now', 'swpm_render_stripe_buy_now_button_sc_output', 10, 2 );
function swpm_render_stripe_buy_now_button_sc_output( $button_code, $args ) {
$button_id = isset( $args['id'] ) ? $args['id'] : '';
if ( empty( $button_id ) ) {
return '<p class="swpm-red-box">Error! swpm_render_stripe_buy_now_button_sc_output() function requires the button ID value to be passed to it.</p>';
}
//Get class option for button styling, set Stripe's default if none specified
$class = isset( $args['class'] ) ? $args['class'] : 'stripe-button-el';
//Check new_window parameter
$window_target = isset( $args['new_window'] ) ? 'target="_blank"' : '';
$button_text = ( isset( $args['button_text'] ) ) ? esc_attr( $args['button_text'] ) : SwpmUtils::_( 'Buy Now' );
$item_logo = ''; //Can be used to show an item logo or thumbnail in the checkout form.
$settings = SwpmSettings::get_instance();
$button_cpt = get_post( $button_id ); //Retrieve the CPT for this button
$item_name = htmlspecialchars( $button_cpt->post_title );
$membership_level_id = get_post_meta( $button_id, 'membership_level_id', true );
//Verify that this membership level exists (to prevent user paying for a level that has been deleted)
if ( ! SwpmUtils::membership_level_id_exists( $membership_level_id ) ) {
return '<p class="swpm-red-box">Error! The membership level specified in this button does not exist. You may have deleted this membership level. Edit the button and use the correct membership level.</p>';
}
//Payment amount and currency
$payment_amount = get_post_meta( $button_id, 'payment_amount', true );
if ( ! is_numeric( $payment_amount ) ) {
return '<p class="swpm-red-box">Error! The payment amount value of the button must be a numeric number. Example: 49.50 </p>';
}
$payment_currency = get_post_meta( $button_id, 'payment_currency', true );
$payment_amount = round( $payment_amount, 2 ); //round the amount to 2 decimal place.
$zeroCents = unserialize( SIMPLE_WP_MEMBERSHIP_STRIPE_ZERO_CENTS );
if ( in_array( $payment_currency, $zeroCents ) ) {
//this is zero-cents currency, amount shouldn't be multiplied by 100
$price_in_cents = $payment_amount;
} else {
$price_in_cents = $payment_amount * 100; //The amount (in cents). This value is passed to Stripe API.
}
$payment_amount_formatted = SwpmMiscUtils::format_money( $payment_amount, $payment_currency );
//Return, cancel, notifiy URLs
$notify_url = SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL . '/?swpm_process_stripe_buy_now=1'; //We are going to use it to do post payment processing.
//$button_image_url = get_post_meta($button_id, 'button_image_url', true);//Stripe doesn't currenty support button image for their standard checkout.
//User's IP address
$user_ip = SwpmUtils::get_user_ip_address();
$_SESSION['swpm_payment_button_interaction'] = $user_ip;
//Custom field data
$custom_field_value = 'subsc_ref=' . $membership_level_id;
$custom_field_value .= '&user_ip=' . $user_ip;
if ( SwpmMemberUtils::is_member_logged_in() ) {
$custom_field_value .= '&swpm_id=' . SwpmMemberUtils::get_logged_in_members_id();
}
$custom_field_value = apply_filters( 'swpm_custom_field_value_filter', $custom_field_value );
//Sandbox settings
$sandbox_enabled = $settings->get_value( 'enable-sandbox-testing' );
//API keys
$api_keys = SwpmMiscUtils::get_stripe_api_keys_from_payment_button( $button_id, ! $sandbox_enabled );
//prefill member email
$prefill_member_email = $settings->get_value( 'stripe-prefill-member-email' );
if ( $prefill_member_email ) {
$auth = SwpmAuth::get_instance();
$member_email = $auth->get( 'email' );
}
//Billing address
$billing_address = isset( $args['billing_address'] ) ? '1' : '';
//By default don't show the billing address in the checkout form.
//if billing_address parameter is not present in the shortcode, let's check button option
if ( $billing_address === '' ) {
$collect_address = get_post_meta( $button_id, 'stripe_collect_address', true );
if ( $collect_address === '1' ) {
//Collect Address enabled in button settings
$billing_address = 1;
}
}
$uniqid = uniqid();
/* === Stripe Buy Now Button Form === */
$output = '';
$output .= '<div class="swpm-button-wrapper swpm-stripe-buy-now-wrapper">';
$output .= "<form id='swpm-stripe-payment-form-" . $uniqid . "' action='" . $notify_url . "' METHOD='POST'> ";
$output .= "<div style='display: none !important'>";
$output .= "<script src='https://checkout.stripe.com/checkout.js' class='stripe-button'
data-key='" . $api_keys['public'] . "'
data-panel-label='Pay'
data-amount='{$price_in_cents}'
data-name='{$item_name}'";
$output .= isset( $member_email ) ? sprintf( 'data-email="%s"', $member_email ) : '';
$output .= "data-description='{$payment_amount_formatted}'";
$output .= "data-locale='auto'";
$output .= "data-label='{$button_text}'"; //Stripe doesn't currenty support button image for their standard checkout.
$output .= "data-currency='{$payment_currency}'";
if ( ! empty( $item_logo ) ) {//Show item logo/thumbnail in the stripe payment window
$output .= "data-image='{$item_logo}'";
}
if ( ! empty( $billing_address ) ) {//Show billing address in the stipe payment window
$output .= "data-billing-address='true'";
}
$output .= apply_filters( 'swpm_stripe_additional_checkout_data_parameters', '' ); //Filter to allow the addition of extra data parameters for stripe checkout.
$output .= '></script>';
$output .= '</div>';
//apply filter to output additional form fields
$coupon_input = '';
$coupon_input = apply_filters( 'swpm_payment_form_additional_fields', $coupon_input, $button_id, $uniqid );
if ( ! empty( $coupon_input ) ) {
$output .= $coupon_input;
}
$button_image_url = get_post_meta( $button_id, 'button_image_url', true );
if ( ! empty( $button_image_url ) ) {
$output .= '<input type="image" src="' . $button_image_url . '" class="' . $class . '" alt="' . $button_text . '" title="' . $button_text . '" />';
} else {
$output .= "<button id='{$button_id}' type='submit' class='{$class}'><span>{$button_text}</span></button>";
}
$output .= wp_nonce_field( 'stripe_payments', '_wpnonce', true, false );
$output .= '<input type="hidden" name="item_number" value="' . $button_id . '" />';
$output .= "<input type='hidden' value='{$item_name}' name='item_name' />";
$output .= "<input type='hidden' value='{$payment_amount}' name='item_price' />";
$output .= "<input type='hidden' value='{$payment_currency}' name='currency_code' />";
$output .= "<input type='hidden' value='{$custom_field_value}' name='custom' />";
//Filter to add additional payment input fields to the form.
$output .= apply_filters( 'swpm_stripe_payment_form_additional_fields', '' );
$output .= '</form>';
$output .= '</div>'; //End .swpm_button_wrapper
return $output;
}
add_filter( 'swpm_payment_button_shortcode_for_stripe_subscription', 'swpm_render_stripe_subscription_button_sc_output', 10, 2 );
function swpm_render_stripe_subscription_button_sc_output( $button_code, $args ) {
$button_id = isset( $args['id'] ) ? $args['id'] : '';
if ( empty( $button_id ) ) {
return '<p class="swpm-red-box">Error! swpm_render_stripe_buy_now_button_sc_output() function requires the button ID value to be passed to it.</p>';
}
//Get class option for button styling, set Stripe's default if none specified
$class = isset( $args['class'] ) ? $args['class'] : 'stripe-button-el';
//Check new_window parameter
$window_target = isset( $args['new_window'] ) ? 'target="_blank"' : '';
$button_text = ( isset( $args['button_text'] ) ) ? esc_attr( $args['button_text'] ) : SwpmUtils::_( 'Buy Now' );
$item_logo = ''; //Can be used to show an item logo or thumbnail in the checkout form.
$settings = SwpmSettings::get_instance();
$button_cpt = get_post( $button_id ); //Retrieve the CPT for this button
$item_name = htmlspecialchars( $button_cpt->post_title );
$membership_level_id = get_post_meta( $button_id, 'membership_level_id', true );
//Verify that this membership level exists (to prevent user paying for a level that has been deleted)
if ( ! SwpmUtils::membership_level_id_exists( $membership_level_id ) ) {
return '<p class="swpm-red-box">Error! The membership level specified in this button does not exist. You may have deleted this membership level. Edit the button and use the correct membership level.</p>';
}
//Return, cancel, notifiy URLs
$notify_url = SIMPLE_WP_MEMBERSHIP_SITE_HOME_URL . '/?swpm_process_stripe_subscription=1'; //We are going to use it to do post payment processing.
//$button_image_url = get_post_meta($button_id, 'button_image_url', true);//Stripe doesn't currenty support button image for their standard checkout.
//User's IP address
$user_ip = SwpmUtils::get_user_ip_address();
$_SESSION['swpm_payment_button_interaction'] = $user_ip;
//Custom field data
$custom_field_value = 'subsc_ref=' . $membership_level_id;
$custom_field_value .= '&user_ip=' . $user_ip;
if ( SwpmMemberUtils::is_member_logged_in() ) {
$custom_field_value .= '&swpm_id=' . SwpmMemberUtils::get_logged_in_members_id();
}
$custom_field_value = apply_filters( 'swpm_custom_field_value_filter', $custom_field_value );
//Sandbox settings
$sandbox_enabled = $settings->get_value( 'enable-sandbox-testing' );
//API keys
$api_keys = SwpmMiscUtils::get_stripe_api_keys_from_payment_button( $button_id, ! $sandbox_enabled );
//prefill member email
$prefill_member_email = $settings->get_value( 'stripe-prefill-member-email' );
if ( $prefill_member_email ) {
$auth = SwpmAuth::get_instance();
$member_email = $auth->get( 'email' );
}
$plan_id = get_post_meta( $button_id, 'stripe_plan_id', true );
$plan_data = get_post_meta( $button_id, 'stripe_plan_data', true );
if ( empty( $plan_data ) ) {
//no plan data available, let's try to request one
if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
//This server's PHP version can't handle the library.
$error_msg = '<div class="swpm-red-box">';
$error_msg .= '<p>The Stripe Subscription payment gateway library requires at least PHP 5.4.0. Your server is using a very old version of PHP.</p>';
$error_msg .= '<p>Request your hosting provider to upgrade your PHP to a more recent version then you will be able to use the Stripe Subscription.<p>';
$error_msg .= '</div>';
return $error_msg;
}
require_once SIMPLE_WP_MEMBERSHIP_PATH . 'lib/stripe-util-functions.php';
$result = StripeUtilFunctions::get_stripe_plan_info( $api_keys['secret'], $plan_id );
if ( $result['success'] === false ) {
// some error occurred, let's display it and stop processing the shortcode further
return '<p class="swpm-red-box">Stripe error occurred: ' . $result['error_msg'] . '</p>';
} else {
// plan data has been successfully retreived
$plan_data = $result['plan_data'];
// Let's update post_meta in order to not re-request the data again on each button display
update_post_meta( $button_id, 'stripe_plan_data', $plan_data );
}
}
//let's set some vars
$price_in_cents = $plan_data['amount'];
$payment_currency = strtoupper( $plan_data['currency'] );
$zeroCents = unserialize( SIMPLE_WP_MEMBERSHIP_STRIPE_ZERO_CENTS );
if ( in_array( $payment_currency, $zeroCents ) ) {
//this is zero-cents currency, amount shouldn't be devided by 100
$payment_amount = $price_in_cents;
} else {
$payment_amount = $price_in_cents / 100;
}
$interval_count = $plan_data['interval_count'];
$interval = $plan_data['interval'];
$trial = $plan_data['trial_period_days'];
$plan_name = $plan_data['name'];
$description = $payment_amount . ' ' . $payment_currency;
if ( $interval_count == 1 ) {
$description .= ' / ' . $interval;
} else {
$description .= ' every ' . $plan_data['interval_count'] . ' ' . $plan_data['interval'] . 's';
}
// this should add info on trial period if available, but Stripe strips too long strings, so we leave it commented out for now.
// if ($trial != NULL) {
// $description .= '. '.$trial . ' days FREE trial.';
// }
//Billing address
$billing_address = isset( $args['billing_address'] ) ? '1' : '';
//By default don't show the billing address in the checkout form.
//if billing_address parameter is not present in the shortcode, let's check button option
if ( $billing_address === '' ) {
$collect_address = get_post_meta( $button_id, 'stripe_collect_address', true );
if ( $collect_address === '1' ) {
//Collect Address enabled in button settings
$billing_address = 1;
}
}
/* === Stripe Buy Now Button Form === */
$output = '';
$output .= '<div class="swpm-button-wrapper swpm-stripe-buy-now-wrapper">';
$output .= "<form action='" . $notify_url . "' METHOD='POST'> ";
$output .= "<div style='display: none !important'>";
$output .= "<script src='https://checkout.stripe.com/checkout.js' class='stripe-button'
data-key='" . $api_keys['public'] . "'
data-panel-label='Sign Me Up!'
data-name='{$item_name}'";
$output .= isset( $member_email ) ? sprintf( 'data-email="%s"', $member_email ) : '';
$output .= "data-description='{$description}'";
$output .= "data-locale='auto'";
$output .= "data-label='{$button_text}'"; //Stripe doesn't currenty support button image for their standard checkout.
$output .= "data-currency='{$payment_currency}'";
if ( ! empty( $item_logo ) ) {//Show item logo/thumbnail in the stripe payment window
$output .= "data-image='{$item_logo}'";
}
if ( ! empty( $billing_address ) ) {//Show billing address in the stipe payment window
$output .= "data-billing-address='true'";
}
$output .= apply_filters( 'swpm_stripe_additional_checkout_data_parameters', '' ); //Filter to allow the addition of extra data parameters for stripe checkout.
$output .= '></script>';
$output .= '</div>';
$button_image_url = get_post_meta( $button_id, 'button_image_url', true );
if ( ! empty( $button_image_url ) ) {
$output .= '<input type="image" src="' . $button_image_url . '" class="' . $class . '" alt="' . $button_text . '" title="' . $button_text . '" />';
} else {
$output .= "<button id='{$button_id}' type='submit' class='{$class}'><span>{$button_text}</span></button>";
}
$output .= wp_nonce_field( 'stripe_payments', '_wpnonce', true, false );
$output .= '<input type="hidden" name="item_number" value="' . $button_id . '" />';
$output .= "<input type='hidden' value='{$item_name}' name='item_name' />";
$output .= "<input type='hidden' value='{$payment_amount}' name='item_price' />";
$output .= "<input type='hidden' value='{$payment_currency}' name='currency_code' />";
$output .= "<input type='hidden' value='{$custom_field_value}' name='custom' />";
//Filter to add additional payment input fields to the form.
$output .= apply_filters( 'swpm_stripe_payment_form_additional_fields', '' );
$output .= '</form>';
$output .= '</div>'; //End .swpm_button_wrapper
return $output;
}