You are here

uc_stripe.module in Ubercart Stripe 7

A module used for processing payments with Stripe.

File

uc_stripe.module
View source
<?php

/**
 * @file
 * A module used for processing payments with Stripe.
 */

/**
 * Implements hook_library_info().
 */
function uc_stripe_libraries_info() {
  $libraries = array();
  $libraries['stripe-php'] = array(
    'name' => 'Stripe PHP',
    'vendor url' => 'https://stripe.com',
    'download url' => 'https://stripe.com/docs/libraries',
    'path' => 'lib',
    'version arguments' => array(
      'file' => 'VERSION',
      'pattern' => '/(.*)/',
      'lines' => 1,
    ),
    'files' => array(
      'php' => array(
        'Stripe.php',
      ),
    ),
  );
  return $libraries;
}

/**
 * Implements hook_payment_gateway().
 */
function uc_stripe_uc_payment_gateway() {
  $gateways = array();
  $gateways['uc_stripe'] = array(
    'title' => t('Stripe Gateway'),
    'description' => t('Process credit card payments using Stripe.'),
    'settings' => 'uc_stripe_settings_form',
    'credit' => 'uc_stripe_charge',
  );
  return $gateways;
}

/**
 * Implements hook_recurring_info().
 */
function uc_stripe_recurring_info() {
  $items['uc_stripe'] = array(
    'name' => t('Stripe'),
    'payment method' => 'credit',
    'module' => 'uc_recurring',
    'fee handler' => 'uc_stripe',
    'process callback' => 'uc_stripe_process_payment',
    'renew callback' => 'uc_stripe_renew',
    'cancel callback' => 'uc_stripe_cancel',
    'own handler' => FALSE,
    'menu' => array(
      'charge' => UC_RECURRING_MENU_DEFAULT,
      'edit' => UC_RECURRING_MENU_DEFAULT,
      'cancel' => UC_RECURRING_MENU_DEFAULT,
    ),
  );
  return $items;
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function uc_stripe_form_uc_cart_checkout_form_alter(&$form, &$form_state) {

  // If testmode is enabled, display a message on checkout.
  if (uc_credit_default_gateway() == 'uc_stripe') {
    if (variable_get('uc_stripe_testmode', TRUE)) {
      $form['panes']['testmode'] = array(
        '#prefix' => "<div class='messages' style='background-color:#BEEBBF'>",
        '#type' => 'markup',
        '#value' => t("Test mode is <strong>ON</strong> for the Stripe Payment Gateway. Your credit card will not be charged. To change this setting, edit the !link", array(
          '!link' => l("Stripe settings", "admin/store/settings/payment/edit/gateways"),
        )),
        '#suffix' => "</div>",
      );
    }
    if (variable_get('uc_stripe_poweredby', FALSE)) {
      drupal_add_css(drupal_get_path('module', 'uc_stripe') . '/css/uc_stripe.css');
      $form['panes']['payment']['poweredbystripe'] = array(
        '#prefix' => "<a href='https://stripe.com' target='_blank' class='poweredbylink'><div class='poweredbystripe'>",
        '#type' => 'markup',
        '#value' => t("powered by"),
        '#suffix' => " " . theme('image', drupal_get_path('module', 'uc_stripe') . '/images/logo_bare.png', 'powered by Stripe', 'powered by Stripe') . "</div></a>",
      );
    }
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function uc_stripe_form_uc_recurring_product_feature_form_alter(&$form, &$form_state) {

  // Disable days and weeks as Stripe has no notion of them.
  unset($form['interval']['regular']['regular_interval_unit']['#options']['days']);
  unset($form['interval']['regular']['regular_interval_unit']['#options']['weeks']);
  $form['num_interval']['unlimited_intervals']['#disabled'] = TRUE;
  $form['num_interval']['unlimited_intervals']['#description'] = t('Note: The Stripe payment module only allows unlimited billings on products.');
  unset($form['num_interval']['number_intervals']);
  $form['fee']['fee_same_product']['#description'] = t("The product price is currently %price", array(
    '%price' => $form['fee']['product_price']['#value'],
  ));
  $form['interval']['regular']['regular_interval_value']['#options'] = array(
    1,
  );

  // Call our validation function.
  $form['#validate'][] = "uc_stripe_product_feature_validate";
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function uc_stripe_form_uc_cart_view_form_alter(&$form, &$form_state) {
  if (module_exists('uc_recurring')) {
    if (uc_credit_default_gateway() == 'uc_stripe') {
      if (variable_get('uc_stripe_cartinfo', TRUE)) {
        foreach ($form['items'] as $key => $item) {
          if (isset($item['nid']['#value'])) {
            if (db_result(db_query("SELECT * FROM {uc_recurring_stripe} WHERE nid = %d", $item['nid']['#value']))) {
              $title = _uc_stripe_fancy_name($item['nid']['#value']);
              if (isset($title)) {
                $form['items'][$key]['desc']['#value'] = l($title, 'node/' . $nid);
              }
            }
          }
        }
      }
    }
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function uc_stripe_form_uc_recurring_payment_form_alter(&$form, &$form_state) {
  if (module_exists('uc_recurring')) {
    if (uc_credit_default_gateway() == 'uc_stripe') {
      $form['uc_recurring_trigger_renewals']['#disabled'] = TRUE;
      $form['uc_recurring_trigger_renewals']['#description'] = t("This is disabled when using Stripe as the Payment Gateway because the renewals happen on their end, not on our end.");
    }
  }
}

/**
 * Implements hook_cart_item().
 */
function uc_stripe_cart_item($op, &$item) {
  if (module_exists('uc_recurring')) {
    if (uc_credit_default_gateway() == 'uc_stripe') {
      if (variable_get('uc_stripe_cartinfo', TRUE)) {
        if (db_result(db_query("SELECT * FROM {uc_recurring_stripe} WHERE nid = %d", $item->nid))) {
          $item->title = _uc_stripe_fancy_name($item->nid);
        }
      }
    }
  }
}

/**
 * Validate the product feature save.
 *
 * Ensure everything is Stripe compatible. Some options are not Stripe compatible
 * and we have stripped out the UI but we double check to ensure the user has
 * not attempted to circumvent those measures.
 */
function uc_stripe_product_feature_validate($form, &$form_state) {

  // First, ensure the user has selected a SKU.
  if ($form_state['values']['model'] == '') {
    form_set_error('model', t("You must select an Applicable SKU for payments to work with Stripe."));
    return FALSE;
  }
  if ($form_state['values']['regular_interval_unit'] == 'days' || $form_state['values']['regular_interval_unit'] == 'weeks') {
    form_set_error('regular_interval_unit', t("Stripe only allows intervals of months or years. Invalid value given."));
    return FALSE;
  }
  if ($form_state['values']['regular_interval_value'] > 1) {
    form_set_error('regular_interval_value', t("Stripe only allows intervals of 1 month or 1 year."));
    return FALSE;
  }
  $form_state['values']['regular_interval_value'] = 1;
  $form_state['values']['number_intervals'] = -1;
  $fee = $form_state['values']['fee_same_product'] ? intval(100 * floatval($form_state['values']['product_price'])) : intval(100 * floatval($form_state['values']['fee_amount']));
  if ($form_state['values']['fee_same_product']) {
    $form['fee']['fee_amount']['#value'] = $form_state['values']['product_price'];
  }

  // We want to programmatically create a Stripe subscription plan
  // for this item.
  if (!_uc_stripe_load_api()) {
    form_set_error('', t("There was a problem loading the Stripe API. Recurring feature could not be created. Please ensure the API is in sites/all/libraries/stripe."));
    return FALSE;
  }
  $node = node_load($form_state['values']['nid']);
  $product = uc_product_load($node);

  // We have to convert forward slashes to underscores because stripe
  // has a bug as confirmed by the stripe staff. Basically, no plans
  // with forward slashes in their plan id can be retrieved.
  // Once Stripe fixes things on their end, this can be removed.
  $plan_id = str_replace('/', '_', $product->model);

  // See if a plan like this already exists.
  $plan_exists = TRUE;
  try {
    $plan = Stripe_Plan::retrieve($plan_id);
  } catch (Exception $e) {
    $plan_exists = FALSE;
  }
  if ($plan_exists) {

    /**
     * Delete that plan (Note: Deleting a plan doesn't truly delete it.
     *  It does not affect current subscribers of that plan, it just means
     *  no new subscribers can be added to that plan. But that's fine because
     *  we will have a new plan created a few lines down to which new
     *  subscribers will be added. For more info, see the Stripe api:
     *    https://stripe.com/docs/api#delete_plan)
     *
     * For a high overview, think about it like this. You don't have
     *  authorization from users on a current plan to change the billing
     *  amount. So we cannot just "change" the amount of the plan. We are
     *  authorized to bill them $9.99/month cannot just edit it
     *  programmatically to say, "You are now charged $15.99/month".
     *  So Stripe requires you to "delete" then "create" which deletes
     *  that version of the plan so no new users get access, then create
     *  a new one, here with the same name.
     */
    try {
      $plan
        ->delete();
    } catch (Exception $e) {
      form_set_error('', t("There was a problem updating your plan with Stripe: %error", array(
        "%error" => $e
          ->getMessage(),
      )));
    }
  }

  // Convert trial period to days.
  $trial = _uc_stripe_convert_trial_period($form_state['values']['initial_charge_value'], $form_state['values']['initial_charge_unit']);

  // Create a new plan.
  try {
    $data = array(
      'amount' => $fee,
      'interval' => drupal_substr($form_state['values']['regular_interval_unit'], 0, -1),
      'name' => $node->title,
      'currency' => 'usd',
      'id' => $plan_id,
    );
    if ($trial > 0) {
      $data['trial_period_days'] = $trial;
    }
    Stripe_Plan::create($data);
  } catch (Exception $e) {
    form_set_error('', t("There was an error creating the plan in Stripe: %error", array(
      '%error' => $e
        ->getMessage(),
    )));
  }
}

/**
 * Form builder for payment gateway settings.
 */
function uc_stripe_settings_form() {
  $form['uc_stripe_settings'] = array(
    '#type' => 'fieldset',
    '#title' => t('Stripe settings'),
  );
  $form['uc_stripe_settings']['uc_stripe_api_key_dev'] = array(
    '#type' => 'textfield',
    '#title' => t('Stripe API Key (Development)'),
    '#default_value' => variable_get('uc_stripe_api_key_dev', ''),
    '#description' => t('Your Development Stripe API Key. Must be the "secret" key, not the "publishable" one.'),
  );
  $form['uc_stripe_settings']['uc_stripe_api_key_prod'] = array(
    '#type' => 'textfield',
    '#title' => t('Stripe API Key (Production)'),
    '#default_value' => variable_get('uc_stripe_api_key_prod', ''),
    '#description' => t('Your Production Stripe API Key. Must be the "secret" key, not the "publishable" one.'),
  );
  $form['uc_stripe_settings']['uc_stripe_testmode'] = array(
    '#type' => 'checkbox',
    '#title' => t('Test mode'),
    '#description' => 'Testing Mode: Stripe will use the development API key to process the transaction so the card will not actually be charged.',
    '#default_value' => variable_get('uc_stripe_testmode', TRUE),
  );
  $form['uc_stripe_settings']['uc_stripe_poweredby'] = array(
    '#type' => 'checkbox',
    '#title' => t('Powered by Stripe'),
    '#description' => 'Show "powered by Stripe" in shopping cart.',
    '#default_value' => variable_get('uc_stripe_poweredby', FALSE),
  );
  if (module_exists('uc_recurring')) {
    $form['uc_stripe_settings']['uc_stripe_cartinfo'] = array(
      '#type' => 'checkbox',
      '#title' => t('Show additional info about recurring item in shopping cart'),
      '#default_value' => variable_get('uc_stripe_cartinfo', TRUE),
    );
  }
  return $form;
}

/**
 * uc_credit callback for creating an actual credit card charge
 */
function uc_stripe_charge($order_id, $amount, $data) {
  global $user;
  $order = uc_order_load($order_id);

  // Pad the expiration date with a 0 for single digit months.
  if (drupal_strlen($order->payment_details['cc_exp_month']) == 1) {
    $order->payment_details['cc_exp_month'] = '0' . $order->payment_details['cc_exp_month'];
  }

  /*  $context = array(
      'revision' => 'formatted-original',
      'type' => 'amount',
    );

    $options = array(
      'sign' => FALSE,
      'thou' => FALSE,
      'dec'  => FALSE,
      'prec' => 2,
    ); */

  // Set up minimum fields.
  $data = array(
    'amount' => $amount * 100,
    // amount in cents!
    'currency' => 'usd',
    'card' => array(
      'number' => $order->payment_details['cc_number'],
      'exp_month' => $order->payment_details['cc_exp_month'],
      'exp_year' => $order->payment_details['cc_exp_year'],
      'name' => $order->billing_first_name . ' ' . $order->billing_last_name,
      'address_line1' => $order->billing_street1,
      'address_zip' => $order->billing_postal_code,
      'address_state' => uc_get_zone_code($order->billing_zone),
    ),
    'description' => "{$order->primary_email}; OrderID: {$order_id}",
  );

  // Load the Stripe API and set the API key.
  if (!_uc_stripe_load_api()) {
    $result = array(
      'success' => FALSE,
      'comment' => t('Stripe API not found.'),
      'message' => t('Stripe API not found. Contact the site administrator.'),
      'uid' => $user->uid,
      'order_id' => $order_id,
    );
    return $result;
  }

  // CVV Number (if enabled).
  if (variable_get('uc_credit_cvv_enabled', TRUE)) {
    $data['card']['cvc'] = $order->payment_details['cc_cvv'];
  }

  // Stripe can't handle transactions < $0.50, but $0 is a common value
  // so we will just return a positive result when the amount is $0.
  if ($amount == 0) {
    $result = array(
      'success' => TRUE,
      'message' => t('Credit card payment processed successfully via Stripe.'),
      'uid' => $user->uid,
      'trans_id' => md5(uniqid(rand())),
    );
  }
  else {
    $result = _uc_stripe_post_transaction($order_id, $data);
  }
  drupal_set_message($result['message']);
  return $result;
}

/**
 * Process the recurring fee transaction.
 */
function uc_stripe_process_payment($order, &$fee) {
  global $user;
  $plan_id = str_replace('/', '_', $fee->data['model']);
  $customer_name = $order->billing_first_name . ' ' . $order->billing_last_name;

  // Load the Stripe API and set the API key.
  if (!_uc_stripe_load_api()) {
    return FALSE;
  }

  // First, check to see that a sku is tied to this recurring fee item.
  if (!isset($fee->data['model'])) {
    watchdog('uc_stripe', "You must set the applicable sku in the Recurring Fee setup. This must be the same as the Plan name in Stripe.");
    return FALSE;
  }
  try {

    // Then ensure it matches one of the plans in Stripe.
    $plans = Stripe_Plan::all();
  } catch (Exception $e) {
    watchdog('uc_stripe', "There was a problem loading the plans from Stripe: %error", array(
      '%error' => $e
        ->getMessage(),
    ), WATCHDOG_ERROR);
    return FALSE;
  }
  $match = FALSE;
  foreach ($plans['data'] as $plan) {
    if ($plan
      ->__get('id') == $plan_id) {
      $match = TRUE;
    }
  }

  // If no match, this recurring item doesn't correlate to any
  // Stripe subscription plan.
  if (!$match) {
    watchdog('uc_stripe', "The sku for the Recurring Fee object doesn't match any Stripe plans.");
    return FALSE;
  }

  // Tricky to find the nid of the recurring product from a cart of
  // other things. Note, this will only work with a single
  // subscription item in the cart. If more, it throws an error.
  foreach ($order->products as $product) {
    if (db_result(db_query("SELECT nid FROM {uc_product_features} WHERE fid = 'recurring' AND nid = %d", $product->nid))) {
      $nid[] = $product->nid;
    }
  }
  if (count($nid) > 1) {
    watchdog('uc_stripe', "Multiple subscriptions in cart. User %user warned.", array(
      '%user' => $user->name,
    ));
    drupal_set_message(t("Currently, only one subscription may be purchased at one time. Please purchase one subscription, then purchase another as a separate order. We apologize for the inconvenience."), 'error');
    return FALSE;
  }
  $nid = $nid[0];

  // Pad the expiration date with a 0 for single digit months.
  if (drupal_strlen($order->payment_details['cc_exp_month']) == 1) {
    $order->payment_details['cc_exp_month'] = '0' . $order->payment_details['cc_exp_month'];
  }

  // Pad the expiration date with a 0 for single digit months.
  if (drupal_strlen($order->payment_details['cc_exp_month']) == 1) {
    $order->payment_details['cc_exp_month'] = '0' . $order->payment_details['cc_exp_month'];
  }

  // Set up minimum fields.
  $data = array(
    'plan' => $plan_id,
    'card' => array(
      'number' => $order->payment_details['cc_number'],
      'exp_month' => $order->payment_details['cc_exp_month'],
      'exp_year' => $order->payment_details['cc_exp_year'],
      'name' => $order->billing_first_name . ' ' . $order->billing_last_name,
      'address_line1' => $order->billing_street1,
      'address_zip' => $order->billing_postal_code,
      'address_state' => uc_get_zone_code($order->billing_zone),
    ),
  );

  // CVV Number (if enabled).
  if (variable_get('uc_credit_cvv_enabled', TRUE)) {
    $data['card']['cvc'] = $order->payment_details['cc_cvv'];
  }

  // This user is not logged in, so create new subscription.
  $create_new = FALSE;
  if ($user->uid == 0) {
    $create_new = TRUE;
  }
  else {

    // Retrieve existing subscriptions.
    if (db_result(db_query("SELECT * FROM {uc_recurring_stripe} WHERE uid = %d", $user->uid))) {
      $result = db_query("SELECT * FROM {uc_recurring_stripe} WHERE uid = %d", $user->uid);
      while ($sub = db_fetch_object($result)) {
        if ($sub->plan_id == $plan_id) {
          $customer_id = $sub->customer_id;
        }
      }
      if ($customer_id) {
        try {
          $customer = Stripe_Customer::retrieve($customer_id);
        } catch (Exception $e) {
          drupal_set_message(t("Unable to retrieve customer subscription"), 'error');
          watchdog('uc_stripe', "Unable to retrieve customer subscription for %customer_id", array(
            '%customer_id' => $customer_id,
          ));
          return FALSE;
        }
      }
      else {
        $create_new = TRUE;
      }
    }
    else {
      $create_new = TRUE;
    }
  }

  // Create a new customer object if necessary.
  if ($create_new) {
    $data['email'] = $order->primary_email;
    $data['description'] = $customer_name;
    try {
      $customer = Stripe_Customer::create($data);

      // Write this customer record to our database.
      $cust_record->uid = $user->uid;
      $cust_record->order_id = $order->order_id;
      $cust_record->customer_id = $customer
        ->__get('id');
      $cust_record->plan_id = $plan_id;
      $cust_record->nid = $nid;
      $cust_record->active = 1;
      drupal_write_record('uc_recurring_stripe', $cust_record);
    } catch (Exception $e) {
      drupal_set_message(t("Unable to create new customer object: @message", array(
        "@message",
        $e
          ->getMessage(),
      )), 'error');
      watchdog('uc_stripe', "Unable to create new customer object for %customer_name", array(
        '%customer_name' => $customer_name,
      ));
      return FALSE;
    }
  }
  try {
    unset($data['email']);
    unset($data['description']);
    $customer
      ->updateSubscription($data);
    $customer->description = $customer_name;
    $customer
      ->save();
    $rfid = db_result(db_query("SELECT rfid FROM {uc_recurring_stripe} WHERE customer_id = '%s'", $customer
      ->__get('id')));
    $cust_record->uid = $user->uid;
    $cust_record->order_id = $order->order_id;
    $cust_record->customer_id = $customer
      ->__get('id');
    $cust_record->plan_id = $plan_id;
    $cust_record->nid = $nid;
    $cust_record->active = 1;
    drupal_write_record('uc_recurring_stripe', $cust_record);
    $result = array(
      'success' => TRUE,
      'message' => t('Recurring Payment set up for this transaction.'),
      'uid' => $user->uid,
    );
    watchdog('uc_stripe', "Recurring payment created for %customer_name for %plan.", array(
      '%customer_name' => $customer_name,
      '%plan' => $plan_id,
    ));
  } catch (Exception $e) {
    watchdog('uc_stripe', "There was a problem creating the subscription for %customer_name. \n\n%error", array(
      '%customer_name' => $customer_name,
      '%error' => $e
        ->getMessage(),
    ));
    $result = array(
      'success' => FALSE,
      'comment' => $e
        ->getCode(),
      'message' => t("Recurring payment failed. !message", array(
        "!message" => $e
          ->getMessage(),
      )),
      'uid' => $user->uid,
      'order_id' => $order_id,
    );
    uc_order_comment_save($order_id, $user->uid, $result['message'], 'admin');
    return FALSE;
  }
  uc_order_comment_save($order_id, $user->uid, $result['message'], 'admin');
  return TRUE;
}

/**
 * Initiates a recurring fee.
 *
 * Uses the TransID stored in uc_stripe_process_payment, which was returned by
 * Stripe as a handle/identifier for the customer's stored credit card info.
 */
function uc_stripe_renew($order, &$fee) {
  drupal_set_message(t("The renewing payments are managed at @url. No renewal charge initiated.", array(
    '@url' => l(t('manage.stripe.com'), 'http://manage.stripe.com'),
  )), 'error');
  return FALSE;
}

/**
 * Cancel the recurring fee using the Stripe API.
 *
 * @param $order
 *   The order object.
 * @param $op
 *   The operation.
 * @return
 *   TRUE if recurring fee was cancelled.
 */
function uc_stripe_cancel($order, $op) {
  global $user;
  $plan_id = str_replace('/', '_', $order->data['model']);

  // Must be logged in to cancel.
  if ($user->uid == 0) {
    return FALSE;
  }
  $result = db_query("SELECT * FROM {uc_recurring_stripe} WHERE uid = %d", $user->uid);
  while ($sub = db_fetch_object($result)) {
    if ($sub->plan_id == $plan_id) {
      $customer_id = $sub->customer_id;
      $rfid = $sub->rfid;
    }
  }

  // Load the Stripe API and set the API key.
  if (!_uc_stripe_load_api()) {
    return FALSE;
  }
  try {
    $customer = Stripe_Customer::retrieve($customer_id);
    $customer
      ->cancelSubscription();
    $cust_record->rfid = $rfid;
    $cust_record->active = 0;
    drupal_write_record('uc_recurring_stripe', $cust_record, array(
      'rfid',
    ));
  } catch (Exception $e) {
    drupal_set_message(t("Unable to retrieve customer subscription: @message", array(
      "@message" => $e
        ->getMessage(),
    )), 'error');
    watchdog('uc_stripe', "Unable to retrieve customer subscription for %customer_id", array(
      '%customer_id' => $customer_id,
    ));
    return FALSE;
  }
  uc_order_comment_save($order->order_id, 0, t('Stripe: Subscription @customer_id cancelled.', array(
    '@subscription_id' => $customer_id,
  )), 'admin');
  return FALSE;
}

/**
 * Convert trial period from any unit to days which Stripe expects.
 */
function _uc_stripe_convert_trial_period($value, $unit) {
  switch ($unit) {
    case 'days':
      return $value;
      break;
    case 'weeks':
      return $value * 7;
      break;
    case 'months':
      return $value * 30;
      break;
    case 'years':
      return $value * 365;
      break;
    default:
      return $value;
      break;
  }
}

/**
 * Given the nid of the item, return its fancy name
 *
 * (meaning, for a subscription, show in the shopping cart as:
 * "Item Name ($29.00/month starting in 10 days)" instead of:
 * "Item Name" which could be misleading because it could have
 *  no immediate price.
 */
function _uc_stripe_fancy_name($nid) {
  $pfid = db_result(db_query("SELECT pfid FROM {uc_product_features} WHERE nid = %d", $nid));
  if ($pfid) {
    $recurring = db_result(db_query("SELECT * FROM {uc_recurring_product} WHERE pfid = %d", $pfid));
    if ($recurring) {
      $result = db_query("SELECT * FROM {uc_recurring_product} WHERE pfid = %d", $pfid);
      $recurring = db_fetch_object($result);

      // If this product is recurring, we want to add the info to
      // its title display.
      $node = node_load($nid);
      $product = uc_product_load($node);
      $interval = drupal_substr($recurring->regular_interval, 2, -1);
      $fee = number_format($recurring->fee_amount, 2);
      $title = t("{$node->title} (\${$fee}/{$interval} starting in {$recurring->initial_charge})");
      return $title;
    }
  }
  return FALSE;
}

/**
 * Load the Stripe API, assign the key
 */
function _uc_stripe_load_api() {
  $library = libraries_load('stripe-php');
  if (!$library['installed'] && !$library['loaded']) {
    watchdog('uc_stripe', 'Stripe Library not found. Please download into sites/all/libraries/stripe', array(), WATCHDOG_WARNING);
    return FALSE;
  }
  $apikey = variable_get('uc_stripe_testmode', TRUE) ? variable_get('uc_stripe_api_key_dev', '') : variable_get('uc_stripe_api_key_prod', '');
  if ($apikey == '') {
    watchdog('uc_stripe', 'No Stripe API key is set. Payment cannot go through until set.', array(), WATCHDOG_WARNING);
    return FALSE;
  }
  try {
    Stripe::setApiKey($apikey);
  } catch (Exception $e) {
    watchdog('uc_stripe', 'Error setting the Stripe API Key. Payments will not be processed: %error', array(
      '%error' => $e
        ->getMessage(),
    ));
  }
  return TRUE;
}

/**
 * Post transactions to Stripe using this function.
 */
function _uc_stripe_post_transaction($order_id, $data) {
  global $user;
  try {
    $charge_object = Stripe_Charge::create($data);
    $result = array(
      'success' => TRUE,
      'message' => t('Credit card payment processed successfully.'),
      'uid' => $user->uid,
      'trans_id' => $charge_object
        ->__get('id'),
    );
  } catch (Exception $e) {
    $result = array(
      'success' => FALSE,
      'comment' => $e
        ->getCode(),
      'message' => t("Credit card declined. !message", array(
        "!message" => $e
          ->getMessage(),
      )),
      'uid' => $user->uid,
      'order_id' => $order_id,
    );
  }
  uc_order_comment_save($order_id, $user->uid, $result['message'], 'admin');
  return $result;
}

Functions

Namesort descending Description
uc_stripe_cancel Cancel the recurring fee using the Stripe API.
uc_stripe_cart_item Implements hook_cart_item().
uc_stripe_charge uc_credit callback for creating an actual credit card charge
uc_stripe_form_uc_cart_checkout_form_alter Implements hook_form_FORM_ID_alter().
uc_stripe_form_uc_cart_view_form_alter Implements hook_form_FORM_ID_alter().
uc_stripe_form_uc_recurring_payment_form_alter Implements hook_form_FORM_ID_alter().
uc_stripe_form_uc_recurring_product_feature_form_alter Implements hook_form_FORM_ID_alter().
uc_stripe_libraries_info Implements hook_library_info().
uc_stripe_process_payment Process the recurring fee transaction.
uc_stripe_product_feature_validate Validate the product feature save.
uc_stripe_recurring_info Implements hook_recurring_info().
uc_stripe_renew Initiates a recurring fee.
uc_stripe_settings_form Form builder for payment gateway settings.
uc_stripe_uc_payment_gateway Implements hook_payment_gateway().
_uc_stripe_convert_trial_period Convert trial period from any unit to days which Stripe expects.
_uc_stripe_fancy_name Given the nid of the item, return its fancy name
_uc_stripe_load_api Load the Stripe API, assign the key
_uc_stripe_post_transaction Post transactions to Stripe using this function.