jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/350960 )

Change subject: Paypal EC: send donor back to PP on code 10486
......................................................................


Paypal EC: send donor back to PP on code 10486

It's a code that means "their first funding source didn't work, but
they might have another"

Bug: T163458
Change-Id: Ia61b118b968284a2c0e377d3b79dc9ee412646fa
---
M paypal_gateway/express_checkout/paypal_express.adapter.php
M tests/phpunit/Adapter/PayPal/PayPalExpressTest.php
M tests/phpunit/TestConfiguration.php
A 
tests/phpunit/includes/Responses/paypal_ec/DoExpressCheckoutPayment_10486.testresponse
A 
tests/phpunit/includes/Responses/paypal_ec/GetExpressCheckoutDetails_10486.testresponse
5 files changed, 85 insertions(+), 5 deletions(-)

Approvals:
  XenoRyet: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/paypal_gateway/express_checkout/paypal_express.adapter.php 
b/paypal_gateway/express_checkout/paypal_express.adapter.php
index 4fee2d4..56e44d1 100644
--- a/paypal_gateway/express_checkout/paypal_express.adapter.php
+++ b/paypal_gateway/express_checkout/paypal_express.adapter.php
@@ -466,13 +466,51 @@
                                ) );
                        }
                } catch ( Exception $ex ) {
-                       // TODO: Parse the API error fields and log them.
-                       $this->logger->error( "Failure detected in " . 
json_encode( $response ) );
-                       $this->finalizeInternalStatus( FinalStatus::FAILED );
-                       throw $ex;
+                       $errors = $this->parseResponseErrors( $response );
+                       $fatal = true;
+                       // TODO: Handle more error codes
+                       foreach ( $errors as $code => $error ) {
+                               // There are errors, so it wasn't a total comms 
failure
+                               
$this->transaction_response->setCommunicationStatus( true );
+                               $this->logger->warning(
+                                       "Error code $code returned: 
'{$error['debugInfo']}'"
+                               );
+                               switch ( $code ) {
+                                       case '10486':
+                                               // Donor's first funding method 
failed, but they might have another
+                                               
$this->transaction_response->setRedirect(
+                                                       
$this->account_config['RedirectURL'] . $response['TOKEN']
+                                               );
+                                               $fatal = false;
+                                               break;
+                                       default:
+                                               
$this->transaction_response->addError( $code, $error );
+                               }
+                       }
+                       if ( $fatal ) {
+                               if ( empty( $errors ) ) {
+                                       // Unrecognizable problems, log the 
whole thing
+                                       $this->logger->error( "Failure detected 
in " . json_encode( $response ) );
+                               }
+                               $this->finalizeInternalStatus( 
FinalStatus::FAILED );
+                               throw $ex;
+                       }
                }
        }
 
+       protected function parseResponseErrors( $response ) {
+               $errors = array();
+               // TODO: can they put errors in other places too?
+               if ( isset( $response['L_ERRORCODE0'] ) ) {
+                       $errors[$response['L_ERRORCODE0']] = array(
+                               'logLevel' => LogLevel::ERROR,
+                               'message' => '',
+                               'debugInfo' => isset( 
$response['L_LONGMESSAGE0'] ) ? $response['L_LONGMESSAGE0'] : '',
+                       );
+               }
+               return $errors;
+       }
+
        public function processDonorReturn( $requestValues ) {
                $this->addRequestData( array(
                        'ec_token' => $requestValues['token'],
diff --git a/tests/phpunit/Adapter/PayPal/PayPalExpressTest.php 
b/tests/phpunit/Adapter/PayPal/PayPalExpressTest.php
index 4c655c9..c062a14 100644
--- a/tests/phpunit/Adapter/PayPal/PayPalExpressTest.php
+++ b/tests/phpunit/Adapter/PayPal/PayPalExpressTest.php
@@ -88,7 +88,6 @@
                );
        }
 
-
        public function testProcessDonorReturnRecurring() {
                $init = $this->getDonorTestData( 'US' );
                $init['contribution_tracking_id'] = '45931210';
@@ -137,4 +136,29 @@
                        'Sending extra messages to complete queue!'
                );
        }
