/home/desid573/public_html/payment/xero-2
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']));
}