callback-exec.php
来自「asterisk用 的voip记费软件」· PHP 代码 · 共 347 行
PHP
347 行
<?php/*************************************************************************** * * callbackexec.php : PHP A2Billing - Request Callback * Written for PHP 4.x & PHP 5.X versions. * * A2Billing -- Asterisk billing solution. * Copyright (C) 2004, 2007 Belaid Arezqui <areski _atl_ gmail com> * * See http://www.asterisk2billing.org for more information about * the A2Billing project. * Please submit bug reports, patches, etc to <areski _atl_ gmail com> * * This software is released under the terms of the GNU Lesser General Public License v2.1 * A copy of which is available from http://www.gnu.org/copyleft/lesser.html * ****************************************************************************//*************************************************************************** * * USAGE : http://domainname/A2Billing_UI/api/SOAP/callbackexec.php?wsdl * * http://localhost/~areski/svn/a2billing/trunk/A2Billing_UI/api/SOAP/callbackexec.php?wsdl * * http://domain/path/soap/soap-db-callback.php?security_key=13a7fa40cfcef6fe7ac9718a5c76cdb5&phone_number=XXXXX&callerid=123456 * &callback_time=2006-09-20+19%3A30%3A00 * ****************************************************************************/include ("../../lib/defines.php");include ("../../lib/regular_express.inc");include ("../../lib/Class.RateEngine.php"); require_once('SOAP/Server.php');require_once('SOAP/Disco.php');define ("LOG_CALLBACK", isset($A2B->config["log-files"]['api_callback'])?$A2B->config["log-files"]['api_callback']:null); /*//$phone_number = '34650784355';$phone_number = $_GET['phone_number'];$callerid = $_GET['callerid'];$security_key = $_GET['security_key'];$uniqueid = $_GET['uniqueid'];$callback_time = urldecode($_GET['callback_time']);*///$ans = Request($security_key, $phone_number, $callerid, $callback_time, $uniqueid);//print_r($ans);class Callback{ var $__dispatch_map = array(); function Callback() { // Define the signature of the dispatch map on the Web servicesmethod // Necessary for WSDL creation $this->__dispatch_map['Request'] = array('in' => array('security_key' => 'string', 'pn_callingparty' => 'string', 'pn_calledparty' => 'string', 'callerid' => 'string', 'callback_time' => 'string', 'uniqueid' => 'string'), 'out' => array('id' => 'string', 'result' => 'string', 'details' => 'string') ); $this->__dispatch_map['Status'] = array('in' => array('security_key' => 'string', 'id' => 'string'), 'out' => array('uniqueid' => 'string', 'result' => 'string', 'details' => 'string') ); } /* * Function to make Callback : it will insert a callback request */ function Status($security_key, $id){ $status = 'null'; $uniqueid = ''; $DBHandle = DbConnect(); $instance_table = new Table(); $QUERY = "SELECT status, uniqueid FROM cc_callback_spool WHERE id='$id'"; $callback_data = $instance_table -> SQLExec ($DBHandle, $QUERY); if(!is_array($callback_data) || count($callback_data) == 0) { // FAIL SELECT write_log( LOG_CALLBACK, basename(__FILE__).' line:'.__LINE__."[" . date("Y/m/d G:i:s", mktime()) . "] "." ERROR SELECT -> \n QUERY=".$QUERY); sleep(2); return array($uniqueid, 'result=null', ' ERROR - SELECT DB'); } $status = $callback_data[0][0]; $uniqueid = $callback_data[0][1]; return array($uniqueid, 'result='.$status, " - Callback request found $QUERY"); } /* * Function to make Callback : it will insert a callback request */ function Request($security_key, $called, $calling, $callerid, $callback_time, $uniqueid){ global $A2B; /* $status = 'PENDING'; $server_ip = 'localhost'; $num_attempt = 0; $channel = 'SIP/'.$phone_number.'@mylittleIP'; $exten = $phone_number; $context = 'a2billing'; $priority = 1; //$timeout callerid $variable = "phonenumber=$phone_number|callerid=$callerid"; */ $phone_number = $called; $insert_id_callback = 'null'; if (strlen($uniqueid)==0){ $uniqueid = MDP_STRING(5).'-'.MDP_NUMERIC(10); } $FG_regular[] = array( "^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$" ,"(YYYY-MM-DD HH:MM:SS)"); // The wrapper variables for security // $security_key = API_SECURITY_KEY; write_log( LOG_CALLBACK, " Service_Callback( security_key=$security_key, called=$called, calling=$calling, callerid=$callerid, uniqueid=$uniqueid, callback_time=$callback_time)"); $mysecurity_key = API_SECURITY_KEY; $mail_content = "[" . date("Y/m/d G:i:s", mktime()) . "] "."SOAP API - Request asked: Callback [$phone_number, callback_time=$callback_time]"; // CHECK CALLERID if (strlen($callerid)<1) { write_log( LOG_CALLBACK, basename(__FILE__).' line:'.__LINE__."[" . date("Y/m/d G:i:s", mktime()) . "] "." ERROR FORMAT CALLERID AT LEAST 1 DIGIT "); sleep(2); return array($insert_id_callback, 'result=Error', " ERROR - FORMAT CALLERID AT LEAST 1 DIGIT "); } // CHECK PHONE_NUMBER if (strlen($phone_number)<10) { write_log( LOG_CALLBACK, basename(__FILE__).' line:'.__LINE__."[" . date("Y/m/d G:i:s", mktime()) . "] "." ERROR FORMAT PHONENUMBER AT LEAST 10 DIGITS "); sleep(2); return array($insert_id_callback, 'result=Error', " ERROR - FORMAT PHONENUMBER AT LEAST 10 DIGITS "); } // CHECK CALLBACK TIME if (strlen($callback_time)>1 && !(ereg( $FG_regular[0][0], $callback_time))) { write_log( LOG_CALLBACK, basename(__FILE__).' line:'.__LINE__."[" . date("Y/m/d G:i:s", mktime()) . "] "." ERROR FORMAT CALLBACKTIME : ".$FG_regular[0][0]); sleep(2); return array($insert_id_callback, 'result=Error', " ERROR - FORMAT CALLBACKTIME : ".$FG_regular[0][0]); } // CHECK SECURITY KEY if (md5($mysecurity_key) !== $security_key || strlen($security_key)==0) { write_log( LOG_CALLBACK, basename(__FILE__).' line:'.__LINE__."[" . date("Y/m/d G:i:s", mktime()) . "] "." CODE_ERROR SECURITY_KEY"); sleep(2); return array($insert_id_callback, 'result=Error', ' KEY - BAD PARAMETER '); } $DBHandle = DbConnect(); if (!$DBHandle){ write_log( LOG_CALLBACK, basename(__FILE__).' line:'.__LINE__."[" . date("Y/m/d G:i:s", mktime()) . "] "." ERROR CONNECT DB"); sleep(2); return array($insert_id_callback, 'result=Error', ' ERROR - CONNECT DB '); } $A2B -> DBHandle = $DBHandle; $instance_table = new Table(); $A2B -> set_instance_table ($instance_table); $called=ereg_replace("^\+","011",$called); $calling=ereg_replace("^\+","011",$calling); $called=ereg_replace("[^0-9]","",$called); $calling=ereg_replace("[^0-9]","",$calling); $called=ereg_replace("^01100","011",$called); $calling=ereg_replace("^01100","011",$calling); $called=ereg_replace("^00","011",$called); $calling=ereg_replace("^00","011",$calling); $called=ereg_replace("^0111","1",$called); $calling=ereg_replace("^0111","1",$calling); $A2B -> credit = 1000; $A2B -> tariff = $A2B -> config["callback"]['all_callback_tariff']; $RateEngine = new RateEngine(); // $RateEngine -> webui = 0; // LOOKUP RATE : FIND A RATE FOR THIS DESTINATION $A2B ->dnid = $A2B ->destination = $caller_areacode.$A2B->CallerID; $resfindrate = $RateEngine -> rate_engine_findrates($A2B, $A2B ->destination, $A2B ->tariff); // IF FIND RATE if ($resfindrate!=0){ //$RateEngine -> debug_st = 1; $res_all_calcultimeout = $RateEngine -> rate_engine_all_calcultimeout($A2B, $A2B->credit); if ($res_all_calcultimeout){ // MAKE THE CALL if ($RateEngine -> ratecard_obj[0][34]!='-1'){ $usetrunk = 34; $usetrunk_failover = 1; $RateEngine -> usedtrunk = $RateEngine -> ratecard_obj[$k][34]; } else { $usetrunk = 29; $RateEngine -> usedtrunk = $RateEngine -> ratecard_obj[$k][29]; $usetrunk_failover = 0; } $prefix = $RateEngine -> ratecard_obj[0][$usetrunk+1]; $tech = $RateEngine -> ratecard_obj[0][$usetrunk+2]; $ipaddress = $RateEngine -> ratecard_obj[0][$usetrunk+3]; $removeprefix = $RateEngine -> ratecard_obj[0][$usetrunk+4]; $timeout = $RateEngine -> ratecard_obj[0]['timeout']; $failover_trunk = $RateEngine -> ratecard_obj[0][40+$usetrunk_failover]; $addparameter = $RateEngine -> ratecard_obj[0][42+$usetrunk_failover]; $destination = $A2B ->destination; if (strncmp($destination, $removeprefix, strlen($removeprefix)) == 0) $destination= substr($destination, strlen($removeprefix)); $pos_dialingnumber = strpos($ipaddress, '%dialingnumber%' ); $ipaddress = str_replace("%cardnumber%", $A2B->cardnumber, $ipaddress); $ipaddress = str_replace("%dialingnumber%", $prefix.$destination, $ipaddress); if ($pos_dialingnumber !== false){ $dialstr = "$tech/$ipaddress".$dialparams; }else{ if ($A2B->agiconfig['switchdialcommand'] == 1){ $dialstr = "$tech/$prefix$destination@$ipaddress".$dialparams; }else{ $dialstr = "$tech/$ipaddress/$prefix$destination".$dialparams; } } //ADDITIONAL PARAMETER %dialingnumber%, %cardnumber% if (strlen($addparameter)>0){ $addparameter = str_replace("%cardnumber%", $A2B->cardnumber, $addparameter); $addparameter = str_replace("%dialingnumber%", $prefix.$destination, $addparameter); $dialstr .= $addparameter; } $channel = $dialstr; $exten = $calling; $context = $A2B -> config["callback"]['context_callback']; $id_server_group = $A2B -> config["callback"]['id_server_group']; $priority = 1; $timeout = $A2B -> config["callback"]['timeout']*1000; $application = ''; $status = 'PENDING'; $server_ip = 'localhost'; $num_attempt = 0; $variable = "CALLED=$called|CALLING=$calling|CBID=$uniqueid|TARIFF=".$A2B ->tariff; if (is_numeric($A2B -> config["callback"]['sec_wait_before_callback']) && $A2B -> config["callback"]['sec_wait_before_callback']>=1){ $sec_wait_before_callback = $A2B -> config["callback"]['sec_wait_before_callback']; }else{ $sec_wait_before_callback = 1; } // LIST FIELDS TO INSERT CALLBACK REQUEST $QUERY_FIELS = 'uniqueid, status, server_ip, num_attempt, channel, exten, context, priority, variable, id_server_group, callback_time, account, callerid, timeout'; // DEFINE THE CORRECT VALUE FOR THE INSERT if (strlen($callback_time)>1){ $QUERY_VALUES = "'$uniqueid', '$status', '$server_ip', '$num_attempt', '$channel', '$exten', '$context', '$priority', '$variable', '$id_server_group', '$callback_time', '$account', '$callerid', '30000'"; }else{ if ($A2B->config["database"]['dbtype'] != "postgres"){ // MYSQL $QUERY_VALUES = "'$uniqueid', '$status', '$server_ip', '$num_attempt', '$channel', '$exten', '$context', '$priority', '$variable', '$id_server_group', ADDDATE( CURRENT_TIMESTAMP, INTERVAL $sec_wait_before_callback SECOND ), '$account', '$callerid', '30000'"; }else{ // POSTGRESQL $QUERY_VALUES = "'$uniqueid', '$status', '$server_ip', '$num_attempt', '$channel', '$exten', '$context', '$priority', '$variable', '$id_server_group', (CURRENT_TIMESTAMP + INTERVAL '$sec_wait_before_callback SECOND'), '$account', '$callerid', '30000'"; } } $insert_id_callback = $instance_table -> Add_table ($DBHandle, $QUERY_VALUES, $QUERY_FIELS, 'cc_callback_spool', 'id'); if (!$insert_id_callback){ // FAIL INSERT write_log( LOG_CALLBACK, basename(__FILE__).' line:'.__LINE__."[" . date("Y/m/d G:i:s", mktime()) . "] "." ERROR INSERT -> \n QUERY=".$QUERY); sleep(2); return array($insert_id_callback, 'result=Error', ' ERROR - INSERT INTO DB'); } // SUCCEED INSERT write_log( LOG_CALLBACK, basename(__FILE__).' line:'.__LINE__."[" . date("Y/m/d G:i:s", mktime()) . "] "." CALLBACK INSERTED -> \n QUERY=".$QUERY); return array($insert_id_callback, 'result=Success', " Success - Callback request has been accepted "); }else{ $error_msg = 'Error : You don t have enough credit to call you back !!!'; } }else{ $error_msg = 'Error : There is no route to call back your phonenumber !!!'; } // CALLBACK FAIL write_log( LOG_CALLBACK, "error_msg = $error_msg"); return array($insert_id_callback, 'result=Error', " ERROR - $error_msg"); }} // end Class$server = new SOAP_Server();$webservice = new Callback();// TEST WITH SOAP// $webservice -> Request(md5(API_SECURITY_KEY), '1234567896', '2342354324', '223424234', $callback_time, $uniqueid);// exit;$server->addObjectMap($webservice, 'http://schemas.xmlsoap.org/soap/envelope/');if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']=='POST') { $server->service($HTTP_RAW_POST_DATA); } else { // Create the DISCO server $disco = new SOAP_DISCO_Server($server,'Callback'); header("Content-type: text/xml"); if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'],'wsdl') == 0) { echo $disco->getWSDL(); } else { echo $disco->getDISCO(); }}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?