Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

More description, more documentation.

  • Loading branch information...
commit 1f71e2b91d2b650c5228bee077cb5533ff46c557 1 parent 9420ae5
ethem authored
Showing with 90 additions and 60 deletions.
  1. +76 −55 enrol/authorize/action.php
  2. +14 −5 enrol/authorize/enrol.php
View
131 enrol/authorize/action.php
@@ -4,48 +4,64 @@
* No action.
*/
define('AN_ACTION_NONE', 0x00);
+
/**
- * Authorize only. Don't capture.
+ * Used to authorize only, don't capture.
*/
define('AN_ACTION_AUTH_ONLY', 0x01);
+
/**
- * Authorized before, capture now.
+ * Used to capture, it was authorized before.
*/
define('AN_ACTION_PRIOR_AUTH_CAPTURE', 0x02);
+
/**
- * Authorize and capture
+ * Used to authorize and capture.
*/
define('AN_ACTION_AUTH_CAPTURE', 0x03);
+
/**
- * Refund it.
- * must be performed in 120 days after settled.
- * status must be auth_captured/settled.
- * can be credited up to original amount.
- * -- generates new transid. SAVE IT.
+ * Used to return funds to a customer's credit card.
+ *
+ * - Can be credited within 120 days after the original authorization was obtained.
+ * - Amount can be any amount up to the original amount charged.
+ * - Captured/pending settlement transactions cannot be credited,
+ * instead a void must be issued to cancel the settlement.
+ * NOTE: Assigns a new transactionID to the original transaction.
+ * SAVE IT, so we can cancel new refund if it is a fault return.
*/
define('AN_ACTION_CREDIT', 0x04);
+
/**
- * Cancel transaction in status
- * - authorized: don't settle.
- * - auth_captured/pending settle
- * - credited mistakenly, void it.
+ * Used to cancel an exiting transaction with a status of
+ * authorized/pending capture, captured/pending settlement or
+ * settled/refunded.
+ *
+ * - Void requests effectively cancel the Capture request
+ * that would start the funds transfer process.
+ * - Also used to cancel existing transaction with a status of
+ * settled/refunded. Credited mistakenly, so cancel it
+ * and return funds to our account.
+ *
* @todo cut-off time
*/
define('AN_ACTION_VOID', 0x08);
+
/**
- * authorizenet_action
+ * Performs an action on authorize.net
*
* @param &object $order Which transaction data will be send. See enrol_authorize table.
- * @param &string $message Info about errors
+ * @param &string $message Information about error messages.
* @param int $action Which action will be performed. See AN_ACTION_*
- * @param object $extra Extra info
- * @return bool true, transaction was successful, false otherwise
+ * @param object $extra Extra transaction data.
+ * @param &int $reason Response reason code.
+ * @return bool true, transaction was successful, false otherwise.
* @author Ethem Evlice <ethem a.t evlice d.o.t com>
* @uses $CFG
* @todo cut-off time
*/
-function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra = null)
+function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra = NULL, &$reason = 0)
{
global $CFG;
static $conststring;
@@ -64,10 +80,12 @@ function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra
'x_test_request' => $an_test ? 'TRUE' : 'FALSE'
);
$str = '';
- foreach($consdata as $ky => $vl) { $str .= $ky . '=' . urlencode($vl) . '&'; }
+ foreach($consdata as $ky => $vl) {
+ $str .= $ky . '=' . urlencode($vl) . '&';
+ }
$str .= (!empty($CFG->an_tran_key)) ?
- "x_tran_key" . "=" . urlencode($CFG->an_tran_key):
- "x_password" . "=" . urlencode($CFG->an_password);
+ "x_tran_key" . "=" . urlencode($CFG->an_tran_key):
+ "x_password" . "=" . urlencode($CFG->an_password);
$conststring = $str;
}
@@ -98,7 +116,8 @@ function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra
return false;
}
$ext = (array)$extra;
- $poststring .= "&" . "x_type=" . ($action==AN_ACTION_AUTH_ONLY ? "AUTH_ONLY" : "AUTH_CAPTURE");
+ $poststring .= "&" . "x_type=" . ($action==AN_ACTION_AUTH_ONLY ?
+ "AUTH_ONLY" : "AUTH_CAPTURE");
foreach($ext as $k => $v) {
$poststring .= "&" . $k . "=" . urlencode($v);
}
@@ -112,7 +131,7 @@ function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra
return false;
}
// 30 days. +1 = cut-off time
- $timediff = time() - (31 * 3600 * 24);
+ $timediff = time() - (31 * 3600 * 24);
if ($order->timecreated < $timediff) {
$message = "Transaction must be captured within 30 days. EXPIRED!";
return false;
@@ -129,20 +148,20 @@ function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra
return false;
}
// 120 days
- $timediff = time() - (120 * 3600 * 24);
+ $timediff = time() - (120 * 3600 * 24);
if ($order->timecreated < $timediff) {
$message = "Order can be credited within 120 days!";
return false;
}
// up to original amount
$total = doubleval($extra->sum) + doubleval($extra->amount);
- if ($total > $order->amount) {
+ if (($extra->amount == 0) || ($total > $order->amount)) {
$message = "Can be credited up to original amount.";
return false;
}
$poststring .= "&" . "x_type=CREDIT";
$poststring .= "&" . "x_trans_id=" . urlencode($order->transid);
- $poststring .= "&" . "x_card_num=" . urlencode(sprintf("%04d", intval($order->cclastfour)));
+ $poststring .= "&" . "x_card_num=" . sprintf("%04d", intval($order->cclastfour));
$poststring .= "&" . "x_currency_code=" . urlencode($extra->currency);
$poststring .= "&" . "x_amount=" . urlencode($extra->amount);
break;
@@ -158,32 +177,32 @@ function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra
return false;
}
- if ($order->status == AN_STATUS_AUTH) {
- // 30 days for authonly, make it expired (***********timeupdated)
- $timediff = time() - (30 * 3600 * 24);
- if ($order->timecreated < $timediff) {
- $message = "Auth_only transaction can be voided within 30 days!";
- $order->status = AN_STATUS_EXPIRED;
- return false;
- }
- } elseif ($order->status == (AN_STATUS_AUTH | AN_STATUS_CAPTURE)) {
- // 1 day. Cancel pending settlement.
- $timediff = time() - (2 * 3600 * 24); // TO DO: Cut-off time
- if ($order->timecreated < $timediff) {
- $message = "Settled transaction cannot be voided. Try REFUND!";
- return false;
- }
- } elseif ($order->status == AN_STATUS_CREDIT) {
- // 120 days for credit
- $timediff = time() - (120 * 3600 * 24);
- if ($order->timecreated < $timediff) {
- $message = "Ops! Settled transaction must be credited within 120 days!";
- return false;
- }
- }
- // OK.
- $poststring .= "&" . "x_type=VOID";
- $poststring .= "&" . "x_trans_id=" . urlencode($order->transid);
+ if ($order->status == AN_STATUS_AUTH) {
+ // 30 days for authonly, make it expired (***********timeupdated)
+ $timediff = time() - (30 * 3600 * 24);
+ if ($order->timecreated < $timediff) {
+ $message = "Auth_only transaction can be voided within 30 days!";
+ $order->status = AN_STATUS_EXPIRED;
+ return false;
+ }
+ } elseif ($order->status == (AN_STATUS_AUTH | AN_STATUS_CAPTURE)) {
+ // 1 day. Cancel pending settlement.
+ $timediff = time() - (2 * 3600 * 24); // TO DO: Cut-off time
+ if ($order->timecreated < $timediff) {
+ $message = "Settled transaction cannot be voided. Try REFUND!";
+ return false;
+ }
+ } elseif ($order->status == AN_STATUS_CREDIT) {
+ // 120 days for credit
+ $timediff = time() - (120 * 3600 * 24);
+ if ($order->timecreated < $timediff) {
+ $message = "Ops! Settled transaction must be credited within 120 days!";
+ return false;
+ }
+ }
+ // OK.
+ $poststring .= "&" . "x_type=VOID";
+ $poststring .= "&" . "x_trans_id=" . urlencode($order->transid);
}
default: { // ???
@@ -194,8 +213,8 @@ function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra
// referer
$anrefererheader = '';
- if (!(empty($CFG->an_referer) || $CFG->an_referer == "http://" || $CFG->an_referer == "https://")) {
- $anrefererheader = "Referer: " . $CFG->an_referer . "\r\n";
+ if (!(empty($CFG->an_referer) || $CFG->an_referer == "http://")) {
+ $anrefererheader = "Referer: " . $CFG->an_referer . "\r\n";
}
$response = array();
@@ -241,6 +260,8 @@ function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra
$response[$rcount] = substr($response[$rcount], 0, -1);
}
+ $reason = intval($response[2]);
+
if ($response[0] == AN_APPROVED) {
$order->transid = strval($response[6]); // TransactionID.
$order->timeupdated = time();
@@ -250,10 +271,10 @@ function authorizenet_action(&$order, &$message, $action=AN_ACTION_NONE, $extra
$order->authcode = strval($response[4]); // Authorization or Approval code
$order->avscode = strval($response[5]); // Address Verification System code
if ($action == AN_ACTION_AUTH_ONLY) {
- $order->status = AN_STATUS_AUTH;
+ $order->status = AN_STATUS_AUTH;
}
else {
- $order->status = AN_STATUS_AUTH | AN_STATUS_CAPTURE;
+ $order->status = AN_STATUS_AUTH | AN_STATUS_CAPTURE;
}
break;
View
19 enrol/authorize/enrol.php
@@ -48,9 +48,18 @@ class enrolment_plugin extends enrolment_base
* Credit card error message.
*
* @var string
+ * @access public
*/
var $ccerrormsg;
+ /**
+ * Cron log.
+ *
+ * @var string
+ * @access public
+ */
+ var $log;
+
/**
* Shows a credit card form for registration.
@@ -70,7 +79,7 @@ function print_entry($course)
// check payment
$this->prevent_double_paid($course);
- // I want to paid on SSL.
+ // I want to pay on SSL.
if (empty($_SERVER['HTTPS'])) {
if (empty($CFG->loginhttps)) {
error(get_string("httpsrequired", "enrol_authorize"));
@@ -207,7 +216,7 @@ function cc_submit($form, $course)
$extra->x_invoice_num = $order->id;
$extra->x_description = $course->shortname;
- $message = null;
+ $message = NULL;
$an_review = !empty($CFG->an_review);
$action = $an_review ? AN_ACTION_AUTH_ONLY : AN_ACTION_AUTH_CAPTURE;
$success = authorizenet_action($order, $message, $action, $extra);
@@ -405,7 +414,7 @@ function config_form($frm)
// Admin can check (Accept|Deny) new transactions manually.
if ($count = count_records('enrol_authorize', 'status', AN_STATUS_AUTH)) {
- notify("CRON DISABLED. TRANSACTIONS WITH AN_STATUS_AUTH WILL BE CANCELLED UNLESS YOU CHECK IT. TOTAL $count");
+ notify("CRON DISABLED. TRANSACTIONS WITH A STATUS OF AN_STATUS_AUTH WILL BE CANCELLED UNLESS YOU CHECK IT. TOTAL $count");
}
}
// ***************************************************
@@ -573,10 +582,10 @@ function cron()
$timediffcnf = $timenow - (intval($CFG->an_review_day) * 3600 * 24);
$select = "(status = '" . AN_STATUS_AUTH . "') AND (timeupdated = '0') AND (timecreated < '$timediffcnf') AND (timecreated > '$timediff30')";
if ($orders = get_records_select('enrol_authorize', $select)) {
- set_time_limit(0);
require_once("$CFG->dirroot/enrol/authorize/action.php");
+ @set_time_limit(0);
$this->log = "AUTHORIZE.NET AUTOCAPTURE CRON: " . userdate($timenow) . "\n";
- $message = null;
+ $message = NULL;
foreach ($orders as $order) {
$success = authorizenet_action($order, $message, AN_ACTION_PRIOR_AUTH_CAPTURE);
if ($success) {
Please sign in to comment.
Something went wrong with that request. Please try again.