123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- <?php
- /**
- * @file
- * Written by Henri MEDOT <henri.medot[AT]absyx[DOT]fr>
- * http://www.absyx.fr
- */
- require_once dirname(__FILE__) .'/uc_cmcic.inc';
- define('UC_CMCIC_URL_CM_TEST', 'https://paiement.creditmutuel.fr/test/paiement.cgi');
- /*******************************************************************************
- * Drupal Hooks
- ******************************************************************************/
- /**
- * Implementation of hook_menu().
- */
- function uc_cmcic_menu() {
- $items['cart/cmcic/response'] = array(
- 'title' => 'CM-CIC p@iement response',
- 'page callback' => 'uc_cmcic_response',
- 'access callback' => 'uc_cmcic_response_access',
- 'type' => MENU_CALLBACK,
- );
- $items['cart/cmcic/success'] = array(
- 'title' => 'CM-CIC p@iement payment success',
- 'page callback' => 'uc_cmcic_success',
- 'access arguments' => array('access content'),
- 'type' => MENU_CALLBACK,
- );
- $items['cart/cmcic/cancel'] = array(
- 'title' => 'CM-CIC p@iement payment cancelled',
- 'page callback' => 'uc_cmcic_cancel',
- 'access arguments' => array('access content'),
- 'type' => MENU_CALLBACK,
- );
- $items['cart/cmcic/return'] = array(
- 'title' => 'CM-CIC p@iement payment return',
- 'page callback' => 'uc_cmcic_return',
- 'access arguments' => array('access content'),
- 'type' => MENU_CALLBACK,
- );
- return $items;
- }
- // Make sure CM-CIC p@iement always has access to send responses.
- function uc_cmcic_response_access() {
- return TRUE;
- }
- /*******************************************************************************
- * Ubercart Hooks
- ******************************************************************************/
- /**
- * Implementation of hook_uc_payment_method().
- */
- function uc_cmcic_uc_payment_method() {
- $title = variable_get('uc_cmcic_method_title', t('Credit card with CM-CIC p@iement'))
- .'<br />'. theme('image', array('path' => drupal_get_path('module', 'uc_cmcic') .'/images/logo_cm-paiement-pt.jpg'));
- $methods['cmcic'] = array(
- 'name' => t('CM-CIC p@iement'),
- 'title' => $title,
- 'desc' => t('Redirect users to submit payments through CM-CIC p@iement.'),
- 'callback' => 'uc_payment_method_cmcic',
- 'redirect' => 'uc_cmcic_form',
- 'weight' => 3,
- 'checkout' => TRUE,
- 'no_gateway' => TRUE,
- );
- return $methods;
- }
- /*******************************************************************************
- * Callback and Helper Functions
- ******************************************************************************/
- /**
- * Add CM-CIC p@iement settings to the payment method settings form.
- */
- function uc_payment_method_cmcic($op, &$arg1) {
- switch ($op) {
- case 'settings':
- $form['uc_cmcic_url'] = array(
- '#type' => 'textfield',
- '#title' => t('CM-CIC p@iement URL'),
- '#description' => t('The URL to the CM-CIC p@iement payment platform.'),
- '#default_value' => variable_get('uc_cmcic_url', UC_CMCIC_URL_CM_TEST),
- );
- $form['uc_cmcic_tpe'] = array(
- '#type' => 'textfield',
- '#title' => t('POS terminal number'),
- '#description' => t('The 7-character virtual POS terminal number your site was assigned when subscribing to CM-CIC p@iement.'),
- '#default_value' => variable_get('uc_cmcic_tpe', ''),
- '#size' => 10,
- '#maxlength' => 7,
- );
- $form['uc_cmcic_key'] = array(
- '#type' => 'textfield',
- '#title' => t('Merchant security key'),
- '#description' => t('The 40-character key your site was assigned when subscribing to CM-CIC p@iement.'),
- '#default_value' => variable_get('uc_cmcic_key', ''),
- '#maxlength' => 40,
- );
- $form['uc_cmcic_site_code'] = array(
- '#type' => 'textfield',
- '#title' => t('Site code'),
- '#description' => t('The 20-character code your site was assigned when subscribing to CM-CIC p@iement.'),
- '#default_value' => variable_get('uc_cmcic_site_code', ''),
- '#size' => 25,
- '#maxlength' => 20,
- );
- $form['uc_cmcic_response_url'] = array(
- '#type' => 'item',
- '#title' => t('Return interface URL'),
- '#markup' => url('cart/cmcic/response', array('absolute' => TRUE)),
- '#description' => 'You have to provide your bank with this URL for CM-CIC p@iement to function properly.',
- );
- return $form;
- }
- }
- /**
- * Form to build the submission to CM-CIC p@iement.
- */
- function uc_cmcic_form($form, &$form_state, $order) {
- global $language;
- $fields = array(
- 'TPE' => variable_get('uc_cmcic_tpe', ''),
- 'date' => date('d/m/Y:H:i:s', time()),
- 'montant' => round($order->order_total, 2) . variable_get('uc_currency_code', 'USD'),
- 'reference' => $order->order_id,
- 'texte-libre' => md5(uniqid(rand(), TRUE)),
- 'mail' => $order->primary_email,
- 'lgue' => in_array(strtoupper($language->language), uc_cmcic_languages()) ? strtoupper($language->language) : 'EN',
- 'societe' => variable_get('uc_cmcic_site_code', ''),
- 'url_retour' => url('cart/cmcic/cancel', array('absolute' => TRUE)),
- 'url_retour_ok' => url('cart/cmcic/success', array('absolute' => TRUE)),
- 'url_retour_err' => url('cart/cmcic/return', array('absolute' => TRUE)),
- );
- $fields = uc_cmcic_complete_request(variable_get('uc_cmcic_key', ''), $fields);
- // Add the transaction ID to the order's data array.
- $order->data['cmcic']['texte-libre'] = $fields['texte-libre'];
- // Save the updated data array to the database.
- uc_cmcic_save_order_data($order);
- $form['#action'] = variable_get('uc_cmcic_url', UC_CMCIC_URL_CM_TEST);
- foreach ($fields as $name => $value) {
- $form[$name] = array('#type' => 'hidden', '#value' => $value);
- }
- $form['submit'] = array(
- '#type' => 'submit',
- '#value' => t('Submit order'),
- );
- return $form;
- }
- /**
- * Save order's updated data array to the database.
- */
- function uc_cmcic_save_order_data($order) {
- db_update('uc_orders')
- ->fields(array('data' => serialize($order->data)))
- ->condition('order_id', $order->order_id)
- ->execute();
- }
- /**
- * Handle an incoming payment.
- */
- function uc_cmcic_response() {
- if (empty($_POST)) {
- watchdog('uc_cmcic', 'Response attempted without any POST data.', array(), WATCHDOG_WARNING);
- return;
- }
- unset($mac_ok);
- $order = uc_cmcic_get_order($mac_ok);
- if (!$order) {
- watchdog('uc_cmcic', 'Invalid response.', array(), WATCHDOG_ERROR);
- uc_cmcic_receipt_exit($mac_ok);
- }
- $order_id = $order->order_id;
- if (($_POST['code-retour'] != 'paiement') && ($_POST['code-retour'] != 'payetest')) {
- uc_order_comment_save($order_id, 0, t("The customer's attempted payment from a bank account may have failed. Authorisation result is @result.", array('@result' => $_POST['motifrefus'])), 'admin');
- uc_cmcic_receipt_exit(TRUE);
- }
- $amount = substr($_POST['montant'], 0, -3);
- $currency = substr($_POST['montant'], -3);
- $comment = t('CM-CIC p@iement authorisation #: @number', array('@number' => $_POST['numauto']));
- uc_payment_enter($order_id, 'cmcic', $amount, $order->uid, $_POST, $comment);
- uc_cart_complete_sale($order);
- uc_order_comment_save($order_id, 0, t('Payment of @amount @currency submitted through CM-CIC p@iement.', array('@amount' => uc_currency_format($amount, FALSE), '@currency' => $currency)), 'order', 'payment_received');
- uc_order_comment_save($order_id, 0, t('CM-CIC p@iement response reported a payment of @amount @currency.', array('@amount' => uc_currency_format($amount, FALSE), '@currency' => $currency)));
- uc_cmcic_receipt_exit(TRUE);
- }
- // Return the receipt to the bank then exit cleanly.
- function uc_cmcic_receipt_exit($mac_ok) {
- print uc_cmcic_receipt($mac_ok);
- module_invoke_all('exit');
- exit;
- }
- /**
- * Handle a successful payment.
- */
- function uc_cmcic_success() {
- if (empty($_SESSION['cart_order'])) {
- drupal_goto('cart');
- }
- // This lets us know it's a legitimate access of the complete page.
- $_SESSION['uc_checkout'][$_SESSION['cart_order']]['do_complete'] = TRUE;
- drupal_goto('cart/checkout/complete');
- }
- /**
- * Handle a cancelled payment.
- */
- function uc_cmcic_cancel() {
- unset($_SESSION['cart_order']);
- drupal_set_message(t('Your payment was cancelled. Please feel free to continue shopping or contact us for assistance.'));
- drupal_goto('cart');
- }
- /**
- * Handle an unsuccessful payment.
- */
- function uc_cmcic_return() {
- unset($_SESSION['cart_order']);
- drupal_set_message(t('Sorry, your payment could not be processed. Please try again or contact us for assistance.'));
- drupal_goto('cart');
- }
- function uc_cmcic_get_order(&$mac_ok) {
- $mac_ok = FALSE;
- if (!uc_cmcic_validate_response(variable_get('uc_cmcic_key', ''), $_POST)) {
- return FALSE;
- }
- $mac_ok = TRUE;
- if (isset($_POST['reference']) && ($order = uc_order_load(intval($_POST['reference'])))) {
- if (isset($order->data['cmcic']['texte-libre']) && ($_POST['texte-libre'] == $order->data['cmcic']['texte-libre'])) {
- return $order;
- }
- }
- return FALSE;
- }
|