X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FPayment%2FPayPalIPN.php;h=6f600ccd1dbb84bb83815db053dcc0d6d4dc4757;hb=fedc226fd832ceb9d5d026364de3d35dcc4e18fb;hp=d63203a1553d7e3a27e7cb40a3a3ff8bb47616bc;hpb=036b1d1bf92528535670afb178d765f9715398d1;p=civicrm-core.git diff --git a/CRM/Core/Payment/PayPalIPN.php b/CRM/Core/Payment/PayPalIPN.php index d63203a155..6f600ccd1d 100644 --- a/CRM/Core/Payment/PayPalIPN.php +++ b/CRM/Core/Payment/PayPalIPN.php @@ -206,9 +206,11 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN { return; } - $this->single($input, $ids, $objects, - TRUE, $first - ); + $this->single($input, [ + 'related_contact' => $ids['related_contact'] ?? NULL, + 'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL, + 'contributionRecur' => !empty($objects['contributionRecur']) ? $objects['contributionRecur']->id : NULL, + ], $objects, TRUE); } /** @@ -216,25 +218,19 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN { * @param array $ids * @param array $objects * @param bool $recur - * @param bool $first * * @return void * @throws \CRM_Core_Exception * @throws \CiviCRM_API3_Exception */ - public function single($input, $ids, $objects, $recur = FALSE, $first = FALSE) { + public function single($input, $ids, $objects, $recur = FALSE) { $contribution = &$objects['contribution']; // make sure the invoice is valid and matches what we have in the contribution record - if ((!$recur) || ($recur && $first)) { - if ($contribution->invoice_id != $input['invoice']) { - Civi::log()->debug('PayPalIPN: Invoice values dont match between database and IPN request. (ID: ' . $contribution->id . ').'); - echo "Failure: Invoice values dont match between database and IPN request

"; - return; - } - } - else { - $contribution->invoice_id = md5(uniqid(rand(), TRUE)); + if ($contribution->invoice_id != $input['invoice']) { + Civi::log()->debug('PayPalIPN: Invoice values dont match between database and IPN request. (ID: ' . $contribution->id . ').'); + echo "Failure: Invoice values dont match between database and IPN request

"; + return; } if (!$recur) { @@ -248,24 +244,6 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN { $contribution->total_amount = $input['amount']; } - $status = $input['paymentStatus']; - if ($status === 'Denied' || $status === 'Failed' || $status === 'Voided') { - $this->failed($objects); - return; - } - if ($status === 'Pending') { - Civi::log()->debug('Returning since contribution status is Pending'); - return; - } - elseif ($status === 'Refunded' || $status === 'Reversed') { - $this->cancelled($objects); - return; - } - elseif ($status !== 'Completed') { - Civi::log()->debug('Returning since contribution status is not handled'); - return; - } - // check if contribution is already completed, if so we ignore this ipn $completedStatusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed'); if ($contribution->contribution_status_id == $completedStatusId) { @@ -274,11 +252,7 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN { return; } - CRM_Contribute_BAO_Contribution::completeOrder($input, [ - 'related_contact' => $ids['related_contact'] ?? NULL, - 'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL, - 'contributionRecur' => !empty($objects['contributionRecur']) ? $objects['contributionRecur']->id : NULL, - ], $objects); + CRM_Contribute_BAO_Contribution::completeOrder($input, $ids, $objects['contribution']); } /** @@ -353,6 +327,8 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN { return; } + $input['payment_processor_id'] = $paymentProcessorID; + self::$_paymentProcessor = &$objects['paymentProcessor']; if ($component == 'contribute') { if ($ids['contributionRecur']) { @@ -366,7 +342,28 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN { return; } } - $this->single($input, $ids, $objects); + $status = $input['paymentStatus']; + if ($status === 'Denied' || $status === 'Failed' || $status === 'Voided') { + $this->failed($objects); + return; + } + if ($status === 'Pending') { + Civi::log()->debug('Returning since contribution status is Pending'); + return; + } + if ($status === 'Refunded' || $status === 'Reversed') { + $this->cancelled($objects); + return; + } + if ($status !== 'Completed') { + Civi::log()->debug('Returning since contribution status is not handled'); + return; + } + $this->single($input, [ + 'related_contact' => $ids['related_contact'] ?? NULL, + 'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL, + 'contributionRecur' => !empty($objects['contributionRecur']) ? $objects['contributionRecur']->id : NULL, + ], $objects); } catch (CRM_Core_Exception $e) { Civi::log()->debug($e->getMessage());