X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FPayment%2FBaseIPN.php;h=9ebe28db8d300727195f90fb0f788b9274e0b556;hb=bc660ddf92b7c403c26c32b452c5214fdc78ef12;hp=706e528acfcb66047cb5a03785eed6b1e1b6cbf3;hpb=d1ae16d11c8eaf40d7489f4a2d4605ef2f7c607c;p=civicrm-core.git diff --git a/CRM/Core/Payment/BaseIPN.php b/CRM/Core/Payment/BaseIPN.php index 706e528acf..9ebe28db8d 100644 --- a/CRM/Core/Payment/BaseIPN.php +++ b/CRM/Core/Payment/BaseIPN.php @@ -87,15 +87,7 @@ class CRM_Core_Payment_BaseIPN { */ public function validateData(&$input, &$ids, &$objects, $required = TRUE, $paymentProcessorID = NULL) { - // make sure contact exists and is valid - $contact = new CRM_Contact_BAO_Contact(); - $contact->id = $ids['contact']; - if (!$contact->find(TRUE)) { - CRM_Core_Error::debug_log_message("Could not find contact record: {$ids['contact']} in IPN request: " . print_r($input, TRUE)); - echo "Failure: Could not find contact record: {$ids['contact']}

"; - return FALSE; - } - + // Check if the contribution exists // make sure contribution exists and is valid $contribution = new CRM_Contribute_BAO_Contribution(); $contribution->id = $ids['contribution']; @@ -104,6 +96,29 @@ class CRM_Core_Payment_BaseIPN { echo "Failure: Could not find contribution record for {$contribution->id}

"; return FALSE; } + + // make sure contact exists and is valid + // use the contact id from the contribution record as the id in the IPN may not be valid anymore. + $contact = new CRM_Contact_BAO_Contact(); + $contact->id = $contribution->contact_id; + $contact->find(TRUE); + if ($contact->id != $ids['contact']) { + // If the ids do not match then it is possible the contact id in the IPN has been merged into another contact which is why we use the contact_id from the contribution + CRM_Core_Error::debug_log_message("Contact ID in IPN {$ids['contact']} not found but contact_id found in contribution {$contribution->contact_id} used instead"); + echo "WARNING: Could not find contact record: {$ids['contact']}

"; + $ids['contact'] = $contribution->contact_id; + } + + if (!empty($ids['contributionRecur'])) { + $contributionRecur = new CRM_Contribute_BAO_ContributionRecur(); + $contributionRecur->id = $ids['contributionRecur']; + if (!$contributionRecur->find(TRUE)) { + CRM_Core_Error::debug_log_message("Could not find contribution recur record: {$ids['ContributionRecur']} in IPN request: " . print_r($input, TRUE)); + echo "Failure: Could not find contribution recur record: {$ids['ContributionRecur']}

"; + return FALSE; + } + } + $contribution->receive_date = CRM_Utils_Date::isoToMysql($contribution->receive_date); $contribution->receipt_date = CRM_Utils_Date::isoToMysql($contribution->receipt_date); @@ -457,15 +472,14 @@ class CRM_Core_Payment_BaseIPN { * @param array $ids * @param array $objects * @param CRM_Core_Transaction $transaction - * @param bool $recur * * @throws \CRM_Core_Exception * @throws \CiviCRM_API3_Exception */ - public function completeTransaction(&$input, &$ids, &$objects, &$transaction, $recur = FALSE) { + public function completeTransaction(&$input, &$ids, &$objects, &$transaction) { $contribution = &$objects['contribution']; - CRM_Contribute_BAO_Contribution::completeOrder($input, $ids, $objects, $transaction, $recur, $contribution); + CRM_Contribute_BAO_Contribution::completeOrder($input, $ids, $objects, $transaction, $contribution); } /**