/home/desid573/public_html/payment/xero-2
NameSizeModeActions
.github/-0755rm
doc/-0755rm
docs/-0755rm
lib/-0755rm
pdf/-0755rm
test/-0755rm
vendor/-0755rm
vendor-old/-0755rm
.gitignore250644editdlrm
addBillingContact.php52470644editdlrm
authorisation.php15100644editdlrm
authorizedResource.php17920644editdlrm
callback.php30140644editdlrm
CODE_OF_CONDUCT.md33440644editdlrm
composer.json10270644editdlrm
CONTRIBUTING.md53840644editdlrm
error_log3073773500644editdlrm
git_push.sh16610644editdlrm
invoiceSend.php115280644editdlrm
LICENSE10750644editdlrm
phpunit.xml.dist6880644editdlrm
README.md249020644editdlrm
rgtiSend.php79400644editdlrm
storage.php16020644editdlrm
vendor.zip31285120644editdlrm
webhook.php173700644editdlrm
webhook_response.php165620644editdlrm
Edit: /home/desid573/public_html/payment/xero-2/webhook_response.php (16562B)
'51DABYIYXXBZDHAZTVAXBX6TU7T3AT', // 'shared_secret' => 'RE390CCDJV1VD29SUZI9VBWTVUV7VF', // // API versions // 'core_version' => '2.0', // 'payroll_version' => '1.0', // 'file_version' => '1.0' // ); // if (XRO_APP_TYPE == "Private" || XRO_APP_TYPE == "Partner") { // $signatures ['rsa_private_key'] = BASE_PATH . '/certs/privatekey.pem'; // $signatures ['rsa_public_key'] = BASE_PATH . '/certs/publickey.cer'; // } // $XeroOAuth = new XeroOAuth ( array_merge ( array ( // 'application_type' => XRO_APP_TYPE, // 'oauth_callback' => OAUTH_CALLBACK, // 'user_agent' => $useragent // ), $signatures ) ); // $initialCheck = $XeroOAuth->diagnostics (); // $checkErrors = count ( $initialCheck ); // if ($checkErrors > 0) { // // you could handle any config errors here, or keep on truckin if you like to live dangerously // foreach ( $initialCheck as $check ) { // error_log('Error: ' . $check); // } // } else { // $session = persistSession ( array ( // 'oauth_token' => $XeroOAuth->config ['consumer_key'], // 'oauth_token_secret' => $XeroOAuth->config ['shared_secret'], // 'oauth_session_handle' => '' // ) ); // $oauthSession = retrieveSession (); // } // $XeroOAuth->config ['access_token'] = $oauthSession ['oauth_token']; // $XeroOAuth->config ['access_token_secret'] = $oauthSession ['oauth_token_secret']; $dbhost = "localhost"; $dbuser = "desid573_famcab"; $dbpass = "C]+6wQySxov("; $dbname = "desid573_familycab"; $conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname) or die($conn->connect_error); $qcon=mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); $sql = "SELECT `id`, `token`, `expires`, `tenant_id`, `refresh_token`, `id_token` FROM `desid573_eway_codes`.`xero_token` ORDER BY `id` DESC"; $result = $conn->query($sql); $storage = $result->fetch_assoc(); error_log(time()." > ".$storage["expires"]); $xeroTenantId = $storage["tenant_id"]; $token = $storage['token']; if(time() > $storage["expires"]) { $provider = new \League\OAuth2\Client\Provider\GenericProvider([ 'clientId' => '792F5D6E7E10404EA0BD0DA3CFF525BC', 'clientSecret' => '_w1yk8UQTp5QV9CzzDD4G3daZXjANQ40hQfyUZf91jUxemGF', 'redirectUri' => 'https://desidrivers.com.au/payment/xero-2/callback.php', 'urlAuthorize' => 'https://login.xero.com/identity/connect/authorize', 'urlAccessToken' => 'https://identity.xero.com/connect/token', 'urlResourceOwnerDetails' => 'https://api.xero.com/api.xro/2.0/Organisation' ]); $newAccessToken = $provider->getAccessToken('refresh_token', [ 'refresh_token' => $storage["refresh_token"] ]); $token = $newAccessToken->getToken(); $sql = "INSERT INTO `desid573_eway_codes`.`xero_token`(`id`, `token`, `expires`, `tenant_id`, `refresh_token`, `id_token`) VALUES (NULL,'".$newAccessToken->getToken()."',".$newAccessToken->getExpires().",'".$storage["tenant_id"]."','".$newAccessToken->getRefreshToken()."','".$newAccessToken->getValues()["id_token"]."')"; error_log($sql); $query = $conn->query($sql); if(!$query) { error_log($conn->error); } } $config = XeroAPI\XeroPHP\Configuration::getDefaultConfiguration()->setAccessToken($token); $config->setHost("https://api.xero.com/api.xro/2.0"); // $apiInstance = new XeroAPI\XeroPHP\Api\AccountingApi( // new GuzzleHttp\Client(), // $config // ); $endpoint = "Invoices"; $accountingApi = new XeroAPI\XeroPHP\Api\AccountingApi( new GuzzleHttp\Client(), $config ); $sql = "SELECT * FROM `desid573_eway_codes`.`webhook_payload` WHERE `processed` = 0"; $result = $conn->query($sql); if($result->num_rows > 0) { $eventlog = array(); while($row = $result->fetch_assoc()) { $pay = json_decode($row["payload"], true); $payload = $pay["events"]; foreach($payload as $event) { error_log($event["eventCategory"]." ".$event["eventType"]); $invoice_id = $event["resourceId"]; if(array_search($invoice_id, $eventlog, true) === false) { array_push($eventlog, $invoice_id); $invoice = lookUpInvoice($invoice_id); error_log("type: ".$invoice["Type"]); if($event["eventCategory"] == "INVOICE" && $event["eventType"] == "CREATE" && $invoice["Type"] == "ACCREC") { error_log("passed INVOICE CREATE ACCREC"); //look up invoice if(!$invoice) { error_log("no invoice found"); } else { $name = $invoice["Contact"]["Name"]; $amount = "$".sprintf('%0.2f',$invoice["Total"]); $type = $invoice["LineItems"][0]["ItemCode"]; if($invoice["AmountDue"] == "0.00") { $payment = "$".$invoice["Payments"]["Payment"]["Amount"]." Paid"; } $string = "New ".$type." Invoice created for ".$name." ".$amount; if($invoice["AmountDue"] == 0) { $name = $invoice["Contact"]["Name"]; $type = $invoice["LineItems"][0]["ItemCode"]; $payment = "$".sprintf('%0.2f',$invoice["Payments"][0]["Amount"]); $amount = "$".sprintf('%0.2f',$invoice["Total"]); $invType = $invoice["Type"]; $string .= " - Paid ".$payment; //sendToSlack($string); $email = $invoice["Contact"]["EmailAddress"]; error_log("Type: ".$invType); if($email != "" && $name != "cash" && $invType == "ACCREC") { //check if sent $query = "SELECT * FROM `desid573_eway_codes`.`customer_invoices_sent` WHERE `invoice_id` = '".$invoice_id."'"; $result2 = $conn->query($query); if($result2->num_rows == 0) { $pdf = getPDF($xeroTenantId, $accountingApi,$invoice_id); if($pdf) { $mail = sendFromGmail($type, $invoice, $invoice_id); if($mail) { $query = "INSERT INTO `desid573_eway_codes`.`customer_invoices_sent`(`id`, `customer_name`, `invoice_amount`, `invoice_id`, `date_sent`) VALUES (NULL,'".$name."','".$amount."','".$invoice_id."',NOW())"; $result3 = $conn->query($query); if(!$result3) { error_log("invoice add error ".$conn->error); } $string .= " Invoice Emailed"; } } } } } sendToSlack($string); $email = $invoice["Contact"]["EmailAddress"]; } } if($event["eventCategory"] == "INVOICE" && $event["eventType"] == "UPDATE") { if($invoice["AmountDue"] == "0.00") { $name = $invoice["Contact"]["Name"]; $type = $invoice["LineItems"][0]["ItemCode"]; $payment = "$".sprintf('%0.2f',$invoice["Payments"][0]["Amount"]); $amount = "$".sprintf('%0.2f',$invoice["Total"]); $string = $type." Invoice for ".$name." now paid ".$payment; $email = $invoice["Contact"]["EmailAddress"]; error_log("email = ".$email); if($email != "" && $name != "cash" && $invoice["Type"] == "ACCREC") { //check if sent $query = "SELECT * FROM `desid573_eway_codes`.`customer_invoices_sent` WHERE `invoice_id` = '".$invoice_id."'"; $result1 = $conn->query($query); if($result1->num_rows == 0) { $pdf = getPDF($xeroTenantId, $accountingApi,$invoice_id); if($pdf) { $mail = sendFromGmail($type, $invoice, $invoice_id); if($mail) { $query = "INSERT INTO `desid573_eway_codes`.`customer_invoices_sent`(`id`, `customer_name`, `invoice_amount`, `invoice_id`, `date_sent`) VALUES (NULL,'".$name."','".$amount."','".$invoice_id."',NOW())"; $result2 = $conn->query($query); if(!$result2) { error_log("invoice add error ".$conn->error); } $string .= " Invoice Emailed"; } } } } sendToSlack($string); } } } } $sql = "UPDATE `desid573_eway_codes`.`webhook_payload` SET `processed` = 1 WHERE `id` = ".$row["id"]; $update = $conn->query($sql); if(!$update) { error_log("update error ".$conn->error); } } } //error_log($accountingApi); // Store information into file // Request Headers $filedata = sprintf( "%s %s %s\n\n---- Request headers ----\n", $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], $_SERVER['SERVER_PROTOCOL'] ); foreach (getHeaderList() as $name => $value) { $filedata .= $name . ': ' . $value . "\n"; } // Request Body $filedata .= "\n---- Request body ----\n"; $filedata .= $payload . "\n"; // Signature key $filedata .= "\n---- Signature key ----"; $filedata .= "\nComputed signature key:\n"; $filedata .= $yourHash; $filedata .= "\nXero signature key:\n"; $filedata .= $_SERVER['HTTP_X_XERO_SIGNATURE']; // Result $filedata .= "\n\n---- Result ----\n"; if ($isEqual) { $filedata .= "Match"; } else { $filedata .= "Not match"; } // Store to file $currentTime = microtime(); $filename = substr($currentTime, 11) . substr($currentTime, 2, 8); //output to file //file_put_contents('./'.$filename.'.txt', $filedata); // ---------------------------------------------------------------------------- // Helper function(s) function sendToSlack($message) { $url = 'https://hooks.slack.com/services/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'; $curlObj = curl_init(); curl_setopt($curlObj, CURLOPT_URL, $url); curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curlObj, CURLOPT_HEADER, 0); curl_setopt($curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json')); curl_setopt($curlObj, CURLOPT_POST, 1); curl_setopt($curlObj, CURLOPT_POSTFIELDS, '{"text": "'.$message.'"}'); $response = curl_exec($curlObj); curl_close($curlObj); } function getHeaderList() { $headerList = []; foreach ($_SERVER as $name => $value) { if (preg_match('/^HTTP_/',$name)) { $headerList[$name] = $value; } } return $headerList; } function lookUpInvoice($id) { global $xeroTenantId; global $accountingApi; error_log("called look up ".$id); try { $apiResponse = $accountingApi->getInvoice($xeroTenantId, $id); $result = $apiResponse->getInvoices()[0]; error_log("invoice ".$result); $array = json_decode($apiResponse, true); return $array["Invoices"][0]; } catch (Exception $e) { error_log('Exception when calling AccountingApi->getInvoices: '.$e->getMessage()); } // $url = $XeroOAuth->url('Invoices', 'core')."/".$id; // error_log($url); // $response = $XeroOAuth->request('GET', $url, $params); // if ($XeroOAuth->response['code'] == 200) { // $invoices = $XeroOAuth->parseResponse($XeroOAuth->response['response'], $XeroOAuth->response['format']); // error_log(json_encode($invoices, true)); // if(count($invoices->Invoices[0]) > 0) { // return $invoices->Invoices[0]->Invoice; // } else { // return false; // } // } else { // error_log("error with oauth token"); // } } function getPDF($xeroTenantId,$accountingApi,$invoice_id){ // global $XeroOAuth; // $response = $XeroOAuth->request('GET', $XeroOAuth->url('Invoice/'.$invoice_id, 'core'), array(), "", 'pdf'); // if ($XeroOAuth->response['code'] == 200) { // $myFile = "pdf/".$invoice_id.".pdf"; // $fh = fopen($myFile, 'w') or die("can't open file"); // fwrite($fh, $XeroOAuth->response['response']); // fclose($fh); // return true; // } else { // outputError($XeroOAuth); // return false; // } try { $result = $accountingApi->getInvoiceAsPdf($xeroTenantId, $invoice_id, "application/pdf"); $myFile = "pdf/".$invoice_id.".pdf"; $content = $result->fread($result->getSize()); if(file_put_contents( $myFile,$content)) { return true; } else { return false; } // $fh = fopen($myFile, 'w') or die("can't open file"); // fwrite($fh, 200); // fclose($fh); // return true; } catch (Exception $e) { error_log('Exception when calling AccountingApi->getInvoiceAsPdf: '.$e->getMessage()); } } function persistSession($response) { if (isset($response)) { $_SESSION['access_token'] = $response['oauth_token']; $_SESSION['oauth_token_secret'] = $response['oauth_token_secret']; if(isset($response['oauth_session_handle'])) $_SESSION['session_handle'] = $response['oauth_session_handle']; } else { return false; } } /** * Retrieve the OAuth access token and session handle * In my example I am just using the session, but in real world, this is should be a storage engine * */ function retrieveSession() { if (isset($_SESSION['access_token'])) { $response['oauth_token'] = $_SESSION['access_token']; $response['oauth_token_secret'] = $_SESSION['oauth_token_secret']; $response['oauth_session_handle'] = $_SESSION['session_handle']; return $response; } else { return false; } } function outputError($XeroOAuth) { error_log('Error: ' . $XeroOAuth->response['response']); pr($XeroOAuth); } /** * Debug function for printing the content of an object * * @param mixes $obj */ function pr($obj) { if (!is_cli()) echo '
';
    if (is_object($obj))
        print_r($obj);
    elseif (is_array($obj))
        print_r($obj);
    else
        echo $obj;
    if (!is_cli())
        echo '
'; } function is_cli() { return (PHP_SAPI == 'cli' && empty($_SERVER['REMOTE_ADDR'])); }