diff --git a/booking.module b/booking.module index 9200e2f..69c0119 100644 --- a/booking.module +++ b/booking.module @@ -768,6 +768,7 @@ function booking_library() { 'version' => '1.0', 'js' => array( 'https://js.stripe.com/v1/' => array(), + 'https://checkout.stripe.com/checkout.js' => array(), $module_path . '/booking.stripe.js' => array(), ), ); diff --git a/booking.stripe-old.js b/booking.stripe-old.js new file mode 100644 index 0000000..efe3b7e --- /dev/null +++ b/booking.stripe-old.js @@ -0,0 +1,65 @@ +(function($) { + $(function() { + Stripe.setPublishableKey(Drupal.settings.booking_stripeform.pubkey); + }); + Drupal.behaviors.booking_stripeform = { + attach: function(context, settings) { + $("#" + settings.booking_stripeform.form_selector, context).submit(function(e) { + e.preventDefault(); + var $form = $(this); + var $obj; + var $submitBtn = $("#edit-submit", context); + settings.booking_stripeform.submitBtnText = $submitBtn.val(); + try { + var $ccnum = $(':input[data-stripe="number"]', $form); + var $exp_month = $(':input[data-stripe="exp-month"]', $form); + var $exp_year = $(':input[data-stripe="exp-year"]', $form); + var $cvc = $(':input[data-stripe="cvc"]', $form); + if(!Stripe.card.validateCardNumber($(':input[data-stripe="number"]', $form).val())) { + $obj = $ccnum; + throw "Invalid credit card number"; + } + if(!Stripe.card.validateExpiry($exp_month.val(), $exp_year.val())) { + $obj = $exp_month; + throw "Invalid expiration month/year"; + } + if(!Stripe.card.validateCVC($cvc.val())) { + $obj = $cvc; + throw "Invalid CVC"; + } + } catch(err) { + $.each([$ccnum, $exp_month, $exp_year, $cvc], function(i, e) { + e.addClass('error'); + }); + $obj.parents('div.control-group').toggleClass('error'); + reportError(err, $obj); + return false; + } + $submitBtn.val('Please wait...').attr('disabled', true); + Stripe.createToken($form, stripeResponseHandler); + return false; + }); + } + } + + var stripeResponseHandler = function(status, response) { + var $form = $("#" + Drupal.settings.booking_stripeform.form_selector); + if (response.error) { + alert(response.error.message); + } else { + // token contains id, last4, and card type + var token = response.id; + // Insert the token into the form so it gets submitted to the server + $('input[name=stripeToken]', $form).val(token); + // and submit + $form.get(0).submit(); + } + }; + + /** + * Uses Bootstrap's popover to alert the user. + */ + function reportError(msg, $el) { + console.log([$el, msg]); + } +}(jQuery)); \ No newline at end of file diff --git a/booking.stripe.inc b/booking.stripe.inc index a93cc6c..1b7acfc 100644 --- a/booking.stripe.inc +++ b/booking.stripe.inc @@ -10,45 +10,130 @@ * Get the current stripe api public key */ function _booking_get_stripe_public_key() { - if (variable_get('booking_stripe_testmode', 0) == 1) { - return variable_get('booking_stripe_test_public_key', ''); - } - else { - return variable_get('booking_stripe_live_public_key', ''); - } + if (variable_get('booking_stripe_testmode', 0) == 1) { + return variable_get('booking_stripe_test_public_key', ''); + } + else { + return variable_get('booking_stripe_live_public_key', ''); + } } /** * Get the current stripe api private key */ function _booking_get_stripe_private_key() { - if (variable_get('booking_stripe_testmode', 0) == 1) { - return variable_get('booking_stripe_test_secret_key', ''); - } - else { - return variable_get('booking_stripe_live_secret_key', ''); - } + if (variable_get('booking_stripe_testmode', 0) == 1) { + return variable_get('booking_stripe_test_secret_key', ''); + } + else { + return variable_get('booking_stripe_live_secret_key', ''); + } } /** - * Sample Stripe Form. + * Helper function to generate paypal form for payments */ -function booking_stripeform_form($form, &$form_state) { - // Let's make sure you have the stripe library installed. - if($path = libraries_get_path('stripe')) { - if(!is_file($path . '/lib/Stripe.php')) { - form_set_error('form', t('You need to install the stripe library from !link before you can use this form.', - array('!link' => l('here', 'https://stripe.com/docs/libraries')))); - } - } else { - form_set_error('form', t('You need to install the stripe library from !link before you can use this form.', - array('!link' => l('here', 'https://stripe.com/docs/libraries')))); - } - //load the main stripe library - libraries_load('stripe'); +function _booking_stripe_form($person, $invoiceid, $amount_owing, $button_text) { + $payment_form = drupal_get_form('booking_stripe_form', $person, $invoiceid, $amount_owing, $button_text); + return drupal_render($payment_form); +} + +function booking_stripe_form($node, &$form_state, $person, $invoiceid, $amount_owing, $button_text) { + global $event; + $settings = array(); + $form = array(); + + //get our current path so we can send the user back here if they cancel + //$path = isset($_GET['q']) ? $_GET['q'] : ''; //set some values for our internal stripe library to help process the form + //these will be used by the attached js from booking-strip library to identify which parts of the form to process + + // @todo set name and image in the admin page + $setting['booking_stripe'] = array( + 'pubkey' => _booking_get_stripe_public_key(), + 'form_selector' => str_replace('_', '-', __FUNCTION__), + 'name' => 'Study Week', + 'image' => '', + ); + //attach settings and javascript to the form + $form['#attached'] = array( + 'js' => array( + array('data' => $setting, 'type' => 'setting'), + ), + 'library' => array( + array('booking', 'booking-stripe'), + ), + ); + + + //paypal specific settings + $vars = array( + 'module' => 'Booking System', + 'type' => $event->booking_eventname, + 'nid' => $person->nid, + 'email' => $person->booking_email, + 'description' => $event->booking_eventname . ' ' . $person->booking_price_descrip, + 'invoice' => $invoiceid, + 'amount' => $amount_owing, + 'last_name' => $person->booking_lastname, + 'first_name' => $person->booking_firstname, + 'token_id' => '', + 'token_email' => '' + ); + + /* + $form['#id'] = 'booking_stripe_form'; + $form['#attached']['js'] = array( + array( + 'data' => 'https://checkout.stripe.com/checkout.js', + 'type' => 'external', + ), + array( + 'data' => drupal_get_path('module', 'booking') . '/booking.stripe.js', + 'type' => 'file', + ), + ); + */ + + //turn the array into a form + foreach($vars as $name => $value) { + $form[$name] = array( + '#type' => 'hidden', + '#value' => $value, + ); + }; + + $form['submit'] = array( + '#id' => 'stripe-submit', + '#type' => 'button', + '#value' => t($button_text), + ); + $form['#after_build'][] = 'booking_stripe_add_final_validation'; + + //watchdog('booking', 'Booking Balance payment: @info', array ('@info' => var_export($form, TRUE))); + return $form; +} + + + +/* +function booking_stripe_form($form, &$form_state, $person, $invoiceid, $amount_owing, $button_text) { + global $event; $setting = array(); + $form = array(); + + // Try to load the library and check if that worked. + if (($library = libraries_load('stripe')) && !empty($library['loaded'])) { + // Do something with the library here. + } + else { + //library can be downloaded from https://stripe.com/docs/libraries + form_set_error('form', t('The required stripe library is not installed. Please contact your site adaministrator')); + } + + //set some values for our internal stripe library to help process the form + //these will be used by the attached js from booking-strip library to identify which parts of the form to process $setting['booking_stripeform'] = array( 'pubkey' => _booking_get_stripe_public_key(), 'form_selector' => str_replace('_', '-', __FUNCTION__), @@ -56,7 +141,6 @@ function booking_stripeform_form($form, &$form_state) { $form['#attached'] = array( 'js' => array( array('data' => $setting, 'type' => 'setting'), - //drupal_get_path('module', 'booking') . '/booking.stripe.js', ), 'library' => array( array('booking', 'booking-stripe'), @@ -69,18 +153,15 @@ function booking_stripeform_form($form, &$form_state) { ); $form['amount'] = array( - '#type' => 'textfield', - '#title' => t('Amount to charge'), - '#description' => t('NOTE: Normally, you would calculate amount on the back end unless the user really can choose their own amount'), - '#size' => 6, - '#required' => TRUE, - ); + '#type' => 'hidden', + '#value' => $amount_owing, + ); $form['credit_card'] = array( '#type' => 'fieldset', '#title' => t('Credit Card Information'), + '#description' => t('

This credit card information is securely processed via stripe.com. No credit card information is stored or processed on our server.

'); ); - $cc = &$form['credit_card']; $cc['card_number'] = array( @@ -94,68 +175,68 @@ function booking_stripeform_form($form, &$form_state) { ); $cc['exp_month'] = array( - '#type' => 'select', - '#title' => t('Expiration Month'), - '#options' => drupal_map_assoc(array(1,2,3,4,5,6,7,8,9,10,11,12)), - '#pre_render' => array('booking_stripeform_remove_name'), - '#attributes' => array( - 'data-stripe' => 'exp-month', - ), - '#empty_option' => t('- Select -'), + '#type' => 'select', + '#title' => t('Expiration Month'), + '#options' => drupal_map_assoc(array(1,2,3,4,5,6,7,8,9,10,11,12)), + '#pre_render' => array('booking_stripeform_remove_name'), + '#attributes' => array( + 'data-stripe' => 'exp-month', + ), + '#empty_option' => t('- Select -'), ); $cc['exp_year'] = array( - '#type' => 'select', - '#title' => t('Expiration Year'), - '#options' => array(), - '#pre_render' => array('booking_stripeform_remove_name'), - '#attributes' => array( - 'data-stripe' => 'exp-year', - ), - '#empty_option' => t('- Select -'), + '#type' => 'select', + '#title' => t('Expiration Year'), + '#options' => array(), + '#pre_render' => array('booking_stripeform_remove_name'), + '#attributes' => array( + 'data-stripe' => 'exp-year', + ), + '#empty_option' => t('- Select -'), ); $year = date('Y'); for($i = $year; $i <= ($year + 10); $i++) { - $cc['exp_year']['#options'][$i] = $i; + $cc['exp_year']['#options'][$i] = $i; } $cc['cvc'] = array( - '#type' => 'textfield', - '#title' => t('CVC Number'), - '#pre_render' => array('booking_stripeform_remove_name'), - '#attributes' => array( - 'size' => 4, - 'data-stripe' => 'cvc', - ), + '#type' => 'textfield', + '#title' => t('CVC Number'), + '#pre_render' => array('booking_stripeform_remove_name'), + '#attributes' => array( + 'size' => 4, + 'data-stripe' => 'cvc', + ), ); $cc['submit'] = array( - '#type' => 'submit', - '#value' => t('Charge It'), - '#attributes' => array( - 'class' => array('btn', 'btn-large', 'btn-primary'), - ), + '#type' => 'submit', + '#value' => t('Charge It'), + '#attributes' => array( + 'class' => array('btn', 'btn-large', 'btn-primary'), + ), ); // Adds our validation at the end of the build process. - $form['#after_build'][] = 'booking_stripeform_add_final_validation'; - + $form['#after_build'][] = 'booking_stripe_add_final_validation'; return $form; } +*/ /** * Tries to add final validation after all else has been added through alters. */ -function booking_stripeform_add_final_validation($form) { - $form['#validate'][] = 'booking_stripeform_validate_form_payment'; +function booking_stripe_add_final_validation($form) { + $form['#validate'][] = 'booking_stripe_validate_form_payment'; return $form; } /** * Form validation callback. */ -function booking_stripeform_checkout_form_validate($form, &$form_state) { +function booking_stripe_checkout_form_validate($form, &$form_state) { // Validate normal form elements as needed. } @@ -167,31 +248,39 @@ function booking_stripeform_checkout_form_validate($form, &$form_state) { * early. If success, we'll pass the charge on * to the submission callback. */ -function booking_stripeform_validate_form_payment($form, &$form_state) { +function booking_stripe_validate_form_payment($form, &$form_state) { + global $event; if($errors = form_get_errors()) { return; } + $path = libraries_get_path('stripe'); require_once($path . '/init.php'); \Stripe\Stripe::setApiKey(_booking_get_stripe_private_key()); - - $token = $form_state['values']['stripeToken']; - $amount = $form_state['values']['amount'] * 100; + //$token = $form_state['values']['stripeToken']; + //$amount = $form_state['values']['amount'] * 100; + $token = (isset($form_state['input']['token_id']) ? $form_state['input']['token_id'] : ''); + $amount = (isset($form_state['input']['amount']) ? $form_state['input']['amount'] : ''); + $invoice = (isset($form_state['input']['invoice']) ? $form_state['input']['invoice'] : ''); watchdog('booking_debug', "
Stripe payment form :\n@info
", array('@info' => print_r( $form_state, true))); // Create the charge on Stripe's servers - this will charge the user's card try { $charge = \Stripe\Charge::create(array( - "amount" => $amount, - "currency" => "usd", + "amount" => $amount * 100, + "currency" => "aud", "card" => $token, - "description" => 'test charge', + "description" => $form_state['input']['description'], + "receipt_email" => $form_state['input']['email'], + "metadata" => array( + "invoice" => $invoice, + ), )); if ($charge && $charge->paid) { watchdog('booking', 'Charge created successfully'); $form_state['stripeform_charge'] = $charge; - watchdog('booking_debug', "
Stripe payment charge results:\n@info
", array('@info' => print_r( $charge, true))); + watchdog('booking_debug', "
Stripe payment charge results:\n@info
", array('@info' => print_r( $charge, true))); drupal_goto('bookingfinal'); } else { diff --git a/booking.stripe.js b/booking.stripe.js index efe3b7e..fbbe60a 100644 --- a/booking.stripe.js +++ b/booking.stripe.js @@ -1,65 +1,40 @@ -(function($) { - $(function() { - Stripe.setPublishableKey(Drupal.settings.booking_stripeform.pubkey); - }); - Drupal.behaviors.booking_stripeform = { - attach: function(context, settings) { - $("#" + settings.booking_stripeform.form_selector, context).submit(function(e) { - e.preventDefault(); - var $form = $(this); - var $obj; - var $submitBtn = $("#edit-submit", context); - settings.booking_stripeform.submitBtnText = $submitBtn.val(); - try { - var $ccnum = $(':input[data-stripe="number"]', $form); - var $exp_month = $(':input[data-stripe="exp-month"]', $form); - var $exp_year = $(':input[data-stripe="exp-year"]', $form); - var $cvc = $(':input[data-stripe="cvc"]', $form); - if(!Stripe.card.validateCardNumber($(':input[data-stripe="number"]', $form).val())) { - $obj = $ccnum; - throw "Invalid credit card number"; - } - if(!Stripe.card.validateExpiry($exp_month.val(), $exp_year.val())) { - $obj = $exp_month; - throw "Invalid expiration month/year"; - } - if(!Stripe.card.validateCVC($cvc.val())) { - $obj = $cvc; - throw "Invalid CVC"; - } - } catch(err) { - $.each([$ccnum, $exp_month, $exp_year, $cvc], function(i, e) { - e.addClass('error'); - }); - $obj.parents('div.control-group').toggleClass('error'); - reportError(err, $obj); - return false; +jQuery(document).ready(function($) { + var settings = Drupal.settings.booking_stripe; + var $form = $("#" + settings.form_selector); + var handler = StripeCheckout.configure({ + key: settings.pubkey, + image: settings.image, + locale: 'auto', + token: function(token) { + // Use the token to create the charge with a server-side script. + // You can access the token ID with `token.id` + if (currentForm === undefined) + return; + currentForm.find('input[name="token_id"]').val(token.id); + currentForm.find('input[name="token_email"]').val(token.email); + currentForm.submit(); } - $submitBtn.val('Please wait...').attr('disabled', true); - Stripe.createToken($form, stripeResponseHandler); - return false; - }); - } - } + }); + var currentForm = undefined; - var stripeResponseHandler = function(status, response) { - var $form = $("#" + Drupal.settings.booking_stripeform.form_selector); - if (response.error) { - alert(response.error.message); - } else { - // token contains id, last4, and card type - var token = response.id; - // Insert the token into the form so it gets submitted to the server - $('input[name=stripeToken]', $form).val(token); - // and submit - $form.get(0).submit(); - } - }; - - /** - * Uses Bootstrap's popover to alert the user. - */ - function reportError(msg, $el) { - console.log([$el, msg]); - } -}(jQuery)); \ No newline at end of file + $('.form-submit').click(function (e) { + currentForm = $(this).closest('form'); + if (currentForm === undefined) + return; + handler.open({ + name: settings.name, + description: currentForm.find('input[name="description"]').val(), + email: currentForm.find('input[name="email"]').val(), + currency: "aud", + amount: currentForm.find('input[name="amount"]').val() * 100, + closed: function() { + //document.getElementById("booking_stripe_form").submit(); + } + }); + e.preventDefault(); + }); + // Close Checkout on page navigation + //$(window).on('popstate', function() { + // handler.close(); + //}); +}); \ No newline at end of file