+
+       /**
+        * Check that we send the donor back to paypal to try a different source
+        */
+       function testProcessDonorReturnPaymentRetry() {
+               $init = $this->getDonorTestData( 'US' );
+               $init['contribution_tracking_id'] = '45931210';
+
+               $gateway = $this->getFreshGatewayObject( $init );
+               $gateway->setDummyGatewayResponseCode( '10486' );
+               $result = $gateway->processDonorReturn( array(
+                       'token' => 'EC%2d2D123456D9876543U',
+                       'PayerID' => 'ASDASD'
+               ) );
+
+               $message = DonationQueue::instance()->pop( 'complete' );
+               $this->assertNull( $message, 'Should not queue a message' );
+               $this->assertFalse( $result->isFailed() );
+               $redirect = $result->getRedirect();
+               $this->assertEquals(
+                       
'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-2D123456D9876543U',
+                       $redirect
+               );
+       }
+
 }
diff --git a/tests/phpunit/TestConfiguration.php 
b/tests/phpunit/TestConfiguration.php
index 92fe8e9..88695f6 100644
--- a/tests/phpunit/TestConfiguration.php
+++ b/tests/phpunit/TestConfiguration.php
@@ -60,6 +60,10 @@
        $wgGlobalCollectGatewayAccountInfo,
        $wgPaypalGatewayAccountInfo,
        $wgPaypalGatewayReturnURL,
+       $wgPaypalExpressGatewayURL,
+       $wgPaypalExpressGatewayTestingURL,
+       $wgPaypalExpressGatewaySignatureURL,
+       $wgPaypalExpressGatewayAccountInfo,
        $wgAmazonGatewayReturnURL,
        $wgAmazonGatewayAccountInfo,
        $wgAdyenGatewayURL,
@@ -109,6 +113,18 @@
 $wgPaypalGatewayReturnURL = 'http://donate.wikimedia.org'; // whatever, 
doesn't matter.
 
 
+/** Paypal Express Checkout **/
+$wgPaypalExpressGatewayURL = 'https://api-3t.sandbox.paypal.com/nvp';
+$wgPaypalExpressGatewayTestingURL = 'https://api-3t.sandbox.paypal.com/nvp';
+$wgPaypalExpressGatewaySignatureURL = $wgPaypalExpressGatewayURL;
+$wgPaypalExpressGatewayAccountInfo['test'] = array(
+    'User' => '[email protected]',
+    'Password' => '9876543210',
+    'Signature' => 'ABCDEFGHIJKLMNOPQRSTUV-ZXCVBNMLKJHGFDSAPOIUYTREWQ',
+    'RedirectURL' => 
'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=',
+);
+
+
 /** Amazon **/
 $wgAmazonGatewayReturnURL = 
'https://payments.wikimedia.org/index.php/Special:AmazonGateway';
 $wgAmazonGatewayAccountInfo = array();
diff --git 
a/tests/phpunit/includes/Responses/paypal_ec/DoExpressCheckoutPayment_10486.testresponse
 
b/tests/phpunit/includes/Responses/paypal_ec/DoExpressCheckoutPayment_10486.testresponse
new file mode 100644
index 0000000..7eab458
--- /dev/null
+++ 
b/tests/phpunit/includes/Responses/paypal_ec/DoExpressCheckoutPayment_10486.testresponse
@@ -0,0 +1 @@
+TOKEN=EC%2d2D123456D9876543U&SUCCESSPAGEREDIRECTREQUESTED=false&TIMESTAMP=2017%2d04%2d20T16%3a59%3a06Z&CORRELATIONID=537ffff0fefa&ACK=Failure&VERSION=204&BUILD=32574509&L_ERRORCODE0=10486&L_SHORTMESSAGE0=This%20transaction%20couldn%27t%20be%20completed%2e&L_LONGMESSAGE0=This%20transaction%20couldn%27t%20be%20completed%2e%20Please%20redirect%20your%20customer%20to%20PayPal%2e&L_SEVERITYCODE0=Error
diff --git 
a/tests/phpunit/includes/Responses/paypal_ec/GetExpressCheckoutDetails_10486.testresponse
 
