Rev 162 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/* (C) 2013 eBay Inc., All Rights Reserved *//* Licensed under CDDL 1.0 - http://opensource.org/licenses/cddl1.php */?><?php$DEBUG = false;$capturePath = "captures/";// be sure include path contains current and shopify directoryini_set('include_path', ini_get('include_path') . ':.:../php:../../shopify/php');// Load general helper classes for eBay SOAP APIrequire_once 'keys.php';require_once 'eBaySOAP.php';require_once 'Shopify.php';function debug_string_backtrace() {ob_start();debug_print_backtrace();$trace = ob_get_contents();ob_end_clean();// Remove first item from backtrace as it's this function which is redundant.$trace = preg_replace('/^#0\s+' . __FUNCTION__ . "[^\n]*\n/", '', $trace, 1);return $trace;}class eBayPlatformNotificationListener extends eBayPlatformNotifications {protected $NotificationSignature;// Dispatch method to ensure signature validationpublic function __call($method, $args) {$s = "Called with $method";$this->carp($s);// Print backtrace and arguments$this->carp(debug_string_backtrace());$this->carp("args=" . print_r($args, true));if ($this->ValidateSignature($args[0])) {// strip off trailing "Request"$method = substr($method, 0, -8);if (method_exists($this, $method)) {return call_user_func_array(array($this,$method) , $args);}else {$this->errorLog("Unhandled Event: args=" . print_r($args, true));}}// Today is a good day to die.die("Death");}// Extract Signature for validation later// Can't validate here because we don't have access to the Timestamppublic function RequesterCredentials($RequesterCredentials) {$this->NotificationSignature = $RequesterCredentials->NotificationSignature;}protected function ValidateSignature($Timestamp) {// Check for Signature Match$CalculatedSignature = $this->CalculateSignature($Timestamp);$NotificationSignature = $this->NotificationSignature;if ($CalculatedSignature != $NotificationSignature) {//bugbug $this->errorLog("Sig Mismatch: Calc: $CalculatedSignature, Note: $NotificationSignature");//bugbug return false;}else {$this->carp("Sig Match: $NotificationSignature");}// Check that Timestamp is within 10 minutes of now$tz = date_default_timezone_get();date_default_timezone_set('UTC');$then = strtotime($Timestamp);$now = time();date_default_timezone_set($tz);$drift = $now - $then;$ten_minutes = 60 * 10;if ($drift > $ten_minutes) {$this->errorLog("Time Drift is too large: $drift seconds, Note: $NotificationSignature");return false;}else {$this->carp("Time Drift is okay: $drift seconds");}return true;}// Arg order is brittle, assumes constant return ordering from eBaypublic function GetMemberMessages($Timestamp, $Ack, $CorrelationID, $Version, $Build, $NotificationEventName, $RecipientUserID, $SellerEIASToken, $MemberMessage, $PaginationResult, $HasMoreItems) {$ItemID = $MemberMessage->MemberMessageExchange->Item->ItemID;$Seller = $MemberMessage->MemberMessageExchange->Item->Seller->UserID;$Sender = $MemberMessage->MemberMessageExchange->Question->SenderID;$this->notificationLog("$NotificationEventName: From $Sender to $Seller regarding Item $ItemID");return "";}public function GetItem($Timestamp, $Ack, $CorrelationID, $Version, $Build, $NotificationEventName, $RecipientUserID, $BuyerEIASToken, $Item) {$ItemID = $Item->ItemID;$Title = $Item->Title;$UPC = (isset($Item->ProductListingDetails->UPC) ? $Item->ProductListingDetails->UPC : "");$SKU = (isset($Item->SKU) ? $Item->SKU : "");$this->notificationLog("$NotificationEventName: ItemId=$ItemID; Title=$Title; SKU=$SKU; UPC=$UPC");if ($NotificationEventName == "BidReceived") {$list = shopifyProductAdjust($Title, $SKU, 1);$this->notificationLog($list[1]);if ($list[0] == false) {$this->errorLog($list[1]);}}return "";}public function GetItemTransactions($Timestamp, $Ack, $CorrelationID, $Version, $Build, $NotificationEventName, $SellerName, $BuyerEIASToken, $PaginationResult, $HasMoreItems, $x1, $x2, $x3, $Item, $Transaction) {$ItemID = $Item->ItemID;$Title = $Item->Title;$SKU = (isset($Item->SKU) ? $Item->SKU : "");$Quantity = (isset($Transaction->Transaction->QuantityPurchased) ? $Transaction->Transaction->QuantityPurchased : "1");$this->notificationLog("$NotificationEventName: ItemId=$ItemID; Title=$Title; SKU=$SKU; Quantity=$Quantity");//if ($NotificationEventName == "AuctionCheckoutComplete") {if ($NotificationEventName == "FixedPriceTransaction") {$list = shopifyProductAdjust($Title, $SKU, $Quantity);$this->notificationLog($list[1]);if ($list[0] == false) {$this->errorLog($list[1]);}}return "";}public function GetFeedback($Timestamp, $Ack, $CorrelationID, $Version, $Build, $NotificationEventName, $SellerName, $BuyerEIASToken, $Feedback, $x1, $BuyerScore, $PaginationResult, $x2, $x3) {$ItemID = $Feedback->FeedbackDetail->ItemID;$Type = $Feedback->FeedbackDetail->CommentType;$Role = $Feedback->FeedbackDetail->Role;$Text = $Feedback->FeedbackDetail->CommentText;$this->notificationLog("$Type $Role Feedback for Item $ItemID=$Text");return "";}public function GetMyMessages($Timestamp, $Ack, $CorrelationID, $Version, $Build, $NotificationEventName, $SellerName, $SenderEIASToken, $Message) {$Sender = $Message->Message->Sender;$Recipient = $Message->Message->RecipientUserID;$Subject = $Message->Message->Subject;$this->notificationLog("Message from $Sender to $Recipient regarding $Subject");return "";}public function GetBestOffers($Timestamp, $Ack, $CorrelationID, $Version, $Build, $NotificationEventName, $SellerName, $SenderEIASToken, $BestOffer, $BuyItNow) {$Sender = $BestOffer->BestOffer->Buyer->UserID;$BestOfferAmount = $BestOffer->BestOffer->Price;$Title = $BuyItNow->Title;$OriginalPrice = $BuyItNow->BuyItNowPrice;$ItemID = $BuyItNow->ItemID;$this->notificationLog("$NotificationEventName: $Sender offered $BestOfferAmount (originally $OriginalPrice) for $ItemID ($Title)");return "";}}// Create and configure session$session = new eBaySession($dev, $app, $cert);if ($DEBUG) {error_log(serialize(apache_request_headers()));}#$stdin = $GLOBALS['HTTP_RAW_POST_DATA'];$stdin = file_get_contents("php://input");if ($DEBUG) {error_log("STDIN: " . $stdin);}$action = basename(str_replace('"', '', $_SERVER['HTTP_SOAPACTION']));file_put_contents($capturePath . $action . '.xml', $stdin . "\n\n", FILE_APPEND);if ($DEBUG) {error_log('EVENT NAME: ' . $action);}$server = new SOAPServer(null, array('uri' => 'urn:ebay:apis:eBLBaseComponents'));$server->setClass('eBayPlatformNotificationListener', $session, $DEBUG);$server->handle();?>