[MediaWiki-commits] [Gerrit] mediawiki...DonationInterface[deployment]: Send resultswitcher reloaders to TY page
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/362295 ) Change subject: Send resultswitcher reloaders to TY page .. Send resultswitcher reloaders to TY page This restores some logic we used to have that kept track of processed orders in a key outside of the donor data. TODO: shouldn't globalcollectadapter return true for isReturnProcessingRequired() ? Cherry picked and sanitized of test code for deployment. Bug: T167990 Change-Id: I9d23953e180b85d0d7ae357442760dd5c4d4619c --- M gateway_common/GatewayPage.php M gateway_common/gateway.adapter.php M paypal_gateway/express_checkout/paypal_express.adapter.php 3 files changed, 59 insertions(+), 0 deletions(-) Approvals: jenkins-bot: Verified Ejegg: Looks good to me, approved diff --git a/gateway_common/GatewayPage.php b/gateway_common/GatewayPage.php index 4b1f2ba..1d0d271 100644 --- a/gateway_common/GatewayPage.php +++ b/gateway_common/GatewayPage.php @@ -398,6 +398,17 @@ $this->setHeaders(); + if ( $this->isRepeatReturnProcess() ) { + $this->logger->warning( + 'Donor is trying to process an already-processed payment. ' . + "Adapter Order ID: $oid.\n" . + "Cookies: " . print_r( $_COOKIE, true ) ."\n" . + "User-Agent: " . $_SERVER['HTTP_USER_AGENT'] + ); + $this->displayThankYouPage( 'repeat return processing' ); + return; + } + if ( $deadSession ){ if ( $this->adapter->isReturnProcessingRequired() ) { wfHttpError( 403, 'Forbidden', wfMessage( 'donate_interface-error-http-403' )->text() ); @@ -429,6 +440,7 @@ // feed processDonorReturn all the GET and POST vars $requestValues = $this->getRequest()->getValues(); $result = $this->adapter->processDonorReturn( $requestValues ); + $this->markReturnProcessed(); $this->renderResponse( $result ); return; } else { @@ -567,4 +579,34 @@ ); } } + + protected function isRepeatReturnProcess() { + $request = $this->getRequest(); + $requestProcessId = $this->adapter->getRequestProcessId( + $request->getValues() + ); + $processedRequests = $request->getSessionData( 'processed_requests' ); + if ( !$requestProcessId || empty( $processedRequests ) ) { + return false; + } + return array_key_exists( $requestProcessId, $processedRequests ); + } + + protected function markReturnProcessed() { + $request = $this->getRequest(); + $requestProcessId = $this->adapter->getRequestProcessId( + $request->getValues() + ); + if ( !$requestProcessId ) { + return; + } + $processedRequests = $request->getSessionData( 'processed_requests' ); + if ( !$processedRequests ) { + $processedRequests = array(); + } + // TODO: we could store the results of the last process here, but for now + // we just indicate we did SOMETHING with it + $processedRequests[$requestProcessId] = true; + $request->setSessionData( 'processed_requests', $processedRequests ); + } } diff --git a/gateway_common/gateway.adapter.php b/gateway_common/gateway.adapter.php index f26ffd0..9a25296 100644 --- a/gateway_common/gateway.adapter.php +++ b/gateway_common/gateway.adapter.php @@ -1452,6 +1452,18 @@ } /** +* Gateways which return true from isReturnProcessingRequired must +* override this with logic to get an ID from the request which will +* identify repeated attempts to process the same payment. +* +* @param array $requestValues +* @return int|string Order id +*/ + protected function getRequestProcessId( $requestValues ) { + return null; + } + + /** * Process the API response obtained from the payment processor and set * properties of transaction_response. * Default implementation just says we got a response. @@ -2945,6 +2957,7 @@ 'PaymentForms', 'numAttempt', 'order_status', //for post-payment activities + 'processed_requests', //for post-payment activities
[MediaWiki-commits] [Gerrit] mediawiki...DonationInterface[deployment]: Send resultswitcher reloaders to TY page
Ejegg has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/362295 ) Change subject: Send resultswitcher reloaders to TY page .. Send resultswitcher reloaders to TY page This restores some logic we used to have that kept track of processed orders in a key outside of the donor data. TODO: shouldn't globalcollectadapter return true for isReturnProcessingRequired() ? Cherry picked and sanitized of test code for deployment. Bug: T167990 Change-Id: I9d23953e180b85d0d7ae357442760dd5c4d4619c --- M gateway_common/GatewayPage.php M gateway_common/gateway.adapter.php M paypal_gateway/express_checkout/paypal_express.adapter.php 3 files changed, 59 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/DonationInterface refs/changes/95/362295/1 diff --git a/gateway_common/GatewayPage.php b/gateway_common/GatewayPage.php index 4b1f2ba..1d0d271 100644 --- a/gateway_common/GatewayPage.php +++ b/gateway_common/GatewayPage.php @@ -398,6 +398,17 @@ $this->setHeaders(); + if ( $this->isRepeatReturnProcess() ) { + $this->logger->warning( + 'Donor is trying to process an already-processed payment. ' . + "Adapter Order ID: $oid.\n" . + "Cookies: " . print_r( $_COOKIE, true ) ."\n" . + "User-Agent: " . $_SERVER['HTTP_USER_AGENT'] + ); + $this->displayThankYouPage( 'repeat return processing' ); + return; + } + if ( $deadSession ){ if ( $this->adapter->isReturnProcessingRequired() ) { wfHttpError( 403, 'Forbidden', wfMessage( 'donate_interface-error-http-403' )->text() ); @@ -429,6 +440,7 @@ // feed processDonorReturn all the GET and POST vars $requestValues = $this->getRequest()->getValues(); $result = $this->adapter->processDonorReturn( $requestValues ); + $this->markReturnProcessed(); $this->renderResponse( $result ); return; } else { @@ -567,4 +579,34 @@ ); } } + + protected function isRepeatReturnProcess() { + $request = $this->getRequest(); + $requestProcessId = $this->adapter->getRequestProcessId( + $request->getValues() + ); + $processedRequests = $request->getSessionData( 'processed_requests' ); + if ( !$requestProcessId || empty( $processedRequests ) ) { + return false; + } + return array_key_exists( $requestProcessId, $processedRequests ); + } + + protected function markReturnProcessed() { + $request = $this->getRequest(); + $requestProcessId = $this->adapter->getRequestProcessId( + $request->getValues() + ); + if ( !$requestProcessId ) { + return; + } + $processedRequests = $request->getSessionData( 'processed_requests' ); + if ( !$processedRequests ) { + $processedRequests = array(); + } + // TODO: we could store the results of the last process here, but for now + // we just indicate we did SOMETHING with it + $processedRequests[$requestProcessId] = true; + $request->setSessionData( 'processed_requests', $processedRequests ); + } } diff --git a/gateway_common/gateway.adapter.php b/gateway_common/gateway.adapter.php index f26ffd0..9a25296 100644 --- a/gateway_common/gateway.adapter.php +++ b/gateway_common/gateway.adapter.php @@ -1452,6 +1452,18 @@ } /** +* Gateways which return true from isReturnProcessingRequired must +* override this with logic to get an ID from the request which will +* identify repeated attempts to process the same payment. +* +* @param array $requestValues +* @return int|string Order id +*/ + protected function getRequestProcessId( $requestValues ) { + return null; + } + + /** * Process the API response obtained from the payment processor and set * properties of transaction_response. * Default implementation just says we got a response. @@ -2945,6 +2957,7 @@ 'PaymentForms', 'numAttempt', 'order_status', //for post-payment activities + 'processed_requests', //for post-payment activ