moodle/enrol/authorize/localfuncs.php
ethem c9befcd1be If an user's credit card cannot be captured on the internet directly, obtain authorization code over phone from customer's bank.
Some users may not wish to use their credit cards on the internet directly for security reasons.
   In this case, you need to obtain an authorization code from user's bank.
   Initially, ask for credit card information from the customer
   like bank name, name on card, card number, expiry date and card validation code
   by means of phone, face-to-face or a billing application.
   Then, call the customer services of user's bank giving this information and demand an authorization code.
   Finally, after obtaining it, login as user to get the user enrolled.
   Alternatively, you can give it to the user saying enrol using this code.
2006-10-30 12:53:15 +00:00

378 lines
10 KiB
PHP

<?php // $Id$
function get_course_cost($course)
{
global $CFG;
$cost = (float)0;
$currency = (!empty($course->currency))
? $course->currency :( empty($CFG->enrol_currency)
? 'USD' : $CFG->enrol_currency );
if (!empty($course->cost)) {
$cost = (float)(((float)$course->cost) < 0) ? $CFG->enrol_cost : $course->cost;
}
$cost = format_float($cost, 2);
$ret = array(
'cost' => $cost,
'currency' => $currency
);
return $ret;
}
function zero_cost($course) {
$curcost = get_course_cost($course);
return (abs($curcost['cost']) < 0.01);
}
function prevent_double_paid($course)
{
global $CFG, $SESSION, $USER;
$sql = "SELECT id FROM {$CFG->prefix}enrol_authorize
WHERE userid = $USER->id
AND courseid = $course->id ";
if (empty($CFG->an_test)) { // Real mode
$sql .= 'AND status IN('.AN_STATUS_AUTH.','.AN_STATUS_UNDERREVIEW.','.AN_STATUS_APPROVEDREVIEW.')';
}
else { // Test mode
$sql .= 'AND status='.AN_STATUS_NONE;
}
if ($rec = get_record_sql($sql)) {
$a = new stdClass;
$a->orderid = $rec->id;
$a->url = "$CFG->wwwroot/enrol/authorize/index.php?order=$a->orderid";
redirect($a->url, get_string("paymentpending", "enrol_authorize", $a), '10');
return;
}
if (isset($SESSION->ccpaid)) {
unset($SESSION->ccpaid);
redirect($CFG->wwwroot . '/login/logout.php');
return;
}
}
function get_list_of_creditcards($getall = false)
{
global $CFG;
$alltypes = array(
'mcd' => 'Master Card',
'vis' => 'Visa',
'amx' => 'American Express',
'dsc' => 'Discover',
'dnc' => 'Diners Club',
'jcb' => 'JCB',
'swi' => 'Switch',
'dlt' => 'Delta',
'enr' => 'EnRoute'
);
if ($getall or empty($CFG->an_acceptccs)) {
return $alltypes;
}
$ret = array();
$ccs = explode(',', $CFG->an_acceptccs);
foreach ($ccs as $key) {
$ret[$key] = $alltypes[$key];
}
return $ret;
}
function get_list_of_payment_methods($getall = false)
{
global $CFG;
if ($getall || empty($CFG->an_acceptmethods)) {
return array(AN_METHOD_CC, AN_METHOD_ECHECK);
}
else {
return explode(',', $CFG->an_acceptmethods);
}
}
function get_list_of_bank_account_types($getall = false)
{
global $CFG;
if ($getall || empty($CFG->an_acceptechecktypes)) {
return array('CHECKING', 'BUSINESSCHECKING', 'SAVINGS');
}
else {
return explode(',', $CFG->an_acceptechecktypes);
}
}
function ABAVal($aba)
{
if (ereg("^[0-9]{9}$", $aba)) {
$n = 0;
for($i = 0; $i < 9; $i += 3) {
$n += (substr($aba, $i, 1) * 3) +
(substr($aba, $i + 1, 1) * 7) +
(substr($aba, $i + 2, 1));
}
if ($n != 0 and $n % 10 == 0) {
return true;
}
}
return false;
}
function CCVal($Num, $Name = "n/a", $Exp = "")
{
// Check the expiration date first
if (strlen($Exp))
{
$Month = substr($Exp, 0, 2);
$Year = substr($Exp, -2);
$WorkDate = "$Month/01/$Year";
$WorkDate = strtotime($WorkDate);
$LastDay = date("t", $WorkDate);
$Expires = strtotime("$Month/$LastDay/$Year 11:59:59");
if ($Expires < time()) return 0;
}
// Innocent until proven guilty
$GoodCard = true;
// Get rid of any non-digits
$Num = ereg_replace("[^0-9]", "", $Num);
// Perform card-specific checks, if applicable
switch ($Name)
{
case "mcd" :
$GoodCard = ereg("^5[1-5].{14}$", $Num);
break;
case "vis" :
$GoodCard = ereg("^4.{15}$|^4.{12}$", $Num);
break;
case "amx" :
$GoodCard = ereg("^3[47].{13}$", $Num);
break;
case "dsc" :
$GoodCard = ereg("^6011.{12}$", $Num);
break;
case "dnc" :
$GoodCard = ereg("^30[0-5].{11}$|^3[68].{12}$", $Num);
break;
case "jcb" :
$GoodCard = ereg("^3.{15}$|^2131|1800.{11}$", $Num);
break;
case "dlt" :
$GoodCard = ereg("^4.{15}$", $Num);
break;
case "swi" :
$GoodCard = ereg("^[456].{15}$|^[456].{17,18}$", $Num);
break;
case "enr" :
$GoodCard = ereg("^2014.{11}$|^2149.{11}$", $Num);
break;
}
// The Luhn formula works right to left, so reverse the number.
$Num = strrev($Num);
$Total = 0;
for ($x=0; $x < strlen($Num); $x++)
{
$digit = substr($Num, $x, 1);
// If it's an odd digit, double it
if ($x/2 != floor($x/2)) {
$digit *= 2;
// If the result is two digits, add them
if (strlen($digit) == 2)
$digit = substr($digit, 0, 1) + substr($digit, 1, 1);
}
// Add the current digit, doubled and added if applicable, to the Total
$Total += $digit;
}
// If it passed (or bypassed) the card-specific check and the Total is
// evenly divisible by 10, it's cool!
return ($GoodCard && $Total % 10 == 0);
}
function validate_cc_form($form, &$err)
{
global $CFG;
if (empty($form->cc)) {
$err['cc'] = get_string('missingcc', 'enrol_authorize');
}
if (empty($form->ccexpiremm) || empty($form->ccexpireyyyy)) {
$err['ccexpire'] = get_string('missingccexpire', 'enrol_authorize');
}
else {
$expdate = sprintf("%02d", intval($form->ccexpiremm)) . $form->ccexpireyyyy;
$validcc = CCVal($form->cc, $form->cctype, $expdate);
if (!$validcc) {
if ($validcc === 0) {
$err['ccexpire'] = get_string('ccexpired', 'enrol_authorize');
}
else {
$err['cc'] = get_string('ccinvalid', 'enrol_authorize');
}
}
}
if (empty($form->ccfirstname) || empty($form->cclastname)) {
$err['ccfirstlast'] = get_string('missingfullname');
}
if (empty($form->cvv) || !is_numeric($form->cvv)) {
$err['cvv'] = get_string('missingcvv', 'enrol_authorize');
}
if (empty($form->cctype) or !in_array($form->cctype, array_keys(get_list_of_creditcards()))) {
$err['cctype'] = get_string('missingcctype', 'enrol_authorize');
}
if (!empty($CFG->an_authcode) && !empty($form->haveauth) && empty($form->ccauthcode)) {
$err['ccauthcode'] = get_string('missingccauthcode', 'enrol_authorize');
}
if (!empty($CFG->an_avs)) {
if (empty($form->ccaddress)) {
$err['ccaddress'] = get_string('missingaddress', 'enrol_authorize');
}
if (empty($form->cccity)) {
$err['cccity'] = get_string('missingcity');
}
if (empty($form->cccountry)) {
$err['cccountry'] = get_string('missingcountry');
}
}
if (empty($form->cczip) || !is_numeric($form->cczip)) {
$err['cczip'] = get_string('missingzip', 'enrol_authorize');
}
if (!empty($err)) {
$err['header'] = get_string('someerrorswerefound');
return false;
}
return true;
}
function validate_echeck_form($form, &$err)
{
global $CFG;
if (empty($form->abacode) || !is_numeric($form->abacode)) {
$err['abacode'] = get_string('missingaba', 'enrol_authorize');
}
elseif (!ABAVal($form->abacode)) {
$err['abacode'] = get_string('invalidaba', 'enrol_authorize');
}
if (empty($form->accnum) || !is_numeric($form->accnum)) {
$err['accnum'] = get_string('invalidaccnum', 'enrol_authorize');
}
if (empty($form->acctype) || !in_array($form->acctype, get_list_of_bank_account_types())) {
$err['acctype'] = get_string('invalidacctype', 'enrol_authorize');
}
if (empty($form->bankname)) {
$err['bankname'] = get_string('missingbankname', 'enrol_authorize');
}
if (empty($form->firstname) || empty($form->lastname)) {
$err['firstlast'] = get_string('missingfullname');
}
if (!empty($err)) {
$err['header'] = get_string('someerrorswerefound');
return false;
}
return true;
}
function email_to_admin($subject, $data)
{
global $SITE;
$admin = get_admin();
$data = (array)$data;
$message = "$SITE->fullname: Transaction failed.\n\n$subject\n\n";
$message .= print_r($data, true);
email_to_user($admin, $admin, "$SITE->fullname: Authorize.net ERROR", $message);
}
function send_welcome_messages($orderdata)
{
global $CFG, $SITE;
if (empty($orderdata)) {
return;
}
if (is_numeric($orderdata)) {
$orderdata = array($orderdata);
}
$select = "SELECT e.id, e.courseid, e.userid, c.fullname
FROM {$CFG->prefix}enrol_authorize e
INNER JOIN {$CFG->prefix}course c ON c.id = e.courseid
WHERE e.id IN(" . implode(',', $orderdata) . ")
ORDER BY e.userid";
$emailinfo = get_records_sql($select);
$emailcount = count($emailinfo);
if ($emailcount == 1) {
$ei = reset($emailinfo);
if (!$sender = get_teacher($ei->courseid)) {
$sender = get_admin();
}
}
else {
$sender = get_admin();
}
$ei = reset($emailinfo);
while ($ei !== false) {
$usercourses = array();
$lastuserid = $ei->userid;
for ($current = $ei; $current !== false && $current->userid == $lastuserid; $current = next($emailinfo)) {
$usercourses[] = $current->fullname;
}
$ei = $current;
$a = new stdClass;
$a->courses = implode("\n", $usercourses);
$a->profileurl = "$CFG->wwwroot/user/view.php?id=$lastuserid";
$a->paymenturl = "$CFG->wwwroot/enrol/authorize/index.php?user=$lastuserid";
$emailmessage = get_string('welcometocoursesemail', 'enrol_authorize', $a);
$user = get_record('user', 'id', $lastuserid);
@email_to_user($user, $sender, get_string("enrolmentnew", '', $SITE->shortname), $emailmessage);
}
}
function check_openssl_loaded()
{
return extension_loaded('openssl');
}
?>