$status
$PAYMENT_ID
$pay_d
$message
END;
}elseif(($ACTION == 'check' and $status == 0) or ($status != 0)){
$string =<<
$status
$message
END;
}
print "$string";
exit();
}
/////////////////////////////////////////////////////////////////////
/*
function Check_contract - проверка возможности проведения платежа по номеру абонента и сумме платежа
*/
function Check_contract($cid, $summ_pay, $type, $con){
GLOBAL $PAY_MAXSUM;
GLOBAL $PAY_CONTRACT;
GLOBAL $CLIENT_ID;
$PAY_CONTRACT = "";
$CLIENT_ID = "";
if (($summ_pay < 10) or ($summ_pay > $PAY_MAXSUM)){
Answer("3","");
}
$query = "SELECT cc.* FROM ct_t_contract cc where contract_no='$cid'";
$stid = oci_parse($con, $query);
if (!$stid){
Answer("-3","");
}
oci_define_by_name($stid, "ID", $f_id);
oci_define_by_name($stid, "CLIENT_ID", $cl_id);
$r = oci_execute($stid);
if (!$r) {
Answer("-3","");
}
if (oci_fetch($stid)) {
$PAY_CONTRACT=$f_id;
$CLIENT_ID=$cl_id;
oci_free_statement($stid);
return 1;
} else {
oci_free_statement($stid);
Answer("2","");
}
}
/////////////////////////////////////////////////////////////////////
/*
function Check_pay - проверка наличия платежа в биллинге
*/
function Check_pay($p_id, $con){
GLOBAL $PAYMENT_ID;
GLOBAL $DATE;
$PAYMENT_ID="";
$query = "SELECT ID, TO_CHAR(PAY_DATE,'YYYY-MM-DD HH24:MI:SS') PAY_DATE FROM pm_t_payment pm WHERE pm.payment_no = '$p_id'";
$stid = oci_parse($con, $query);
if (!$stid){
Answer("-3","");
}
oci_define_by_name($stid, "ID", $PAYMENT_ID);
oci_define_by_name($stid, "PAY_DATE", $pay_date);
$r = oci_execute($stid);
if (!$r) {
Answer("-3","");
}
if (oci_fetch($stid)) {
oci_free_statement($stid);
$DATE=$pay_date;
return 1;
}else{
oci_free_statement($stid);
return 0;
}
}
/////////////////////////////////////////////////////////////////////
/*
function GetValue - поиск данных объекта договора в биллинге Фастком
*/
function GetValue($objid, $objtype, $propname, $con){
$query = "SELECT v.value
FROM ct_t_value v, ct_t_property p
where v.objprop_id = p.id
and p.code = '$propname'
and p.objecttype_code = '$objtype'
and v.controbj_id = '$objid'";
$stid = oci_parse($con, $query);
if (!$stid){
Answer("-3","");
}
oci_define_by_name($stid, "VALUE", $val);
$r = oci_execute($stid);
if (!$r) {
Answer("-3","");
}
oci_fetch($stid);
oci_free_statement($stid);
return $val;
}
/////////////////////////////////////////////////////////////////////
/*
function Аuthenticate - аутентификация платежной системы Cyberplat в биллинге
и поиск значений, необходимых для занесения платежа в базу данных
*/
function Аuthenticate($con,$username,$password){
GLOBAL $CONTRACT_NO; //Идентификатор платежной системы Cyberplat в биллинге
GLOBAL $ENTERPRISE_ID;
GLOBAL $PAY_MAXSUM; //Максимальная сумма платежа в биллинге
GLOBAL $PAY_FORM;
GLOBAL $CODE;
GLOBAL $CURRENCY_CODE;
$CONTRACT_NO="";
$ENTERPRISE_ID="";
$PAY_FORM="";
$CODE="";
$CURRENCY_CODE="";
$query = "SELECT v.controbj_id
from ct_t_value v, ct_t_property p
WHERE
v.value = '$username' and
v.objprop_id = p.id
and p.code = 'USERNAME'
and p.objecttype_code = 'PAY_RECEIVE'";
$stid = oci_parse($con, $query);
if (!$stid){
Answer("-3","");
}
oci_define_by_name($stid, "CONTROBJ_ID", $c_id);
$r = oci_execute($stid);
if (!$r) {
Answer("-3","");
}
if (!oci_fetch($stid)) {
Answer("-3","");
}
oci_free_statement($stid);
if (GetValue($c_id,'PAY_RECEIVE','PASSWORD',$con) <> $password){
Answer("10","Unauthorized");
} else {
$query_ct = "SELECT ct.*
FROM CT_T_CONTRACT ct, CT_T_OBJECT ob
WHERE ct.id = ob.contract_id
AND ob.id = '$c_id'";
$stid_ct = oci_parse($con, $query_ct);
if (!$stid_ct){
Answer("-3","");
}
oci_define_by_name($stid_ct, "CONTRACT_NO", $c_no);
oci_define_by_name($stid_ct, "ENTERPRISE_ID", $c_enterprise);
$r_ct = oci_execute($stid_ct);
if (!$r_ct) {
Answer("-3","");
}
while (oci_fetch($stid_ct)) {
$CONTRACT_NO=$c_no;
$ENTERPRISE_ID=$c_enterprise;
}
}
oci_free_statement($stid_ct);
$PAY_MAXSUM=GetValue($c_id,'PAY_RECEIVE','MAX_SUMMA',$con);
if(empty($PAY_MAXSUM)){
$PAY_MAXSUM=10000;
}
$paydoccode=GetValue($c_id,'PAY_RECEIVE','PAY_DOCUMENT',$con);
$query_paydoc = "SELECT * FROM RF_T_PAYDOCTYPE WHERE code='$paydoccode'";
$stid_paydoc = oci_parse($con, $query_paydoc);
if (!$stid_paydoc){
Answer("-3","");
}
oci_define_by_name($stid_paydoc, "PAY_FORM", $pay_form);
oci_define_by_name($stid_paydoc, "CODE", $code);
oci_define_by_name($stid_paydoc, "CURRENCY_CODE", $currency_code);
$r_paydoc = oci_execute($stid_paydoc);
if (!$r_paydoc) {
Answer("-3","");
}
while (oci_fetch($stid_paydoc)) {
$PAY_FORM=$pay_form;
$CODE=$code;
$CURRENCY_CODE=$currency_code;
}
oci_free_statement($stid_paydoc);
return 1;
}
/////////////////////////////////////////////////////////////////////
/*
function Payment - проведение платежа в базе данных Fastcom.
$p_no - идентификатор платежа в базе данных АСР "Фастком".
$pay_summ - сумма платежа.
$p_add - номер договора абонента или ФИО для авансовых платежей.
$con - идентификатор соединения к базе данных oracle.
$type - тип платежа (0 - авансовый платеж новых абонентов, 1 - платеж за интернет,
2 - платеж за кабельное телевидение).
*/
function Payment($p_no, $pay_summ, $p_add, $con,$type) {
GLOBAL $CODE;
GLOBAL $CLIENT_ID;
GLOBAL $PAY_CONTRACT;
GLOBAL $ENTERPRISE_ID;
GLOBAL $CURRENCY_CODE;
GLOBAL $PAY_FORM;
GLOBAL $PAYMENT_ID; //id вставляемой записи в базу данных Фастком
GLOBAL $DATE;
$PAYMENT_ID="";
$query_s = "select PM_Q_PAYMENT.NEXTVAL from dual";
$stid = oci_parse($con, $query_s);
if (!$stid){
Answer("-3","");
}
oci_define_by_name($stid, "NEXTVAL", $PAYMENT_ID);
$ex_s = oci_execute($stid);
if (!$ex_s) {
Answer("-3","");
}
if (!oci_fetch($stid)) {
Answer("-3","");
}
oci_free_statement($stid);
$query_i = oci_parse($con, "INSERT INTO PM_T_PAYMENT (ID,
PAYMENT_NO,
PAY_DATE,
PAYFORM,
REST,
SUMMA,
YEARMONTH,
PAYTYPE_CODE,
CLIENT_ID,
CONTRACT_ID,
IS_PROCEED,
FIRST_PROCEED_SUMMA,
OWNER_ID,
WHO_INPUT,
REST4ADV,
IS_NEED_ACCEPT,
CURRENCY_CODE,
COMPUTE_RATE_ODDS,
DIRECTION,
NOTE)
VALUES ($PAYMENT_ID,
'$p_no',
to_date('$DATE', 'YYYY-MM-DD HH24:MI:SS'),
'$PAY_FORM',
$pay_summ,
$pay_summ,
TRUNC(to_date('$DATE', 'YYYY-MM-DD HH24:MI:SS'),'MONTH'),
'$CODE',
'$CLIENT_ID',
'$PAY_CONTRACT',
'N',
$pay_summ,
$ENTERPRISE_ID,
'USER',
$pay_summ,
'Y',
'$CURRENCY_CODE',
'N',
'In',
'$p_add')");
if (!$query_i){
Answer("-3","");
}
$ex_i=oci_execute($query_i);
if (!$ex_i){
Answer("-3","");
}else {
if($type<>0){
$query_proc = "begin bh_p_operations.pay($PAYMENT_ID); end;"; //подтверждение платежа (расход)
$stid_proc = oci_parse($con, $query_proc);
$ex_proc = oci_execute($stid_proc);
oci_free_statement($stid_proc);
}
Answer("0","");
}
}
/////////////////////////////////////////////////////////////////////
/*
function Secure_Number - проверка на принадлежность числам
*/
function Secure_Number($str){
if (preg_match("/^[0-9]+$/", $str) and (strlen($str) <= 11)){
return 1;
} else return 0;
}
/////////////////////////////////////////////////////////////////////
/*
function Secure_Num_Text - проверка наличия текста и чисел
*/
function Secure_Num_Text($str){
if (preg_match("/^[a-zA-Z0-9]+$/", $str) and (strlen($str) <= 20)){
return 1;
} else return 0;
}
/////////////////////////////////////////////////////////////////////
/*
function Secure_Amount - проверка суммы платежа
*/
function Secure_Amount($str){
if (preg_match("/^[\d]+(\.\d{1,2})*$/", $str)){
return 1;
} else return 0;
}
/////////////////////////////////////////////////////////////////////
/*
function Secure_Number_Pay - проверка номера платежа
*/
function Secure_Number_Pay($str){
if (preg_match("/^[0-9]+$/", $str)){
return 1;
} else return 0;
}
/////////////////////////////////////////////////////////////////////
/*
function Secure_Additional - проверка ФИО в поле additional
*/
function Secure_Additional($str){
if (preg_match("/^[0-9\-\sА-Яа-я]+$/", $str) and (strlen($str) <= 60)){
return 1;
} else return 0;
}
/////////////////////////////////////////////////////////////////////
$ACTION = $_GET['action']; //Тип запроса: payment, status, check, cancel
$con=oci_connect("username", "password", "fst"); //Соединение с oracle
if (!$con) {
Answer("-3","");
}
/* Базовая аутентификация Apache
$auth_username="";
$auth_password="";
if(!isset($_SERVER['PHP_AUTH_USER'])){
Header("WWW-Authenticate: Basic realm=\"Payment gate\"");
Header("HTTP/1.0 401 Unauthorized");
exit();
} elseif (!isset($_SERVER['PHP_AUTH_PW'])) {
Header("WWW-Authenticate: Basic realm=\"Payment gate\"");
Header("HTTP/1.0 401 Unauthorized");
exit();
} else {
$auth_username=$_SERVER['PHP_AUTH_USER'];
$auth_password =$_SERVER['PHP_AUTH_PW'];
}
if(!Secure_Num_Text($auth_username)){
Answer("10","Unauthorized");
}
if(!Secure_Num_Text($auth_password)){
Answer("10","Unauthorized");
}
*/
Аuthenticate($con,$auth_username,$auth_password);
if ($ACTION == "payment"){ //Проведение платежа, занесение в базу данных АСР "Фастком"
$type = $_GET['type']; //Тип платежа
$date_payment =urldecode($_GET['date']); //Дата и время платежа
if (preg_match('/^(20\d{2})-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01])T([0-9]{2}):([0-9]{2}):([0-9]{2})$/', $date_payment))
{
$replacement = "$1-$2-$3 $4:$5:$6";
$DATE= preg_replace('/^(20\d{2})-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01])T([0-9]{2}):([0-9]{2}):([0-9]{2})$/', $replacement, $date_payment);
}else { Answer('5','');}
$pay_id = $_GET['receipt']; //Номер платежа
if(!Secure_Number_Pay($pay_id)){
Answer("4","");
}
$pay_amount = $_GET['amount']; //Сумма платежа
if(!Secure_Amount($pay_amount)){
Answer("3","");
}
$payment_no="cyberplat".$pay_id."@".$CONTRACT_NO; //Идентификатор платежа в базе данных АСР "Фастком"
if (($type == 1) or ($type == 2)){//платеж за интернет или кабельное телевидение
$account = $_GET['number']; //Номер абонента
if(!Secure_Number($account)){
Answer("2","");
}
if (Check_contract($account,$pay_amount,$type,$con)){
if (!Check_pay($payment_no, $con)){//проверка наличия в базе данных платежа
Payment($payment_no, $pay_amount, $account, $con,$type);//занесение платежа в базу данных Фастком
}else {
Answer("0","");//платеж успешно проведен
}
}
}elseif($type == 0){ //авансовый платеж новых абонентов
$additional = nl2br(htmlspecialchars(urldecode($_GET['additional']))); //FIO
if(!Secure_Additional($additional)){
Answer("-1","");
}
setlocale (LC_CTYPE, array ('ru_RU.CP1251', 'rus_RUS.1251'));
$additional_u=strtoupper($additional);
$PAY_CONTRACT = "";
$CLIENT_ID = "";
if (!Check_pay($payment_no, $con)){//проверка наличия в базе данных платежа
Payment($payment_no, $pay_amount, $additional_u, $con,$type);//занесение платежа в базу данных Фастком
} else {
Answer("0","");//платеж успешно проведен
}
}else Answer("-2",""); //Неверное значение типа платежа
} elseif ($ACTION == "cancel"){ //Удаление платежа. Не реализовано.
$pay_id = $_GET['receipt']; //Номер платежа
if(!Secure_Number_Pay($pay_id)){
Answer("4","");
}
Answer("9","");
} elseif ($ACTION == "status"){ //Проверка статуса платежа (поиск платежа)
$pay_id = $_GET['receipt']; //Номер платежа
if(!Secure_Number_Pay($pay_id)){
Answer("4","");
}
$payment_no="cyberplat".$pay_id."@".$CONTRACT_NO;
if (Check_pay($payment_no, $con)){ //Проверка наличия в базе данных платежа
Answer("0","");
} Answer("6","");
} elseif ($ACTION == "check") { //Проверка номера абонента и суммы платежа
$type = $_GET['type']; //Тип платежа
$pay_amount = $_GET['amount']; //Сумма платежа
if(!Secure_Amount($pay_amount)){
Answer("3","");
}
if (($type == 1) or ($type == 2)){ //Платеж за интернет или кабельное телевидение
$account = $_GET['number']; //Номер абонента
if(!Secure_Number($account)){
Answer("2","");
}
if (Check_contract($account,$pay_amount,$type,$con)){
Answer("0","");
}
}elseif($type == 0){ //Авансовый платеж новых абонентов. Так как абонент при проверке еще не занесен в базу данных, то результат проверки - всегда успех
$additional = nl2br(htmlspecialchars(urldecode($_GET['additional']))); //ФИО нового абонента, у которого договор в процессе оформления
if(!Secure_Additional($additional)){
Answer("2","");
}
Answer("0","");
}else Answer("-2",""); //Неверное значение типа платежа
} else { //Неверный тип запроса
Answer("1","");
}
$committed = oci_commit($con);
oci_close($con);
?>