b/tests/phpunit/includes/Responses/paypal_ec/GetExpressCheckoutDetails_10486.testresponse
new file mode 100644
index 0000000..f945850
--- /dev/null
+++ 
b/tests/phpunit/includes/Responses/paypal_ec/GetExpressCheckoutDetails_10486.testresponse
@@ -0,0 +1 @@
+TOKEN=EC%2d2D123456D9876543U&BILLINGAGREEMENTACCEPTEDSTATUS=0&CHECKOUTSTATUS=PaymentActionNotInitiated&TIMESTAMP=2017%2d02%2d01T20%3a07%3a14Z&CORRELATIONID=d70c9a334455e&ACK=Success&VERSION=204&BUILD=28806785&EMAIL=donor%40generous%2enet&PAYERID=8R297FE87CD8S&PAYERSTATUS=unverified&FIRSTNAME=Fezziwig&LASTNAME=Fowl&COUNTRYCODE=US&BILLINGNAME=Fezziwig%20Fowl&STREET=123%20Notta%20Way&CITY=Whoville&STATE=OR&ZIP=97211&COUNTRY=US&COUNTRYNAME=United%20States&ADDRESSID=PayPal&ADDRESSSTATUS=Confirmed&CURRENCYCODE=USD&AMT=1%2e55&ITEMAMT=1%2e55&SHIPPINGAMT=0&HANDLINGAMT=0&TAXAMT=0&CUSTOM=45931210&DESC=Donation%20to%20the%20Wikimedia%20Foundation&INVNUM=45931210%2e0&NOTIFYURL=http%3a%2f%2ffundraising%2ewikimedia%2eorg%2fIPNListener_Standalone%2ephp&INSURANCEAMT=0&SHIPDISCAMT=0&INSURANCEOPTIONOFFERED=false&L_QTY0=1&L_TAXAMT0=0&L_AMT0=1%2e55&L_DESC0=Donation%20to%20the%20Wikimedia%20Foundation&PAYMENTREQUEST_0_CURRENCYCODE=USD&PAYMENTREQUEST_0_AMT=1%2e55&PAYMENTREQUEST_0_ITEMAMT=1%2e55&PAYMENTREQUEST_0_SHIPPINGAMT=0&PAYMENTREQUEST_0_HANDLINGAMT=0&PAYMENTREQUEST_0_TAXAMT=0&PAYMENTREQUEST_0_CUSTOM=45931210&PAYMENTREQUEST_0_DESC=Donation%20to%20the%20Wikimedia%20Foundation&PAYMENTREQUEST_0_INVNUM=45931210%2e0&PAYMENTREQUEST_0_NOTIFYURL=http%3a%2f%2ffundraising%2ewikimedia%2eorg%2fIPNListener_Standalone%2ephp&PAYMENTREQUEST_0_INSURANCEAMT=0&PAYMENTREQUEST_0_SHIPDISCAMT=0&PAYMENTREQUEST_0_SELLERPAYPALACCOUNTID=receiver%40wikimedia%2eorg&PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED=false&PAYMENTREQUEST_0_ADDRESSSTATUS=Confirmed&L_PAYMENTREQUEST_0_QTY0=1&L_PAYMENTREQUEST_0_TAXAMT0=0&L_PAYMENTREQUEST_0_AMT0=1%2e55&L_PAYMENTREQUEST_0_DESC0=Donation%20to%20the%20Wikimedia%20Foundation&PAYMENTREQUESTINFO_0_ERRORCODE=0

-- 
To view, visit https://gerrit.wikimedia.org/r/350960
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ia61b118b968284a2c0e377d3b79dc9ee412646fa
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/DonationInterface
Gerrit-Branch: master
Gerrit-Owner: Ejegg <[email protected]>
Gerrit-Reviewer: XenoRyet <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to